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.

[参考译文] TMS320F28379D:将 DMA 和 SPI FIFO 用于多个24位 SPI 从器件。

Guru**** 2528110 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/917817/tms320f28379d-using-dma-and-spi-fifo-for-multiple-24bit-spi-slaves

器件型号:TMS320F28379D

您好!

我发现自己处于一个难题中、开发一个可连接到多个 具有 SPI 接口的 RTC2344四路18位 ADC 的接口。

我的第一个想法是、这样做的理想方法是使用 DMA 通道来处理通信、而我可以在主 CPU1中执行其他操作。 我看到 了 Juan Gamba 的一篇文章,他在文章中举例说明了如何实现它,但是从我看到的情况来看,这些等待循环仍在主循环中发生,对使用 DMA 没有太大的意义,我对吗?

其次、我还意识到、对于 SPI、DMA 将传输数据大小限制为16位。 假设 ADC 能够以每通道18位+6位(配置)的方式传输所有四个通道的连续数据流、这意味着我们总共接收96位数据、我知道可以通过的接收通道中的6 16位突发来处理这些数据流、 但这对于后处理而言非常麻烦。 此外、我仍然不确定如何在 DMA 内高效处理来自从站。 有什么想法吗?

在另一个注意事项中、我还考虑仅使用实际的 SPI 模块和中断、这些模块和中断可配置为正确的位装(每个通道2x12位传输)。 不过、我对实际中断过程在这里是如何发生的非常不清楚。 我已经阅读了《技术参考手册》SPRUHM8I、但它不清楚在 FIFO 模式下在 SPI 中产生中断的原因。 (例如 、在 FIFO 模式下、当当前接收 FIFO 状态(RXFFST)与接收 FIFO 中断级别(RXFFIL)匹配时、SPI 可以中断 CPU。 如果 RXFFST 大于或等于 RXFFIL、则接收 FIFO 中断标志(RXFFINT)将被置位。 如果 RXFFINT 被置位并且接收 FIFO 中断被启用(RXFFIENA=1)、SPIRXINT 将在 PIE 块中被触发。)

对于 RX、SPI 模块是否会持续接收、直到它填满电压堆、然后这会生成一个中断来检查??

对 TX 提供了类似的说明、但在示例代码"Example_2837xDSpi_FFDLB_int.c"中、我看到数据已加载到 ISR 中的 SPITXBUF。 首先是什么生成中断?

最后、处理来自每个 SPI 从器件 ADC +多个从器件的几次信息突发的有效过程是什么?

此致、

