This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: CC2538

内容:

出现错误现象:
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))
{
}
}

请问,问题可能在哪?

  • CC2538 System-on-Chip Solution for 2.4-GHz IEEE 802.15.4 and ZigBee®/ZigBee IP® Applications
    Texas Instruments CC2538™ Family of Products
    Version C
    User's Guide

      

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

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

    期待回复!





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