[STM32F7] W5300调试UDP通信时,发送数据正常,接收数据丢失最高位

[复制链接]
 楼主| chenwang1996 发表于 2020-9-27 15:13 | 显示全部楼层 |阅读模式
W5300调试UDP通信时,发送数据正常,接收数据丢失最高位。STM32F767芯片接W5300,另一端接PC网络调试助手。采用8位数据模式。STM32发送0XFF或0XAA,PC网络调试助手能收到0XFF或0XAA,但是网络调试助手发送0XFF或0XAA,STM32从W5300的Sn_RX_FIFOR读出来是0X7F或0X2A。STM32程序如下:
  1. void LCD_Init(void)
  2. {           
  3.     GPIO_InitTypeDef GPIO_Initure;
  4.         FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
  5.     FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;


  6.     LCD_MPU_Config();                       //ʹÄÜMPU±£»¤LCDÇøÓò
  7.     SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;      
  8.     SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;      
  9.    
  10.     SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK3;     //ʹÓÃNE1
  11.     SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //²»¸´ÓÃÊý¾ÝÏß
  12.     SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;   //SRAM
  13.     SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_8; //16λÊý¾Ý¿í¶È
  14.     SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //ÊÇ·ñʹÄÜÍ»·¢·ÃÎÊ,½ö¶Ôͬ²½Í»·¢´æ´¢Æ÷ÓÐЧ,´Ë´¦Î´Óõ½
  15.     SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//µÈ´ýÐźŵļ«ÐÔ,½öÔÚÍ»·¢Ä£Ê½·ÃÎÊÏÂÓÐÓÃ
  16.     SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_DURING_WS;//FMC_WAIT_TIMING_BEFORE_WS;   //´æ´¢Æ÷ÊÇÔڵȴýÖÜÆÚ֮ǰµÄÒ»¸öʱÖÓÖÜÆÚ»¹ÊǵȴýÖÜÆÚÆÚ¼äʹÄÜNWAIT
  17.     SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //´æ´¢Æ÷дʹÄÜ
  18.     SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;           //µÈ´ýʹÄÜλ,´Ë´¦Î´Óõ½
  19.     SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //¶ÁдʹÓò»Í¬µÄʱÐò
  20.     SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//ÊÇ·ñʹÄÜͬ²½´«ÊäģʽϵĵȴýÐźÅ,´Ë´¦Î´Óõ½
  21.     SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //½ûֹͻ·¢Ð´
  22.     SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;

  23. //          FSMC_ReadWriteTim.AddressSetupTime=0x15;    //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ17¸öHCLK 1/216M=4.6ns*17=78ns//01
  24. //    FSMC_ReadWriteTim.AddressHoldTime=0x01;
  25. //    FSMC_ReadWriteTim.DataSetupTime=0x15;       //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ85¸öHCLK        =4.6*85=391ns
  26.           FSMC_ReadWriteTim.AddressSetupTime=0x15;    //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ17¸öHCLK 1/216M=4.6ns*17=78ns//01
  27.     FSMC_ReadWriteTim.AddressHoldTime=0x01;
  28.     FSMC_ReadWriteTim.DataSetupTime=0x15;       //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ85¸öHCLK        =4.6*85=391ns
  29. //         FSMC_ReadWriteTim.BusTurnAroundDuration = 0;
  30. //          FSMC_ReadWriteTim.CLKDivision = 0;
  31. //          FSMC_ReadWriteTim.DataLatency = 0;
  32.        
  33.     FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_B; //ģʽA
  34.     //FSMCдʱÐò¿ØÖƼĴæÆ÷
  35.     FSMC_WriteTim.AddressSetupTime=0x15;        //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ21¸öHCLK=96ns
  36.     FSMC_WriteTim.AddressHoldTime=0x00;
  37.     FSMC_WriteTim.DataSetupTime=0x55;           //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ4.6ns*21¸öHCLK=96ns//10
  38.     FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //ģʽA
  39.         HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);       
  40.         delay_ms(50); // delay 50 ms
  41. }  
  42. void W5300_Config(void)
  43. {
  44.         unsigned char *ptr;
  45. //        unsigned char *ptr;
  46.    HAL_GPIO_WritePin(GPIOB,W5300_RST,GPIO_PIN_SET);        //PB1ÖÃ0
  47.         //GPIO_SetBits(GPIOE, W5300_RST);
  48.         /* Wait Ethernet Link */
  49.         //while(HAL_GPIO_ReadPin(GPIOG, L_LINK)==1);
  50.   delay_ms(10); // delay 50 ms
  51. /*        ptr=(unsigned char*)MR;
  52.         ip=*ptr;
  53.         */
  54.         UDP_OK=0;
  55.         ptr=(unsigned char*)MR1;
  56.         *ptr=0x80;
  57.          delay_ms(15);

  58.         ptr=(unsigned char*)MR1;
  59.         *ptr=0x00;
  60.         ptr=(unsigned char*)MR;
  61.         *ptr=0x38;
  62. //         delay_ms(10);
  63. //        ptr=(unsigned char*)MR1;
  64. //        ip=*ptr;
  65.   delay_ms(10);
  66. //ÅäÖÃÖжÏ
  67.         ptr=(unsigned char*)IR;
  68.         *ptr=0x00;
  69.         ptr=(unsigned char*)IR1;
  70.         *ptr=0x00;
  71.         /* Set Gateway address as "192.168.0.1" */
  72.         ptr=(unsigned char*)GAR;                                                /* Set Gateway IP */
  73.   *ptr=0xc0;
  74.         ptr=(unsigned char*)GAR1;                                                /* #define GAR2            (GAR + 2)      Set Gateway IP */
  75.         *ptr=0xa8;
  76.         ptr=(unsigned char*)GAR2;                                                /* Set Gateway IP */
  77.   *ptr=0x01;
  78.         ptr=(unsigned char*)GAR3;                                                /* #define GAR2            (GAR + 2)      Set Gateway IP */
  79.         *ptr=0x01;

  80.         /* Set IP address as "192.168.0.20" */
  81.         ptr=(unsigned char*)SIPR;
  82.         *ptr=0xc0;
  83.         ptr=(unsigned char*)SIPR1;
  84.         *ptr=0xa8;
  85.         ptr=(unsigned char*)SIPR2;
  86.         *ptr=0x01;
  87.         ptr=(unsigned char*)SIPR3;
  88.         *ptr=0x14;
  89.         /* Set Subnet mask as "255.255.255.0" */
  90.         ptr=(unsigned char*)SUBR;
  91.         /**ptr++=0xffff;
  92.         *ptr=0xff00;
  93.         */
  94.         *ptr=0xFF;
  95.         ptr=(unsigned char*)SUBR1;
  96.         *ptr=0xff;
  97.         ptr=(unsigned char*)SUBR2;
  98.         *ptr=0xff;
  99.         ptr=(unsigned char*)SUBR3;
  100.         *ptr=0x00;
  101.         ptr=(unsigned char*)SUBR2;                                                /* Set Gateway IP */
  102.         ip=*ptr;
  103.         delay_ms(15);
  104.         /* Set MAC address as "48 53 00 31 30 33"*/
  105.         ptr=(unsigned char*)SHAR;
  106.         *ptr=0x00;
  107.         ptr=(unsigned char*)SHAR1;
  108.         *ptr=0x08;
  109.         ptr=(unsigned char*)SHAR2;
  110.         *ptr=0xDC;
  111.         ptr=(unsigned char*)SHAR3;
  112.         *ptr=0x01;
  113.         ptr=(unsigned char*)SHAR4;
  114.         *ptr=0x02;
  115.         ptr=(unsigned char*)SHAR4;
  116.         *ptr=0x03;
  117.         //ÉèÖÃÄÚ´æ´óС
  118.                 ptr=(unsigned char*)TMS01R;
  119.          *ptr=0x04;
  120.          ptr=(unsigned char*)TMSR1;
  121.          *ptr=0x10;
  122.           ptr=(unsigned char*)TMSR2;
  123.          *ptr=0x01;
  124.           ptr=(unsigned char*)TMSR3;
  125.          *ptr=0x14;
  126.           ptr=(unsigned char*)TMSR4;
  127.          *ptr=0x00;
  128.           ptr=(unsigned char*)TMSR5;
  129.          *ptr=0x07;
  130.           ptr=(unsigned char*)TMSR6;
  131.          *ptr=0x0c;
  132.           ptr=(unsigned char*)TMSR7;
  133.          *ptr=0x0c;
  134.          //
  135.           ptr=(unsigned char*)RMS01R;
  136.          *ptr=0x11;
  137.                  ptr=(unsigned char*)RMSR1;
  138.          *ptr=0x03;
  139.                  ptr=(unsigned char*)RMSR2;
  140.          *ptr=0x05;
  141.                  ptr=(unsigned char*)RMSR3;
  142.          *ptr=0x10;
  143.                  ptr=(unsigned char*)RMSR4;
  144.          *ptr=0x03;
  145.                  ptr=(unsigned char*)RMSR5;
  146.          *ptr=0x04;
  147.                  ptr=(unsigned char*)RMSR6;
  148.          *ptr=0x04;
  149.                  ptr=(unsigned char*)RMSR7;
  150.          *ptr=0x04;
  151.         //ÉèÖÃÄÚ´æ
  152.          ptr=(unsigned char*)MTYPER0;
  153.         *ptr=0x01;
  154.          ptr=(unsigned char*)MTYPER1;
  155.         *ptr=0xff;
  156.         /* Set interrupt mask */
  157.                 ptr=(unsigned char*)IMR;
  158.         *ptr=IR_CONFLICT;
  159.         ptr=(unsigned char*)IMR1;
  160.         *ptr=0x01;
  161.          delay_ms(10); // delay 50 ms
  162.                  ptr=(unsigned char*)IMR1;                                       
  163.      ip=*ptr;
  164.                   delay_ms(10); // delay 50 ms
  165. }

  166. unsigned int Socket0_UDP(void)
  167. {
  168.         unsigned char *ptr;
  169.         unsigned char i;

  170.         /* Set Socket Port Number as 5000*/
  171. /*        ptr=(unsigned short*)Sn_PORTR(0);
  172.         *ptr=5000;*/
  173.         ptr=(unsigned char*)Sn_PORTR(0);
  174.   *ptr=0x13;
  175.         ptr=(unsigned char*)Sn_PORTR1(0);
  176.         *ptr=0x88;//0x1388
  177.         /* Set Destination IP  as "192.168.0.30" */

  178.         ptr=(unsigned char*)Sn_DIPR(0);
  179.   *ptr=0xc0;
  180.         ptr=(unsigned char*)Sn_DIPR1(0);
  181.         *ptr=0xA8;
  182.         ptr=(unsigned char*)Sn_DIPR2(0);
  183.         *ptr=0x01;
  184.         ptr=(unsigned char*)Sn_DIPR3(0);
  185.         *ptr=0x16;
  186.        
  187.        
  188.         //ÎïÀíµØÖ·
  189.                 ptr=(unsigned char*)Sn_DHAR(0);
  190.         *ptr=0x28;
  191.         ptr=(unsigned char*)Sn_DHAR1(0);
  192.         *ptr=0xd2;
  193.         ptr=(unsigned char*)Sn_DHAR2(0);
  194.         *ptr=0x44;
  195.         ptr=(unsigned char*)Sn_DHAR3(0);
  196.         *ptr=0x3e;
  197.         ptr=(unsigned char*)Sn_DHAR4(0);
  198.         *ptr=0x77;
  199.         ptr=(unsigned char*)Sn_DHAR5(0);
  200.         *ptr=0x3a;
  201.        
  202.        
  203.        
  204.         /* Set Destination Port number as 5000 */
  205.         /*ptr=(unsigned short*)Sn_DPORTR(0);
  206.         *ptr=5000;*/
  207.         ptr=(unsigned char*)Sn_DPORTR(0);
  208.   *ptr=0x13;
  209.         ptr=(unsigned char*)Sn_DPORTR(0);
  210.         *ptr=0x88;//0x1388
  211.    ptr=(unsigned char*)Sn_MSSR(0);
  212.         *ptr=0x05;
  213.          ptr=(unsigned char*)Sn_MSSR1(0);
  214.         *ptr=0xb4;//0x5b4
  215.         /* Set Socket0 in UDP mode */
  216.         ptr=(unsigned char*)Sn_MR1(0);
  217.         *ptr=0x02;//

  218. //                ptr=(unsigned char*)Sn_CR1(0);
  219. //                *ptr=Sn_CR_CLOSE;
  220. //        delay_ms(10);
  221.         /* Open Socket0 */
  222.         ptr=(unsigned char*)Sn_CR1(0);
  223.         *ptr=Sn_CR_OPEN;
  224.        
  225.         delay_ms(10);
  226.         ptr=(unsigned char*)Sn_SSR1(0);
  227.         i=*ptr;
  228.         ip=i;
  229.         if((i&0xff)!=SOCK_UDP)                /* If failed to open Socket0, close Socket0 and reurn false */
  230.         {
  231.                 ptr=(unsigned char*)Sn_CR1(0);
  232.                 *ptr=Sn_CR_CLOSE;
  233.                 delay_ms(10);
  234.                 return FALSE;
  235.         }
  236.         S0_SendOK=1;
  237.         //GPIO_ResetBits(GPIOF, D_OUTPUT2);                /* If UDP Ready, light LED2*/
  238.         return TRUE;
  239. }

  240. /* Read data from RX buffer and dump them to S_buffer */
  241. unsigned char S0_udprx_process(void)
  242. {
  243.         unsigned char*ptr;
  244.         unsigned short rx_size;
  245.         unsigned int i,j;


  246.         ptr=(unsigned char*)Sn_RX_RSR0(0);
  247.         ip=*ptr;
  248.         ptr=(unsigned char*)Sn_RX_RSR1(0);
  249.         ip=*ptr;
  250.         ptr=(unsigned char*)Sn_RX_RSR2(0);
  251.         ip=*ptr;
  252.         ptr=(unsigned char*)Sn_RX_RSR3(0);
  253.         ip=*ptr;
  254. //ip=rx_size;
  255.                  delay_us(10);
  256.         if(ip==0)                
  257.                 return 0;
  258. //ip
  259.         ptr=(unsigned char*)Sn_RX_FIFOR(0);
  260.         IP_Buffer[0]=*ptr;
  261.         ptr=(unsigned char*)Sn_RX_FIFOR1(0);
  262.         IP_Buffer[1]=*ptr;
  263.          delay_us(30);
  264. //        rx_size=S_Buffer[0]<<8+S_Buffer[1];
  265.         ptr=(unsigned char*)Sn_RX_FIFOR(0);
  266.         IP_Buffer[2]=*ptr;
  267.         ptr=(unsigned char*)Sn_RX_FIFOR1(0);
  268.         IP_Buffer[3]=*ptr;
  269.          delay_us(30);
  270.         //¶Ë¿Ú
  271.         ptr=(unsigned char*)Sn_RX_FIFOR(0);
  272.         IP_Buffer[4]=*ptr;
  273.         ptr=(unsigned char*)Sn_RX_FIFOR1(0);
  274.         IP_Buffer[5]=*ptr;
  275.          delay_us(30);
  276.   //Êý¾Ý
  277.                 ptr=(unsigned char*)Sn_RX_FIFOR(0);
  278.         IP_Buffer[6]=*ptr;
  279.         ptr=(unsigned char*)Sn_RX_FIFOR1(0);
  280.         IP_Buffer[7]=*ptr;
  281.          delay_us(30);
  282.          //Êý¾Ý´¦Àí
  283.         i=(IP_Buffer[6]<<8)+IP_Buffer[7];
  284.         if(i%2!=0) i++;
  285.         //i=i/2;
  286.   for(j=0;j<i;j++)
  287.         {
  288.         ptr=(unsigned char*)Sn_RX_FIFOR(0);
  289.         R_Buffer[j]=*ptr;
  290.                 j++;
  291.         ptr=(unsigned char*)Sn_RX_FIFOR1(0);
  292.         R_Buffer[j]=*ptr;
  293.          delay_us(30);
  294.         }
  295.         ptr=(unsigned char*)Sn_CR(0);                /* Set RECV command */
  296.         *ptr=Sn_CR_RECV;

  297.         return i;
  298. }


 楼主| chenwang1996 发表于 2020-9-27 15:39 | 显示全部楼层
