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.

[参考译文] RM57L843:问题是在两个 SPI 同时中断的情况下数据丢失

Guru**** 1825110 points
Other Parts Discussed in Thread: RM57L843
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/579250/rm57l843-problem-is-that-the-data-is-lost-in-the-case-of-two-spi-simultaneous-interrupt

器件型号:RM57L843

系统模块如下所示:

问题是当 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 引脚设置为高

电平} 

示波器 波形:


串行数据:

如上面显示的代码所示, 通过观察示波器和串行数据,当数据丢失时,波形只能满足。  

我尝试了很多方法,但仍然没有解决问题,

谁知道问题可能出在哪里?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    我目前正在审核您的帖子、并将很快向您回复我的观察结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。  

    首先、我怀疑当 SPI2和 spi3同时发送数据时、两个字节之间的频率太快。 这会导致数据溢出。  如下所示:

    因此、我将两个字节之间的传输频率降低了50us 两个字节、但问题仍然存在。  

    因此,我怀疑数据会丢失,因为 SPI 中断被暂时挂起。。。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    您是否曾尝试尽量缩短中断处理程序中的时间? 即、您当前在错误中断中执行 printf 函数、执行此任务的时间非常重要、尤其是考虑到兆位范围内的正常 UART 波特率与正常 SPI 波特率、因此、如果您没有在处理程序开始时重新启用中断、 您将会遇到溢出情况。 我建议至少将接收到的数据复制到缓冲区中、并通过设置指示接收到的 SPI 数据的标志来处理 ISR 例程之外的打印函数。 其他选项是使用 DMA 自动将数据传输到缓冲区位置、以便通过 SCI 进行打印。 您还可以考虑使用 MIBSPI、以便仅在传输组已满时才发生接收中断、从而减少 CPU 负载。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 TI 支持:

          编写的演示 仅用于测试、因为当 SPI 发生两个中断时、我的项目始终会丢失数据。  实际项目没有 printf、只是一些 swich-case 的判断语句,、我认为中断的时间不是很长。 此外,如果我注释 “my_printf("1 %d\r\n", spi2_temp0); ”和“my_printf("2 %d\r\n", spi3_temp0); ”这两句话, 程序仍然可以跳转到“my_printf("error2\r\n"); ”或“”my_printf("error3\r\n"); ,也就是说,数据也会丢失。  

          我需要获取一个字节、然后判断一个字节、因此 DMA 和 MibSPI 在此不适用。  我在数据表的 mibspi 中找不到接收 interrutp。

          几天后、我将使用具有相同代码的另一个 CPU 进行测试。  我怀疑 RM57 CPU 在 SPI 中是否有错误。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否可以压缩项目并将其与 SPI2和 SPI3的 SPI 消息传递频率相关的详细信息一起发布?

    根据您的图、这是一个3 MCU 通信方案。 您是否有适用于所有 MCU 的代码/项目、我们可以在实验中设置这些代码/项目来调试应用。 基本上、您可以提供的任何内容、我们都可以使用这些内容来重新创建您的设置并对其进行故障排除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../8228.DEMO7_5F00_ZD_5F00_CheckLostData.zip

    您好 TI 支持:

    感谢您的回复!

    此项目用于测试 SPI 通信

    两个 RM42芯片使用 SPI2端口 COM 与 RM57 SPI2和 SPI3端口进行通信。
    SPI 的频率为25000Kbit/s
    RM57 SCI 的频率为900Kbit/s
    SPI 的两个字节之间的间隔为100us。
    IDE 是 IAR7406


    两个 RM42通过 SPI 向 RM57发送1 2 3 4 5 num。 然后 RM57判断接收到的两个数字之间的差异是否为1、num 5和1除外。