TI中文支持网
TI专业的中文技术问题搜集分享网站

两个cc2538 用spi通信,配成一主一从,主机接收的从机数据发生错位

内容:

出现错误现象:
A.
主机发字符串 "Good morning, I am master.\0",从机接收正常

B.
从机发字符串 "Hello,world!This is slave.\0",
主机接收: "is slave.\0Hello,world!This"

结果:
从机接收的正常,主机接收的出现错位

C.

C.1
主机配置:
SSIConfigSetExpClk(SSI0_BASE, SysCtrlIOClockGet(), SSI_FRF_MOTO_MODE_1,SSI_MODE_MASTER, 9600UL, 8);
从机配置:
SSIConfigSetExpClk(SSI0_BASE, SysCtrlIOClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_SLAVE, 9600UL, 8);

C.2
从机用udma方式接收,在从机udma接收中断中,在中断处理函数中,清除中断标志位后,调用如下函数:
void slave_tx(void)
{
uint32_t ui32Index;
uint8_t array[] ="hello,world!this is slave.";
// 拉低引脚PD5
GPIOPinWrite(HAL_SPI_SRDY_BASE, HAL_SPI_SRDY_PIN, 0);
for(ui32Index = 0; ui32Index < 26 ; ui32Index++)
{
SSIDataPut(SSI0_BASE, array[ui32Index]);
}

while(SSIBusy(SSI0_BASE))
{
}
// 拉高 PD5
GPIOPinWrite(HAL_SPI_SRDY_BASE, HAL_SPI_SRDY_PIN, HAL_SPI_SRDY_PIN);}

C.3
主机检测到 PD5引脚出现下降沿 产生中断,在中断处理函数中,清除中断标志位后,调用如下函数:

static uint32_t pui32DataRx[26];
void master_tx_and_rx(void)
{
uint32_t ui32Index;
for(ui32Index = 0; ui32Index < 26; ui32Index++)
{
SSIDataPut(SSI0_BASE, 0x00);
SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[ui32Index]);
pui32DataRx[ui32Index] &= 0x00FF;
}

while(SSIBusy(SSI0_BASE))
{
}
}

请问,问题可能在哪?

l l3:

CC2538 System-on-Chip Solution for 2.4-GHz IEEE 802.15.4 and ZigBee®/ZigBee IP® ApplicationsTexas Instruments CC2538™ Family of ProductsVersion CUser's Guide

  

1、第418页,如果从机模式 TX FIFO缓冲区内的数据小于8字节 ,此时主机读取的数据会是8个0;这样就会出现数据移位的假象?

2、可不可以先填充 TX FIFO缓冲区数据,再使能SYS_CTRL_RCGCSSI。 读出数据会正确?

期待回复!

xinchan wang:

大神,您有空可以把这个发送字符串的程序给我发过来看看?  谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 两个cc2538 用spi通信,配成一主一从,主机接收的从机数据发生错位
分享到: 更多 (0)