S32K3X8EVB-Q289_HWPack_C2 上的 LpSPI 半双工错误 你好 我正在使用 LPspi 4 并作为 S32k3x8 评估板上的 Spi 外围设备。我看到第一笔交易的第一个字节始终是 0x07,然后每笔后续交易的第一个字节对于模式 0 是 0x00,模式 3 是 0x81。其余数据已正确计时。我不确定这是否是芯片的问题,我也检查了所有设置。附上一些屏幕截图以供参考。芯片选择引脚正在使用下降沿中断,isr 调用 Lpspi_Ip_AsyncTransmitHalfDuplex。芯片选择引脚配置为 eirq,因为它是低电平有效。 Shiv_peak_0-1758220365734.png Shiv_peak_0-1758228246752.png Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 你好@Shiv_peak
使用 GPIO 中断控制 SPI PCS 信号并非 SPI 协议的预期用途。在您的应用程序中,这似乎会导致数据损坏。
您可以尝试在中断中设置一个标志,而不是直接从中断中发送数据。然后,在主循环或一个单独的任务中,检查标志是否设置,并在此处理数据传输。 Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 是的,模式 0 和 1 与您提到的一样。 至于如何使用 SPI,我已经验证了它可以与普通芯片选择一起工作。不过,就我的使用情况而言,我需要将芯片选择配置为 EIRQ。 即使使用这种配置,我也不清楚为什么每种模式表现出不同的行为,模式 3(时钟空闲时为高电平,在上升沿采样)按预期完美运行。 Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 你好@Shiv_peak
为了排除由GPIO中断引起的任何潜在问题,您能否尝试创建一个仅包含轮询模式下SPI实现的简单项目,并尝试降低速度?
另外,我想确认一下,你提到的模式 0 和模式 1 是指下面的意思吗? 模式 0:时钟空闲状态为低电平,在上升沿采样数据 模式 1:时钟空闲状态为低电平,在下降沿采样数据 Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 1)Yes, I am doing multiple SPI transactions from Master.在模式 0 下,第一笔交易的第一个字节是 0x07,这是错误的,因为我要发送 AA。所有其他交易的第一个字节是 0x00,这也是错误的,因为我要发送 AA。作为参考,我每笔交易都会在MISO上发送以下数据 虚拟数组[0] = 0xAA; 虚拟数组[1] = 0xBB; 虚拟数组[2] = 0xCC; 虚拟数组[3] = 0xDD; 虚拟数组[4] = 0xEE; 虚拟数组[5] = 0xFF; 虚拟数组[6] = 0x24; 虚拟数组[7] = 0x35; 2)模式 1 的行为更奇怪一些,每第二个事务都是正确的,但它们之间的每个事务都是错误的,我把在模式 1 中看到的数据附在下面: 交易 1: 字节 0:170 字节 1:187 字节 2:204 字节 3:221 字节 4:238 字节 5:255 字节 6:36 字节 7:53 交易 2: 字节 0:0 字节 1:0 字节 2:0 字节 3:0 字节 4:0 字节 5:1 字节 6:85 字节 7:119 交易 3: 字节 0:170 字节 1:187 字节 2:204 字节 3:221 字节 4:238 字节 5:255 字节 6:36 字节 7:53 交易 4: 字节 0:0 字节 1:0 字节 2:0 字节 3:0 字节 4:0 字节 5:1 字节 6:85 字节 7:119 事务 5: 字节 0:170 字节 1:187 字节 2:204 字节 3:221 字节 4:238 字节 5:255 字节 6:36 字节 7:53 就上下文 而言,交易 1,3 和 5 是正确的,2 & 4 是错误的,依此类推。 Shiv_peak_0-1758579692801.png 在这张图片中,第一笔交易是正确的,但第二笔交易是错误的,这是模式 1 3) 我启用了半双工支持,并再次尝试了模式 0 和模式 1,但仍然是同样的行为,没有任何变化。 Shiv_peak_1-1758580159004.png 这些是我使用的设置。值得注意的是,当我将传输宽度设置为 8 位时,得到的数据完全是垃圾数据,与模式无关。 4) 我尝试使用 LpSpi3,但它也有同样的表现。 5) 我们没有将芯片选择引脚配置为芯片选择,而是配置为下降沿中断。我不确定这是否是个问题。 Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 你好@Shiv_peak
当您提到"第一笔交易和 0 之后," ,您的意思是您进行了两次连续传输,并观察到数据在两次传输之间发生了变化?值 "0 "是预期/正确的数据,还是仍然不正确?
此外,我注意到您当前的配置没有启用半双工支持。能否请您尝试启用半双工模式,看看是否会对行为产生影响?
最后,您能否使用不同的引脚进行测试,以检查问题是否仍然存在或行为是否发生了变化? Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 1)从站仅以半双工模式发送 SPI 数据,而不接收来自主站的任何数据。我附上代码供你参考。当主控器钳位芯片选择处于低位时,就会调用 falling_edge_isr。需要注意的是,在我的应用中,芯片选择引脚必须配置为 EIRQ,希望这不是问题。 voidfalling_edge_isr() { __asm__//(" nop"); 如果(!isr_enabled) 返回; Siul2_Icu_Ip_DisableInterrupt(falling_edge_siul_instance、 falling_edge_hw_channel); // Siul2_Icu_Ip_DisableNotification(FALLING_EDGE_SIUL_INSTANCE、 // falling_edge_hw_channel); Lpspi_Ip_AsyncTransmitHalfDuplex(linux_spi_com_device、 假数组、 虚拟数组大小、 lpspi_ip_half_duplex_transmit、 NULL); BaseType_t xHigherPriorityTaskWoken= pdFALSE; xTimerStartFromISR(timeout_timer,& xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); isr_enabled = false; } 2) 我的测试应用程序中的主设备是一个外部板,它只从服务器读取数据。主站读取的数据与我在逻辑分析仪 MISO 线路上看到的数据一致。dummy_array 有正确的数据,但是在主端,第一个字节已损坏,第一个事务为 7,之后为 0。其他字节是正确的。 Shiv_peak_0-1758308405336.png Shiv_peak_1-1758308476075.png 3)我没有测试 RTD 示例,因为它是从主站向从站发送数据,而在我的应用程序中,我是从从站向主站发送数据。 4) 我附上了芯片选择、时钟和 MISO 线路的截图。为了满足主站和从站之间的时序要求,主站对芯片选择进行双切换,从站在芯片选择的第一个下降沿加载数据,然后在主站开始交易时输出时钟。 5)这种配置是有意为之,因为它最符合我们的系统要求。我还使用板载 LpSPI 外围设备作为主设备进行了测试 Re: LpSPI half-duplex bug on S32K3X8EVB-Q289_HWPack_C2 你好@Shiv_peak
能否帮我确认 RxSlaveBuffer 是否包含与主站传输的相同数据?我想首先排除逻辑分析仪的任何问题。
如果数据与分析仪上显示的数据一致,能否请您分享一下您目前使用的代码,甚至是仍能重现问题的简化版本?这样,我这边就可以进行一些测试了。
另外,在使用随 RTD 提供的示例代码时,是否会出现这种行为?
BR、VaneB
View full article