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.

[参考译文] TMS570LC4357:MibSPI 和轮询

Guru**** 2462140 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1073952/tms570lc4357-mibspi-and-polling

部件号:TMS570LC4357

我们目前正在实施两种类型的交易,它们如下:

阅读交易,我们将:

  1. 以 OneShot 模式设置 MibSpi 设备
  2. 启用转接组
  3. 设置 INTFLGRDY[n]位时,对 TGINTFLG 寄存器进行轮询
  4. 阅读 RX RAM 寄存器的内容
  5. 为下一笔交易清除 TXINTFLG

在我们不关心 SPI 响应的地方写下交易,以便:

  1. 在 OneShot 模式下设置 MibSpi
  2. 启用转接组
  3. 忽略结果。

我一直在遇到一些问题,我注意到我有时会在读取操作期间返回上一个 SPI 事务的结果,我发现这是由于 TGINTFLG 寄存器在写入事务上未被清除, 因此,我在设置读取事务之前就开始清除它,但有时我仍会获得以前的读取事务结果。

我记录了 TGINTFLG 注册的一些记录,结果令人惊讶:

  1. 读取 intvectra 0或 intvectra 1无法清除 TGINTFLG 寄存器(偏移量0x60,0x64)
  2. intvectra 0和1始终为0 (可能是因为我没有启用中断?)
  3. 在开始转移前,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 对中断的开销相当高,因此我们尽可能避免中断)

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

    结果是我没有正确报告的超时。 (我认为我的超时足够长,但它接近 SPI 事务的实际长度,有时它会超时。