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.

[参考译文] TMS320F2808:不同的晶振会导致 SPI 发送的数据出现异常。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1240059/tms320f2808-different-methodes-can-cause-anomalies-in-the-data-sent-by-spi

器件型号:TMS320F2808
主题中讨论的其他器件: C2000WARE

尊敬的专家

问题说明:
TMS320F2808 DSP SPI 通信在中断期间以18KHz 周期执行 SPI 传输。 以下两种不同的方法可能会导致 SPI 发送的数据出现异常。
第一种方法是将18KHz 分成两个9KHz、然后发送第一个9KHz。 待发送的数据存储在 SpiaRegs.SPITXBUF 中;以第二个9KHz 的频率进行接收并读出 SpiaRegs。 SPIRXBUF 寄存器数据。 SpiaRegs 的操作。 SPITXBUF 和 SpiaRegs。 SPIRXBUF 的时间间隔为55.56us。 在这种工作条件下、未发现 SPI 发送的数据有异常。
第二种方法是对 SpiaRegs 执行运算。 SPITXBUF 和 SpiaRegs。 SPIRXBUF 每18K 寄存一次。 首先、阅读 SpiaRegs。 SPIRXBUF、执行数据处理、然后将要传输的数据存储到 SpiaRegs 中。 SPITXBUF。 读取 SpiaRegs 之间的时间间隔。 SPIRXBUF 并将数据存储到 SpiaRegs。 SPITXBUF 大约只有几微秒。 这种工作状态下、SPI 发送的数据异常。
注意:在读取 SpiaRegs 前未评估 SPI 的状态。 SPIRXBUF 并将数据存储在 SpiaRegs 中。 SPITXBUF。

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

    我不完全了解您的代码流程。 几个问题。

    您的 SPI 数据大小和时钟是多少? 您需要确保 SPI 运行得足够快、能够在18kHz 时间范围内完成传输。

     如果使用 FIFO 模式、在向 SPITXBUF 写入新值之前是否检查了 SPI TXFFST 位? 如果不使用 FIFO、在向 SPITXBUF 写入新值之前是否检查了 SPI INT FIFO 标志?

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

    尊敬的 Gus  

    1. 您的 SPI 数据大小和时钟是多少? 您需要确保 SPI 运行得足够快、能够在18kHz 时间范围内完成传输。

    -> SPI 数据大小为32位、SPI 时钟频率为3.125MHz。

     

     

    1. 如果使用 FIFO 模式、在将新值写入 SPITXBUF 之前是否检查了 SPI TXFFST 位? 如果不使用 FIFO、在向 SPITXBUF 写入新值之前是否检查了 SPI INT FIFO 标志?

    -> 我们不使用 FIFO 模式、也不检查任何 SPI 标志是否将新值写入 SPITXBUF。

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

    您应该在将新值写入 SPITXBUF 之前使用 SPI 标志。 请参考 C2000ware 随附的代码示例。

    C:\ti\c2000\C2000Ware_4_03_00_00\device_support\f2802x\examples\structs\spi_loopback

    C:\ti\c2000\C2000Ware_4_03_00_00\device_support\f2802x\examples\drivers\spi_loopback

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

    尊敬的 Gus

     

    感谢您的信息。 我还有一些问题:  

    1. 我必须优先考虑 SPITXBUF、SPIRXBUF 没有那么严格、SPI 在中断中写入 SPITXBUF 和读取 SPIRXBUF。 因此、在向 SPITXBUF 写入新值之前我无法获得 SPI 标志。 您有什么好主意吗?
    2. 如果 SPI 接收许多缓冲区、但我无法及时读取 SPIRXBUF、这不会导致错误的溢出错误或其他错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我必须确定 SPITXBUF 的优先级,SPIRXBUF 不够严格,SPI 在中断中写入 SPITXBUF 并读取 SPIRXBUF。 因此、在向 SPITXBUF 写入新值之前我无法获得 SPI 标志。 您有什么好主意吗?

    如果设置了 TX_BUF_FULL_FLAG、则不能将新数据写入 SPITXBUF。 如果执行此操作、则会覆盖之前的数据。 在将数据写入 SPITXBUF 之前、您必须检查此标志。

    如果 SPI 收到许多缓冲区,但我无法及时读取 SPIRXBUF,它不会导致错误的溢出错误或其他错误?

    可以。

    您是否在从模式下使用 SPI? 如果是、您提到的18kHz ISR 与 SPI 主器件请求数据的速度之间有何关系? 换句话说、如何确保 SPITXBUF 始终在 SPI 主器件开始新事务之前准备好数据?  

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

    尊敬的 Gus

    您是否在从模式下使用 SPI? 如果是、您提到的18kHz ISR 与 SPI 主器件请求数据的速度之间有何关系? 换句话说、如何确保 SPITXBUF 始终在 SPI 主器件开始新事务之前准备好数据?  

     

    ->不对、我们在 DSP2808中使用主模式。 SPI 从对象是 FPGA、每次主机发送数据时 FPGA 应答数据。

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

    感谢您的澄清。 在这种情况下、可以按照以下序列向 SPI 从器件发送32位。

    • CPU 等待 SPI TX 缓冲区已满=>= 0 //确保 SPITXBUF 未满
    • CPU 写入16位 SPITXBUF
    • CPU 等待 SPI INT 标志= 1 //等待 SPI 从从器件接收16位
    • CPU 读取16位 SPIRXBUF
    • CPU 等待 SPI TX 缓冲区已满=>= 0 //确保 SPITXBUF 未满
    • CPU 写入16位 SPITXBUF
    • CPU 读取 16位 SPIRXBUF //等待 SPI 从从器件接收16位