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.

[参考译文] MSP430FR6989:错误USCI41:将SPI从属模式与DMA通道一起使用

Guru**** 2535450 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/575086/msp430fr6989-erratum-usci41-using-spi-slave-mode-with-dma-channel

部件号:MSP430FR6989

我对MSP430FT6989的勘误表数据表中讨论的其中一个问题有疑问:

当设备处于SPI模式时,USCI41 eUSSCI模块功能UCBUSY eUSIA模块位卡在1位。 说明在SPI模式下配置eUSCIA时,最后的传输位从0更改为1,UCBUSY位被卡在1。 这发生在时钟相位和时钟极性选项(UCAxCTLW0.UCCKPH和UCAxCTLW0.UCCKPL位)的所有四种组合中。 没有数据丢失或损坏。 由于USSCBUSY位被卡在1,时钟请求保持启用状态,并在低功耗模式操作中增加了额外的电流消耗。 解决方法检查传输或接收中断标志UCTXIFG/UCRXIFG而不是UCBUSY,以了解UCAxTXBUF缓冲区是空的还是可以容纳下一个完整字符。

我已经确定这是一个问题-或者已经验证过-但是如果我使用UCA0作为SPI从属设备;我想在接收时传输SPI数据包;我不太清楚确定端口是否仍然繁忙的最佳方法; 特别是在检查SPI数据包是否已传输时。

现在,我看到发送的数据包与我可以通过2个字节分辨的数据包不一致,这意味着前两个字节来自上一个数据包。

我想USCI45在SPI从属模式下不是问题,对吗?

USCI45 eUSCI模块功能意外SPI时钟可能拉伸说明在极少数情况下,在SPI通信期间,第一个数据位的时钟高相位可能会明显拉伸。 SPI操作按预期完成,不会丢失数据。 仅当USCI SPI模块时钟(UCxCLK)与系统时钟(MCLK)不同步时,才会出现此问题。 解决方法确保USCI SPI模块时钟(UCxCLK)和CPU时钟(MCLK)相互同步。

这是相当简单的;但我想知道确定变速器何时仍在进行的最佳方法,因为这是从变速器-由于勘误表,这样的方法不起作用:

而( EUSCI_A_SPI_isBusy(EUSI_A0_base)== EUSCI_A_SPI_BUSY )//SPI仍在发送数据? -勘误表

我也在使用DMA - 2个通道- 1个用于接收,1个用于传输。

有关此勘误表:

DMA7 DMA模块功能DMA请求可能导致中断丢失说明如果DMA请求在使用读-修改-写指令访问包含中断标志的模块寄存器期间开始执行,则来自同一模块的新到达中断可能会丢失。 在DMA执行之前设置的中断标志不会受到影响,而是保持设置状态。 解决方法1. 使用对中断向量寄存器的读取来清除中断标志,而不使用readmodife-write指令。 或2. 激活这些中断时,在包含中断标志的特定模块寄存器的读-修改-写指令期间禁用所有DMA通道。

是否可以执行此操作:

dma_disableTransferDuringReadModifyWrite();
DMACTL0 |= DMARMWDIS; //和/或?
DMACTL1 |= DMARMWDIS; //和/或?

