系统模块如下所示:
问题是当 RM57L843的 SPI2和 SPI3同时从 RM42接收数据时、会丢失一个字节。
为了便于观察、 在 SPI2和 SPI3的启动和结束启动中更改了 GIO 引脚状态。
void vSpi2IrqHandle (void) { uint32 flags =(spiREG2->FLG & 0x0000FFFFU)&(~spiREG2->LVL & 0x035FU); uint32 vec = spiREG2->intvecT0; (*(volatile UINT32 *) 0xFFF7B854UL)&=~(1 <<0);//将 GPI PIN 设置为低电平 开关(VEC) { 情况0x24U:/*接收缓冲区已满中断*/ { SPI2_temp0 =(uint8) spiREG2->BUF; my_printf ("1 %d\r\n"、SPI2_temp0);//通过 SCI 打印到 PC if (SPI2_flg = 0)//以删除第一组数据 { SPI2_flg = 1; } 其他 { if ((SPI2_LAST== 5)&&(SPI2_temp0 == 1)//主机数据按顺序。发送1 2 3 4 5 { } 否则、if (((SPI2_temp0-SPI2_LAST=1)//确定字节是否丢失 { } 其他 { my_printf ("error2\r\n"); while (1);//如果丢失,则停止 } } SPI2_LAST = SPI2_temp0; 中断; } 情况0x28U:/*发送缓冲器空中断*/ { 中断; } 案例0x26U:/*data over Run*/ { my_printf ("运行时的数据!\r\n"); 中断; } 默认值:/*清除标志并返回*/ spiREG2->FLG = 0xFFFF; 中断; } (*(volatile UINT32 *) 0xFFF7B854UL)|=(1 << 0);//将 Gio 引脚设置为高 电平}
void vSpi3IrqHandle (void) { uint32 flags =(spiREG3->FLG & 0x0000FFFFU)&(~spiREG3->LVL & 0x035FU); uint32 vec = spiREG3->intvecT0; (*(volatile UINT32 *) 0xFFF7B854UL)&=~(1 <<5);//将 Gio 引脚设置为低电平 开关(VEC) { 情况0x24U:/*接收缓冲区已满中断*/ { spi3_temp0 =(uint8) spiREG3->BUF; my_printf ("2 %d\r\n"、spi3_temp0); if (spi3_flg = 0) { spi3_flg = 1; } 其他 { if ((spi3_last = 5)&&(spi3_temp0 = 1)) { } 否则、如果(((spi3_temp0-spi3_last)= 1) { } 其他 { my_printf ("error3\r\n"); while (1); } } spi3_last = spi3_temp0; 中断; } 情况0x28U:/*发送缓冲器空中断*/ { spiREG3->FLG &=(~(1<<9)); 中断; } 案例0x26U:/*data over Run*/ { my_printf ("运行时的数据!\r\n"); spiREG3->FLG &=(~(1<<6)); 中断; } 默认值:/*清除标志并返回*/ spiREG3->FLG = 0xFFFF; 中断; } (*(volatile UINT32 *) 0xFFF7B854UL)|=(1 << 5);//将 Gio 引脚设置为高 电平}
示波器 波形:
串行数据:
如上面显示的代码所示, 通过观察示波器和串行数据,当数据丢失时,波形只能满足。
我尝试了很多方法,但仍然没有解决问题,
谁知道问题可能出在哪里?