打印

CC3200移植W5500遇到的问题

[复制链接]
773|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
网上买了个W5500的模块,附带了例程。用STM32F103跑了一下没有问题,现在移植到cc3200的平台上。
费了不到九牛二虎之力吧,总算初始化过去了,能发送一帧数据到串口,但是几帧数据以后,程序就跳进了FaultISR()。
跟进下程序,发现在这个程序中,正常情况是走if分支,几帧数据以后就掉进了else分支,然后FaultISR()。
附件是中断的看到size;offset, offset1的数值。
哪位大侠对W5500熟悉的,给支支招吧。多谢~

unsigned short rx_size;
unsigned short offset, offset1;
unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr)
{
    unsigned short i;
    unsigned char j;
    unsigned long jc;

    rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);
    if(rx_size==0) return 0;//没接收到数据则返回
    if(rx_size>1460) rx_size=1460;
    offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);
    offset1=offset;
    offset&=(S_RX_SIZE-1);//计算实际的物理地址
    MAP_SPICSEnable(GSPI_BASE);//置W5500的SCS为低电平

    SPI1_Send_Short(offset);//写16位地址
    SPI1_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器
    SPIDataGetNonBlocking(GSPI_BASE,&jc);   
    j=jc;
   
    if((offset+rx_size)<S_RX_SIZE)//如果最大地址未超过W5500接收缓冲区寄存器的最大地址
    {
        for(i=0;i<rx_size;i++)//循环读取rx_size个字节数据
        {
            SPI1_Send_Byte(0x00);//发送一个哑数据
            SPIDataGetNonBlocking(GSPI_BASE,&jc);   //读取1个字节数据   
            j=jc;
            *dat_ptr=j;//将读取到的数据保存到数据保存缓冲区
            dat_ptr++;//数据保存缓冲区指针地址自增1
        }
    }
    else//如果最大地址超过W5500接收缓冲区寄存器的最大地址  //为什么会调到这里??!!
    {
        ///***
        offset=S_RX_SIZE-offset;
        for(i=0;i<offset;i++)//循环读取出前offset个字节数据
        {     
            SPI1_Send_Byte(0x00);//发送一个哑数据
            SPIDataGetNonBlocking(GSPI_BASE,&jc);   //读取1个字节数据   
            j=jc;
            *dat_ptr=j;//将读取到的数据保存到数据保存缓冲区
            dat_ptr++;//数据保存缓冲区指针地址自增1
        }
        MAP_SPICSDisable(GSPI_BASE);//置W5500的SCS为高电平
        Delay(10);
        MAP_SPICSEnable(GSPI_BASE);//置W5500的SCS为低电平
        Delay(10);
        SPI1_Send_Short(0x00);//写16位地址
        SPI1_Send_Byte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器
        SPIDataGetNonBlocking(GSPI_BASE,&jc);    //读取低位数据
        j=jc;

        for(;i<rx_size;i++)//循环读取后rx_size-offset个字节数据
        {
            SPI1_Send_Byte(0x00);//发送一个哑数据
            SPIDataGetNonBlocking(GSPI_BASE,&jc);    //读取低位数据
            j=jc;
            *dat_ptr=j;//将读取到的数据保存到数据保存缓冲区
            dat_ptr++;//数据保存缓冲区指针地址自增1
        }
      //***/
    }
    MAP_SPICSDisable(GSPI_BASE); //置W5500的SCS为高电平
    Delay(10);
    offset1+=rx_size;//更新实际物理地址,即下次读取接收到的数据的起始地址
    Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);
    Write_W5500_SOCK_1Byte(s, Sn_CR, RECV);//发送启动接收命令
    return rx_size;//返回接收到数据的长度
}

1.png (133.21 KB )

1.png

2.png (122.37 KB )

2.png

3.png (126.12 KB )

3.png

4.png (124.36 KB )

4.png

5.png (130.58 KB )

5.png

相关帖子

沙发
dirtwillfly| | 2017-7-2 23:07 | 只看该作者
楼主,你走弯路了。cc3200官网有例程,直接该下网址或ip地址等就能通讯。

使用特权

评论回复
板凳
dirtwillfly| | 2017-7-2 23:08 | 只看该作者
cc3200本身带有wifi。也不需要外置wifi模块

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

22

帖子

2

粉丝