Miguel

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

    您好、Miguel、

    将 F28379D 连接到 LTC2344将会很棘手。 以下几点:

    LTC2344似乎支持1至4个输出通道。 如果您使用单通道、则可以在 F28379D 上使用单个 SPI 模块。 但是、最大速度为50MHz、因此您的吞吐量将受到限制。

    使用多个通道将需要在 F28379D 上使用多个 SPI 模块。 该器件上只有三个 SPI 模块、因此最多可限制为3个通道 您需要继续作为主器件运行、而另外两个则作为从器件运行。  我们将讨论有关此主题的类似主题

    器件上的 VDDIO 为3.3V、但 LTC 仅支持1.8V 和5V I/O、因此您需要一个电压转换器。 不确定您是否注意到了这一点。

    SPI 模块支持最大大小为16位字符。 我想您可以通过使用8位字符大小并修改代码来生成三个背靠背8位 SPI 传输来生成所需的24个时钟、从而解决此问题。

    可能会采用 DMA。 棘手的部分是每次传输开始时的 tCONV。 您可以使用 CPU 切换 SPI_CS、然后启动计时器、这将在 X 个周期后触发 DMA (相当于 tCONV)。 在发生定时器事件时、DMA 将同时向 SPI 写入数据(以强制其生成必要的时钟)并从 SPI 读取数据(以接收来自 ADC 的数据)。 字节数将取决于您的通道配置。 对于一个通道、四个通道、DMA 将写入3个字节 x 4个通道= 12个字节并读取12个字节。

    在进一步探讨 SPI/DMA 配置之前、我建议您考虑您将面临的速度和吞吐量限制、并确定您是否仍能满足您的应用要求。

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

    您好、Gus、

    非常感谢您的意见!! 非常体贴=)

    因此、要按顺序响应您的观点、请执行以下操作:

    我确实计划使用单通道(但3个 SPI 模块中每个模块有两个从器件)。 考虑到我将这些 LTC 用于200kHz 交流/直流三相同步整流器、50MHz 的最大速度已经足够了。

    对于每侧的电压、我实际上使用具有集成直流/直流的 LTM2886-5s 在"高压"感应侧和 LV 控制侧之间实现隔离。 LV 侧提供的 VL 已设置为5V、但它允许最大输入阈值电压0.67•VL、即3.35V (我猜这应该足够好了吗?)。

    然后是通信的技术方面。 我想让芯片选择以及 CnV 和 BUSY 信号独立于实际 SPI、并且只在每个从器件的 BUSY 信号的情况下触发通信。 您的陈述(生成所需24个时钟的三个背靠背8位 SPI 传输//同时将数据写入 SPI (强制其生成必要时钟))时、会想到的一个问题是:DSP 生成的 CLK 是否仅在传输期间有效? 您是否认为也可以在整个设置中为软跨度配置生成一个传输(即使不是通过 DMA)、然后仅连续执行一个 DMA 通道来接收这12个字节的 SPI 数据(在每个12字节接收后在从站之间切换)?

    请告诉我您的想法(这是我第一次实际开发固件)。

    此致、

    Miguel

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

    米格尔

    [引用 USER="Miguel Angel Quero CORRA莱斯]我确实计划使用单个通道(但3个 SPI 模块中的每个模块有两个从站)。 考虑到我将这些 LTC 用于200kHz 交流/直流三相同步整流器、50MHz 的最大速度就足够了。[/引述]

    好的、那么每个 SPI 将连接到两个从 ADC、您将使用单独的芯片选择(CS)来一次启用一个? 如果是、请确保 ADC 在 CS 为高电平时将其输出引脚置于三态、以便将两个 ADC 的输出引脚连接在一起。

    [引用用户="Miguel Angel Quero Corrales"] DSP 生成的 CLK 是否仅在传输过程中有效?

    是的、您必须向 SPITXBUF 寄存器写入一些内容、以便 SPI 生成时钟。 因此、当您读取每个通道的24位时、您需要将虚拟数据写入 SPITXBUF。 当 SPI 传输数据时、它将同时接收数据。

    [引用 USER="Miguel Angel Quero Corrales">我的想法是让芯片选择以及 CnV 和 BUSY 信号独立于实际 SPI、并且只触发每个从器件的 BUSY 信号的通信。 [/报价]

    啊、是的、这是有道理的。

    [引用 USER="Miguel Angel Quero CORRA莱斯]您是否认为在整个设置中(甚至不是通过 DMA)只生成一个软跨度配置传输、然后连续执行一个 DMA 通道来接收这12个字节的 SPI 数据 (在每个12字节接收后在从器件之间切换)?

    查看 LTC 数据表、可以看到 LTC 在传输 SoftSpan 配置期间发送 CH0转换结果。 因此、我不认为可以完全去耦这两者。  

    我想修改我之前的发言。 DMA 仅适用于16位和32位字。 在这种情况下、最好在 SPI 上使用16位字符大小。 您的 DMA TX 通道可设置为发送大小为16位 x N 的 txbuf (其中 N = 6、因为四个 ADC 通道 x 24位/通道/16位/字= 6)。 类似地、RX 通道可以设置为接收大小为16位 x N 的 rxbuf。txbuf 中的前16位数据可以具有12位 SoftSpan 配置 (只需确保12位被移位至16位字的顶部、因为 SPI 会先将这些位移出)、其余位可以为零。 LTC 数据表中提到 SDI 线路由于某种原因需要在 SoftSpan 之后全为零(图18)。 然后、您可以为每个 SPI 从器件提供 txbuf 和 rxbuf。

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

    [引用用户="Gus Martinez"]

    好的、那么每个 SPI 将连接到两个从 ADC、您将使用单独的芯片选择(CS)来一次启用一个? 如果是、请确保 ADC 在 CS 为高电平时将其输出引脚置于三态、以便将两个 ADC 的输出引脚连接在一起。

    [/报价]

    这一点非常好。 当 CS 禁用(高电平)时、输出似乎处于高阻态、因此应该正常。

    [引用用户="Gus Martinez"]

    是的、您必须向 SPITXBUF 寄存器写入一些内容、以便 SPI 生成时钟。 因此、当您读取每个通道的24位时、您需要将虚拟数据写入 SPITXBUF。 当 SPI 传输数据时、它将同时接收数据。

    查看 LTC 数据表、可以看到 LTC 在传输 SoftSpan 配置期间发送 CH0转换结果。 因此、我不认为可以完全去耦这两者。  
    [/报价]

    在《在 CMOS I/O 模式下对 SoftSpan 配置寄存器进行编程》(第34页)下进一步了解一下、似乎可以执行一些明智的操作、即在首次传输时首先配置 SoftSpan (除非更改、否则 IC 能够保持该配置)、 之前启用 DMA 传输和接收、然后将转换(softstPAN 的新配置)配置为整个事务期间的全零(这在 SoftSpan 配置中似乎是一个例外、因为它还允许保留先前的配置、这是一个奇迹!)。

    [引用用户="Gus Martinez"]

    我想修改我之前的发言。 DMA 仅适用于16位和32位字。 在这种情况下、最好在 SPI 上使用16位字符大小。 您的 DMA TX 通道可设置为发送大小为16位 x N 的 txbuf (其中 N = 6、因为四个 ADC 通道 x 24位/通道/16位/字= 6)。 类似地、RX 通道可以设置为接收大小为16位 x N 的 rxbuf。txbuf 中的前16位数据可以具有12位 SoftSpan 配置 (只需确保12位被移位至16位字的顶部、因为 SPI 会先将这些位移出)、其余位可以为零。 LTC 数据表中提到 SDI 线路由于某种原因需要在 SoftSpan 之后全为零(图18)。 然后、您可以为每个 SPI 从器件提供 txbuf 和 rxbuf。

    [/报价]

    正是我所想的。 借助前面评论中的额外信息、我认为这应该可行、只是对从 ADC 接收到的数据进行了一些修改。

    非常感谢、我将尽快更新结果、但我认为这解决了我对现在的疑虑。

    感谢你们这么高效的沟通,到目前为止最棒的体验!

    Miguel