| W5300调试UDP通信时,发送数据正常,接收数据丢失最高位。STM32F767芯片接W5300,另一端接PC网络调试助手。采用8位数据模式。STM32发送0XFF或0XAA,PC网络调试助手能收到0XFF或0XAA,但是网络调试助手发送0XFF或0XAA,STM32从W5300的Sn_RX_FIFOR读出来是0X7F或0X2A。STM32程序如下: void LCD_Init(void)
{           
    GPIO_InitTypeDef GPIO_Initure;
        FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
    FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
    LCD_MPU_Config();                       //ʹÄÜMPU±£»¤LCDÇøÓò
    SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;       
    SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;       
    
    SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK3;     //ʹÓÃNE1
    SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //²»¸´ÓÃÊý¾ÝÏß
    SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;   //SRAM
    SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_8; //16λÊý¾Ý¿í¶È
    SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //ÊÇ·ñʹÄÜÍ»·¢·ÃÎÊ,½ö¶Ôͬ²½Í»·¢´æ´¢Æ÷ÓÐЧ,´Ë´¦Î´Óõ½
    SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//µÈ´ýÐźŵļ«ÐÔ,½öÔÚÍ»·¢Ä£Ê½·ÃÎÊÏÂÓÐÓÃ
    SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_DURING_WS;//FMC_WAIT_TIMING_BEFORE_WS;   //´æ´¢Æ÷ÊÇÔڵȴýÖÜÆÚ֮ǰµÄÒ»¸öʱÖÓÖÜÆÚ»¹ÊǵȴýÖÜÆÚÆÚ¼äʹÄÜNWAIT
    SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //´æ´¢Æ÷дʹÄÜ
    SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;           //µÈ´ýʹÄÜλ,´Ë´¦Î´Óõ½
    SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //¶ÁдʹÓò»Í¬µÄʱÐò
    SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//ÊÇ·ñʹÄÜͬ²½´«ÊäģʽϵĵȴýÐźÅ,´Ë´¦Î´Óõ½
    SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //½ûֹͻ·¢Ð´
    SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
//          FSMC_ReadWriteTim.AddressSetupTime=0x15;    //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ17¸öHCLK 1/216M=4.6ns*17=78ns//01
//    FSMC_ReadWriteTim.AddressHoldTime=0x01;
//    FSMC_ReadWriteTim.DataSetupTime=0x15;       //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ85¸öHCLK        =4.6*85=391ns
          FSMC_ReadWriteTim.AddressSetupTime=0x15;    //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ17¸öHCLK 1/216M=4.6ns*17=78ns//01
    FSMC_ReadWriteTim.AddressHoldTime=0x01;
    FSMC_ReadWriteTim.DataSetupTime=0x15;       //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ85¸öHCLK        =4.6*85=391ns
//         FSMC_ReadWriteTim.BusTurnAroundDuration = 0;
//          FSMC_ReadWriteTim.CLKDivision = 0;
//          FSMC_ReadWriteTim.DataLatency = 0;
        
    FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_B; //ģʽA
    //FSMCдʱÐò¿ØÖƼĴæÆ÷
    FSMC_WriteTim.AddressSetupTime=0x15;        //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ21¸öHCLK=96ns
    FSMC_WriteTim.AddressHoldTime=0x00;
    FSMC_WriteTim.DataSetupTime=0x55;           //Êý¾Ý±£´æÊ±¼ä(DATAST)Ϊ4.6ns*21¸öHCLK=96ns//10
    FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //ģʽA
        HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);        
         delay_ms(50); // delay 50 ms 
}  
void W5300_Config(void)
{
        unsigned char *ptr;
//        unsigned char *ptr;
   HAL_GPIO_WritePin(GPIOB,W5300_RST,GPIO_PIN_SET);        //PB1ÖÃ0
        //GPIO_SetBits(GPIOE, W5300_RST);
        /* Wait Ethernet Link */
        //while(HAL_GPIO_ReadPin(GPIOG, L_LINK)==1);
  delay_ms(10); // delay 50 ms
/*        ptr=(unsigned char*)MR;
        ip=*ptr;
        */
        UDP_OK=0;
        ptr=(unsigned char*)MR1;
        *ptr=0x80;
         delay_ms(15);
        ptr=(unsigned char*)MR1;
        *ptr=0x00;
        ptr=(unsigned char*)MR;
        *ptr=0x38;
//         delay_ms(10);
//        ptr=(unsigned char*)MR1;
//        ip=*ptr;
  delay_ms(10);
 //ÅäÖÃÖжÏ
         ptr=(unsigned char*)IR;
        *ptr=0x00;
        ptr=(unsigned char*)IR1;
        *ptr=0x00;
        /* Set Gateway address as "192.168.0.1" */
        ptr=(unsigned char*)GAR;                                                /* Set Gateway IP */
  *ptr=0xc0;
        ptr=(unsigned char*)GAR1;                                                /* #define GAR2            (GAR + 2)      Set Gateway IP */
        *ptr=0xa8;
        ptr=(unsigned char*)GAR2;                                                /* Set Gateway IP */
  *ptr=0x01;
        ptr=(unsigned char*)GAR3;                                                /* #define GAR2            (GAR + 2)      Set Gateway IP */
        *ptr=0x01;
        /* Set IP address as "192.168.0.20" */
        ptr=(unsigned char*)SIPR;
        *ptr=0xc0;
        ptr=(unsigned char*)SIPR1;
        *ptr=0xa8;
        ptr=(unsigned char*)SIPR2;
        *ptr=0x01;
        ptr=(unsigned char*)SIPR3;
        *ptr=0x14;
        /* Set Subnet mask as "255.255.255.0" */
        ptr=(unsigned char*)SUBR;
        /**ptr++=0xffff;
        *ptr=0xff00;
        */
        *ptr=0xFF;
        ptr=(unsigned char*)SUBR1;
        *ptr=0xff;
        ptr=(unsigned char*)SUBR2;
        *ptr=0xff;
        ptr=(unsigned char*)SUBR3;
        *ptr=0x00;
        ptr=(unsigned char*)SUBR2;                                                /* Set Gateway IP */
        ip=*ptr;
        delay_ms(15);
        /* Set MAC address as "48 53 00 31 30 33"*/
        ptr=(unsigned char*)SHAR;
        *ptr=0x00;
        ptr=(unsigned char*)SHAR1;
        *ptr=0x08;
        ptr=(unsigned char*)SHAR2;
        *ptr=0xDC;
        ptr=(unsigned char*)SHAR3;
        *ptr=0x01;
        ptr=(unsigned char*)SHAR4;
        *ptr=0x02;
        ptr=(unsigned char*)SHAR4;
        *ptr=0x03;
        //ÉèÖÃÄÚ´æ´óС
                ptr=(unsigned char*)TMS01R;
         *ptr=0x04;
         ptr=(unsigned char*)TMSR1;
         *ptr=0x10;
          ptr=(unsigned char*)TMSR2;
         *ptr=0x01;
          ptr=(unsigned char*)TMSR3;
         *ptr=0x14;
          ptr=(unsigned char*)TMSR4;
         *ptr=0x00;
          ptr=(unsigned char*)TMSR5;
         *ptr=0x07;
          ptr=(unsigned char*)TMSR6;
         *ptr=0x0c;
          ptr=(unsigned char*)TMSR7;
         *ptr=0x0c;
         //
          ptr=(unsigned char*)RMS01R;
         *ptr=0x11;
                 ptr=(unsigned char*)RMSR1;
         *ptr=0x03;
                 ptr=(unsigned char*)RMSR2;
         *ptr=0x05;
                 ptr=(unsigned char*)RMSR3;
         *ptr=0x10;
                 ptr=(unsigned char*)RMSR4;
         *ptr=0x03;
                 ptr=(unsigned char*)RMSR5;
         *ptr=0x04;
                 ptr=(unsigned char*)RMSR6;
         *ptr=0x04;
                 ptr=(unsigned char*)RMSR7;
         *ptr=0x04;
        //ÉèÖÃÄÚ´æ
         ptr=(unsigned char*)MTYPER0;
        *ptr=0x01;
         ptr=(unsigned char*)MTYPER1;
        *ptr=0xff;
        /* Set interrupt mask */
                ptr=(unsigned char*)IMR;
        *ptr=IR_CONFLICT;
        ptr=(unsigned char*)IMR1;
        *ptr=0x01;
         delay_ms(10); // delay 50 ms
                 ptr=(unsigned char*)IMR1;                                        
     ip=*ptr;
                  delay_ms(10); // delay 50 ms
}
unsigned int Socket0_UDP(void)
{
        unsigned char *ptr;
        unsigned char i;
        /* Set Socket Port Number as 5000*/
/*        ptr=(unsigned short*)Sn_PORTR(0);
        *ptr=5000;*/
        ptr=(unsigned char*)Sn_PORTR(0);
  *ptr=0x13;
        ptr=(unsigned char*)Sn_PORTR1(0);
        *ptr=0x88;//0x1388
        /* Set Destination IP  as "192.168.0.30" */
        ptr=(unsigned char*)Sn_DIPR(0);
  *ptr=0xc0;
        ptr=(unsigned char*)Sn_DIPR1(0);
        *ptr=0xA8;
        ptr=(unsigned char*)Sn_DIPR2(0);
        *ptr=0x01;
        ptr=(unsigned char*)Sn_DIPR3(0);
        *ptr=0x16;
        
        
        //ÎïÀíµØÖ·
                ptr=(unsigned char*)Sn_DHAR(0);
        *ptr=0x28;
        ptr=(unsigned char*)Sn_DHAR1(0);
        *ptr=0xd2;
        ptr=(unsigned char*)Sn_DHAR2(0);
        *ptr=0x44;
        ptr=(unsigned char*)Sn_DHAR3(0);
        *ptr=0x3e;
        ptr=(unsigned char*)Sn_DHAR4(0);
        *ptr=0x77;
        ptr=(unsigned char*)Sn_DHAR5(0);
        *ptr=0x3a;
        
        
        
        /* Set Destination Port number as 5000 */
        /*ptr=(unsigned short*)Sn_DPORTR(0);
        *ptr=5000;*/
        ptr=(unsigned char*)Sn_DPORTR(0);
  *ptr=0x13;
        ptr=(unsigned char*)Sn_DPORTR(0);
        *ptr=0x88;//0x1388
   ptr=(unsigned char*)Sn_MSSR(0);
        *ptr=0x05;
         ptr=(unsigned char*)Sn_MSSR1(0);
        *ptr=0xb4;//0x5b4
        /* Set Socket0 in UDP mode */
        ptr=(unsigned char*)Sn_MR1(0);
        *ptr=0x02;//
//                ptr=(unsigned char*)Sn_CR1(0);
//                *ptr=Sn_CR_CLOSE;
//        delay_ms(10);
        /* Open Socket0 */
        ptr=(unsigned char*)Sn_CR1(0);
        *ptr=Sn_CR_OPEN;
        
        delay_ms(10);
        ptr=(unsigned char*)Sn_SSR1(0);
        i=*ptr;
        ip=i;
        if((i&0xff)!=SOCK_UDP)                /* If failed to open Socket0, close Socket0 and reurn false */
        {
                ptr=(unsigned char*)Sn_CR1(0);
                *ptr=Sn_CR_CLOSE;
                delay_ms(10);
                return FALSE;
        }
        S0_SendOK=1;
        //GPIO_ResetBits(GPIOF, D_OUTPUT2);                /* If UDP Ready, light LED2*/
        return TRUE;
}
/* Read data from RX buffer and dump them to S_buffer */
unsigned char S0_udprx_process(void)
{
        unsigned char*ptr;
        unsigned short rx_size;
        unsigned int i,j;
        ptr=(unsigned char*)Sn_RX_RSR0(0);
        ip=*ptr;
        ptr=(unsigned char*)Sn_RX_RSR1(0);
        ip=*ptr;
        ptr=(unsigned char*)Sn_RX_RSR2(0);
        ip=*ptr;
        ptr=(unsigned char*)Sn_RX_RSR3(0);
        ip=*ptr;
 //ip=rx_size;
                 delay_us(10);
        if(ip==0)                 
                return 0;
//ip
        ptr=(unsigned char*)Sn_RX_FIFOR(0);
        IP_Buffer[0]=*ptr;
        ptr=(unsigned char*)Sn_RX_FIFOR1(0);
        IP_Buffer[1]=*ptr;
         delay_us(30);
//        rx_size=S_Buffer[0]<<8+S_Buffer[1];
        ptr=(unsigned char*)Sn_RX_FIFOR(0);
        IP_Buffer[2]=*ptr;
        ptr=(unsigned char*)Sn_RX_FIFOR1(0);
        IP_Buffer[3]=*ptr;
         delay_us(30);
        //¶Ë¿Ú
        ptr=(unsigned char*)Sn_RX_FIFOR(0);
        IP_Buffer[4]=*ptr;
        ptr=(unsigned char*)Sn_RX_FIFOR1(0);
        IP_Buffer[5]=*ptr;
         delay_us(30);
  //Êý¾Ý
                ptr=(unsigned char*)Sn_RX_FIFOR(0);
        IP_Buffer[6]=*ptr;
        ptr=(unsigned char*)Sn_RX_FIFOR1(0);
        IP_Buffer[7]=*ptr;
         delay_us(30);
         //Êý¾Ý´¦Àí
        i=(IP_Buffer[6]<<8)+IP_Buffer[7];
        if(i%2!=0) i++; 
        //i=i/2;
  for(j=0;j<i;j++)
        {
        ptr=(unsigned char*)Sn_RX_FIFOR(0);
        R_Buffer[j]=*ptr;
                j++;
        ptr=(unsigned char*)Sn_RX_FIFOR1(0);
        R_Buffer[j]=*ptr;
         delay_us(30);
        }
        ptr=(unsigned char*)Sn_CR(0);                /* Set RECV command */
        *ptr=Sn_CR_RECV;
        return i;
}
 |