|
本帖最后由 HZKJ 于 2017-9-23 12:29 编辑
非常奇怪的问题:TCP每次发送一个字节没有问题,但是发送一个数据包时,网络助手接收到的都是数组的最后一个字节,
通信字节数量是对的。也就是软件接收20个字节都是相同的。 第一次使用W5500,请大家指点 赐教!!
while(1) //W5500连续发送数据
{
W5500_Socket_Set();//W5500端口初始化
W5500_Interrupt_Process();//
if((S0_Data & S_RECEIVE) == S_RECEIVE)// 接收并发送数据
{
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);//W5500
}
for(a=0;a<20;a++)
{
sd_buf1[a]=a;
}
Write_SOCK_Data_Buffer(0, &sd_buf1[a],20); // 发送20字节
delay_ms(3000);
}
/*******************************************************************************
* 函数名 : Write_SOCK_Data_Buffer
* 描述 : 将数据写入W5500的数据发送缓冲区
* 输入 : s:端口号,*dat_ptr:数据保存缓冲区指针,size:待写入数据的长度
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size)
{
unsigned short offset,offset1;
unsigned short i;
//如果是UDP模式,可以在此设置目的主机的IP和端口号
if((Read_W5500_SOCK_1Byte(s,Sn_MR)&0x0f) != SOCK_UDP)//如果Socket打开失败
{
Write_W5500_SOCK_4Byte(s, Sn_DIPR, UDP_DIPR);//设置目的主机IP
Write_W5500_SOCK_2Byte(s, Sn_DPORTR, UDP_DPORT[0]*256+UDP_DPORT[1]);//设置目的主机端口号
}
offset=Read_W5500_SOCK_2Byte(s,Sn_TX_WR);
offset1=offset;
offset&=(S_TX_SIZE-1);//计算实际的物理地址
GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS为低电平
SPI1_Send_Short(offset);//写16位地址
SPI1_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器
if((offset+size)<S_TX_SIZE)//如果最大地址未超过W5500发送缓冲区寄存器的最大地址
{
for(i=0;i<size;i++)//循环写入size个字节数据
{
SPI1_Send_Byte(*dat_ptr++);//写入一个字节的数据
}
}
else//如果最大地址超过W5500发送缓冲区寄存器的最大地址
{
offset=S_TX_SIZE-offset;
for(i=0;i<offset;i++)//循环写入前offset个字节数据
{
SPI1_Send_Byte(*dat_ptr++);//写入一个字节的数据
}
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS为高电平
GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS为低电平
SPI1_Send_Short(0x00);//写16位地址
SPI1_Send_Byte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器
for(;i<size;i++)//循环写入size-offset个字节数据
{
SPI1_Send_Byte(*dat_ptr++);//写入一个字节的数据
}
}
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS为高电平
offset1+=size;//更新实际物理地址,即下次写待发送数据到发送数据缓冲区的起始地址
Write_W5500_SOCK_2Byte(s, Sn_TX_WR, offset1);
Write_W5500_SOCK_1Byte(s, Sn_CR, SEND);//发送启动发送命令
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|