CC3200移植W5500,几帧数据后死机

2019-12-27 18:46发布

本帖最后由 tairuibao 于 2017-6-29 17:39 编辑

网上买了个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;//返回接收到数据的长度
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
NJ8888
1楼-- · 2019-12-27 20:10
FPGA控制W5500路过
tairuibao
2楼-- · 2019-12-27 20:41
NJ8888 发表于 2017-6-29 19:09
FPGA控制W5500路过

兄台你的控制效果何如?
NJ8888
3楼-- · 2019-12-27 22:20
tairuibao 发表于 2017-6-30 15:31
兄台你的控制效果何如?

我用udp,正常
yiwei0397
4楼-- · 2019-12-28 02:49
 精彩回答 2  元偷偷看……
NJ8888
5楼-- · 2019-12-28 04:25
yiwei0397 发表于 2017-6-30 21:54
你是用硬件描述语言控制吗?

是哦。。。。

一周热门 更多>