大神们,帮我看看是哪里的问题,STM32从W5300读其他寄存器时,也能正常读出正确的数据,比如读子网掩码寄存器SUBR2,也能读出0XFF。读Sn_RX_FIFOR就丢失最高位。

        ptr=(unsigned char*)SUBR2;
        *ptr=0xff;
        ptr=(unsigned char*)SUBR3;
        *ptr=0x00;
        ptr=(unsigned char*)SUBR2;                                                /* Set Gateway IP */
        ip=*ptr;
        delay_ms(15);
观海 发表于 2020-10-12 08:29 | 显示全部楼层
通讯速度是多少啊
guanjiaer 发表于 2020-10-12 08:29 | 显示全部楼层
楼主找到问题了吗
 楼主| chenwang1996 发表于 2020-10-12 16:07 | 显示全部楼层
guanjiaer 发表于 2020-10-12 08:29
楼主找到问题了吗

找到了,FMC_D7口被其他电路影响,电平被强制拉低了
 楼主| chenwang1996 发表于 2020-10-12 16:19 | 显示全部楼层
观海 发表于 2020-10-12 08:29
通讯速度是多少啊

通讯速度不清楚,但是问题已解决,电路问题,FMC_D7口接到了另一个模块上,另一个模块没关闭,导致FMC_D7无法拉高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部