网上买了个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;//返回接收到数据的长度
}
|