我们目前正在实施两种类型的交易,它们如下:
阅读交易,我们将:
- 以 OneShot 模式设置 MibSpi 设备
- 启用转接组
- 设置 INTFLGRDY[n]位时,对 TGINTFLG 寄存器进行轮询
- 阅读 RX RAM 寄存器的内容
- 为下一笔交易清除 TXINTFLG
在我们不关心 SPI 响应的地方写下交易,以便:
- 在 OneShot 模式下设置 MibSpi
- 启用转接组
- 忽略结果。
我一直在遇到一些问题,我注意到我有时会在读取操作期间返回上一个 SPI 事务的结果,我发现这是由于 TGINTFLG 寄存器在写入事务上未被清除, 因此,我在设置读取事务之前就开始清除它,但有时我仍会获得以前的读取事务结果。
我记录了 TGINTFLG 注册的一些记录,结果令人惊讶:
- 读取 intvectra 0或 intvectra 1无法清除 TGINTFLG 寄存器(偏移量0x60,0x64)
- intvectra 0和1始终为0 (可能是因为我没有启用中断?)
- 在开始转移前,LGTPEND 不会将 Tgroup 显示为活动状态(值始终为0x700)
我的问题基本上是关于投票和 TGINTFLG 登记册。
为了让我的代码表明传输已完成(我总是使用第一个 TG),我有一个繁忙的循环来检查 TGINTFLG 寄存器
while (currentTime > SPI_TRANSFER_TRANSFER_TIMEOUT_USEC)
{
if((((spi->hw->TGINTFLG >> 16U)>> auxGroup) & 1U) == 1U)
{
break;
}
currentTime = HALCpuTickElapsed(startTime, HALCpuTickGet());
currentTime = HALCpuTickToUsec(currentTime);
}
但有时,即使 TGINTFLG = 0x0,这也会通过中断退出。 我添加了一些日志代码,以便在静态变量中保存 TGINTFLG 的值, 当使用 JTAG 调试器检查静态变量是否为0x0时,我的 SPI RX RAM 缓冲器不包含0x8000作为控制标志的一部分(因为它在事务完成前读取了 RX RAM 缓冲器)
有没有关于我所遗漏的东西的想法,或者我可以添加一个额外的检查来解决投票时的这个潜在问题? (我们使用的 RTOS 对中断的开销相当高,因此我们尽可能避免中断)