谢谢!
John W.

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

    就USCI41而言,一旦设置了UCRXIFG,您只需触发读取RXBUFF,并且一旦设置了UCTXIFG,您就可以填充TXBUFF。 要解决DMA7问题,您只需在手动清除UCTX/RXIFG之前禁用DMA。 这些标志在进入其关联中断时的自动清除不会影响其只读指令。

    根据未对齐的数据包问题,您是丢失任何SPI数据还是重复传输任何数据? 在将数据发回主数据之前,您对数据进行了哪种处理?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jace:

    感谢您的回复。

    收到的数据包似乎工作正常;我也在使用DMA来实现这一点。

    要传输回的数据包在SPI命令之间组合在一起,并准备好在接收到的下一个SPI数据包上运行。

    数据不会被覆盖;但似乎被延迟或关闭两个字节(如上图所示)所包装。
    数据也不会被多次传输-我也已验证过。

    在查看勘误表时,由于性能要求,在此情况下我需要DMA;我不清楚如何确定返回数据包实际完成传输的时间。 现在数据包的大小相对较小;这让我对数据包未对齐的情况产生了更多的疑问。

    我显然在6989上使用FRAM,并且必须为此启用两种等待状态;我认为这也不是一个问题,但我认为我应该提及它。 我们在这种设计上同时使用了32.768 kHz XTAL和24MHz HF XTALS,我正在使用这两种设计。 我运行MCLK的频率为24MHz,SMCLK的频率为MCLK/2的频率为12MHz。

    我必须承认看到这张勘误表我有点惊讶,因为我在其他430上使用了这个带SPI的DMA驱动程序,它工作正常;但UCBUSY位在那些处理器上工作正常。

    而( EUSCI_A_SPI_isBusy(EUSI_A0_base)== EUSCI_A_SPI_BUSY )//SPI仍在发送数据? -勘误表


    在DMA IRQ的TX部分中使用过,我仍然不清楚如何根据勘误表执行等效操作。

    当我最初看到这个问题时,我以为我有一个lib问题,因为我在unint32_t上使用memcpy,memset等,乍一看,它看起来像是一个大端/小端点问题;但这不是真正的问题。

    另一件我认为有点不清楚的事是必须对UCA0TXBUF进行初始写入,或者DMA IRQ似乎从未传输数据包;我在这些论坛上看到了关于这个问题的相当多的讨论。 我认为这也是一个问题,但数据包将在收到的数据包与重新提交的数据包之间重新对齐。

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

    由于您没有获得任何双重传输或数据包覆盖,因此我们可以假定您实际上正在将正确的数据传输到USCI,并且使用DMA执行此操作是正确的。 如果这些勘误表影响了您的应用程序,我希望在交易过程中对所有F或0进行双写,覆盖或传输。 我假设您在这里使用某种缓冲区来存储要发送的数据。 我会尝试在逻辑分析器上捕获第一个事务发生的时间,以查看MSP430发送的第一个字节是否偏移了多个字节。 这意味着处理第一个事务需要很长时间才能进入第二个字节。 作为一个从属设备,我希望事务会被一个对齐关闭,因为从属设备在写入后才会传输,而且您不知道要在第一个接收字节上发送什么。 例如,如果您发送MSP430 6字节,并希望6字节得到回显,则总共需要7个事务,其中第7个字节是由主中继器传输的虚拟写入字节。 如果您有主事务的虚拟写入,则每个事务都应正确排列。 我不确定这是否是您正在做的事情,以及是否考虑了这一初步调整。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jace:

    我在这种协议中所做的是发送初始数据包,然后在随后的数据包中发送答案。  因此:

    对于数据包n -数据包n+1包含响应-要获得最后一个响应,必须发送一个伪数据包以获取最后一个数据包。

    我似乎已经解决了数据包对齐问题;但我现在不确定我是否不会覆盖数据-请参阅所附图像。

    我已经尝试了所有的东西,包括信号保护这个数据包,不管我做什么,我都看到了附件。  因为我在这个处理器上似乎只有一个正常工作的断点;我无法在调试器中解决问题;从我现在在调试器中可以知道的情况来看,数据包看起来不错。  任何时候我使用调试器都很明显;它会影响SPI总线计时,因此我必须在结果中考虑到这一点。

    图1: 匹配的数据包响应- 0xFF -数据包初始字符- 0x89是响应的一部分- 0x02 - STX,0x03 ETX

    (顶部数据包是n+1,底部数据包是对数据包n的响应)

    图2: 最后一个数据包的最后一部分- 0x00是响应的一部分,0xFF是init数据包的一部分,0x02 STX,0x03 ETX

    图3: 'count'正在准备超过8位;0xF6是数据包的一部分,0x02 STX,0x03 ETX,0xFF是init pkt的一部分。

    图4: 计数器已'滚动'-旧初始化pkt的0xFF部分- 0x01是计数的第二个字节;0x02是STX,0x03是ETX。

    因此,对于上述情况,图4中示例的计数为0x1F6。

    当我第一次看到这个问题时,我以为这是一个大/小endian的库问题,因为430是be,而我使用的ARM处理器是LE;但显然是有东西在/正在对数据包进行分组。

    在数据包响应之间,pkt被设置为所有0xFF。  

    从这些结果来看,似乎有一个缓冲区在某处存储部分数据包数据。  在我的代码中,我进入了信号长度控制DMA传输和接收,以及信号长度控制何时可以写入和读取数据包-我仍然得到了以上的结果。

    谢谢!
    John W.

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

    您好,John:

    开始调试的最佳方法是通过简化故障区域来隔离问题。 我想到了一些想法。

    • 是否可以将您的代码库剥离为仅接收和传输这些数据包? 这会将问题隔离到DMA传输,USCI TX/RX和缓冲区管理。
    • 对于从MSP发送的数据包,是否可以用已知模式的虚拟数据替换这些数据包? 是沿着两个不同数据包集的值增加线的某种情况? 这将有助于确定序列中是否有双精度值或遗漏值。

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

    实际解决方案将修正以下勘误表:

    当设备处于SPI模式时,USCI41 eUSSCI模块功能UCBUSY eUSIA模块位卡在1位。 说明在SPI模式下配置eUSCIA时,最后的传输位从0更改为1,UCBUSY位被卡在1。 这发生在时钟相位和时钟极性选项(UCAxCTLW0.UCCKPH和UCAxCTLW0.UCCKPL位)的所有四种组合中。 没有数据丢失或损坏。 由于USSCBUSY位被卡在1,时钟请求保持启用状态,并在低功耗模式操作中增加了额外的电流消耗。 解决方法检查传输或接收中断标志UCTXIFG/UCRXIFG而不是UCBUSY,以了解UCAxTXBUF缓冲区是空的还是可以容纳下一个完整字符。

    您能否告诉我TI计划何时修复该问题?
    我以前的SPI/DMA驱动程序依赖于:

    而( EUSCI_A_SPI_isBusy(EUSI_A0_base)== EUSCI_A_SPI_BUSY )//SPI仍在发送数据? -勘误表


    这一切都很好;正如《任择议定书》所述。

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

    此外,使用DMA代码时也会出现错误,必须确保数据指针为20位而不是16位。

    我认为这不是问题,但我使用的是大数据模型;我注意到库中的例程使用16位指针。

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

    在解决设备的勘误时,当计划新的设备修订版时,将查看每个勘误表,以确定是否可以在新修订版中修复。 这些决策是在新设备修订的规划阶段根据具体情况做出的。 我不能说何时将对这些器件进行新的修订,以及是否将此特定勘误表的修复包含在该修订中。

    对于DMA代码,只要您的lib不会跨越到源/目标地址的较高内存范围,16位指针就可以正常工作。 否则,需要将它们更改为20位值。