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.

[参考译文] TMS570LS3137:发送多个24位传输组

Guru**** 2556880 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1267878/tms570ls3137-sending-multiple-24-bit-transfer-groups

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

我使用 MIBSPI1与 AD5676 SPI 接口8通道 DAC 进行通信。  它使用24位传输。  

我可以 使用单个传输组 length=3、数据格式=8位、芯片选择保持=1、成功地写入和读取 DAC。

我需要在 ISR 中向 DAC 发送8条命令(配置所有8个通道)-而无需 CPU 干预每条命令。  或者换句话说、我需要从一个 ISR 内部自动发送8 24个位传输组。

我看过 HALCoGen DMA SPI 示例、但它似乎对我的情况不起作用。  

使用 IRQ 链接传输将不起作用、因为我需要在 FIQ 这种 ISR 中启动传输。

我该怎么做?

谢谢。

-乔

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

    您好、Joe!

    我只是和你的要求混淆了!

    我需要在 ISR 中向 DAC 发送8条命令(配置所有8个通道)-而无需 CPU 干预每条命令。  或者换句话说、我需要从 ISR 内部自动发送8 24个位传输组。

    请参阅 ISR 需要 CPU 干预。 没有 CPU 的干预、ISR 例程就不能执行。

    您可以使用中断模式或 DMA 模式。 不能将两者同时使用。 DMA 模式是不需要 CPU 干预的模式。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    感谢您的回复。  

    对于 CPU 干预、我的意思是 CPU 可以从 ISR 启动8条命令传输、但不能由 CPU 单独处理每条命令。

    您能不能举个例子来说明如何使用 DMA 来发送多个24位传输组?

    谢谢!

    -乔

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

    您好、Joe!

    为延误道歉,我们在印度有最后三天的假期。

    您能否查看以下主题:

    (+)[常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    在这里、您可以找到几个 SPI DMA 示例、只需使用关键字"spi"进行搜索即可。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好、感谢这些额外的代码示例、我以前从未见过它们。

    我 仔细查看了 Hercules Examples-MASTER\Application\TMS570_SPI_DMA、但由于我不熟悉 Hercules DMA、对于如何在不使用中断的情况下通过 DMA 发送8个不同的24位传输组、我仍然感到困惑。  是否有随  TMS570_SPI_DMA 示例代码一起提供的应用手册?

    谢谢。此致、

    -乔

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

    您好、Joe!

    实际上、SPI 默认不支持24位字符长度:

    它最多只支持16位字符长度。 那么、我在这里的问题是、在正常模式下(没有 DMA)、您说过可以正常运行、不会有任何问题、对吗?

    那么、您定义了什么字符长度?

    您是否要逐字节发送?

    您是否在通信中使用芯片选择?

    我是否能够看到下面类似的 MOSI、CLK 和 CS 的波形?

    如果您提供上述详细信息、我可以提供理想的解决方案。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    是的、使用 MIBSPI1、  通过使用选中"Chip Select Hold"的内置 CS_0在传输组中发送3个8位数据格式、我可以成功地将单个24位传输发送至 AD5676。  请参阅下面的 HALCoGen 配置屏幕截图。

    这是我当前的传输代码:

    //将数据复制到 SPI 数据寄存器
    mibspiSetData (DAC_MIBSPI、c_spiTransferGroup0、g_spiTransmitBuffer);

    //开始 SPI 传输
    MibspiTransfer (DAC_MIBSPI、c_spiTransferGroup0);

    //等待传输完成
    while (!(mibspiIsTransferComplete (DAC_MIBSPI、c_spiTransferGroup0));

    遗憾的是、我现在无法用示波器捕获事务。  如果这很关键、请告诉我、我可以采取步骤对其进行设置。  

     如果您想弄清楚如何使用 CPU 来发送8条背对背24位命令(每条命令都带有自己的 CS 置位/置位)、而 CPU 只是用来启动该过程、那我们将不胜感激、

    此致、

    -乔

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

    您好、Joe!

    感谢您提供详细信息!

    如果我正确理解您的要求、下面是您正在尝试的操作。

    您需要 激活 CS 并想要发送3个字节、之后您需要切换 CS 线路、然后再次发送另外3 个字节并希望在3个字节结束时切换 CS 位、 该过程应需要针对8条命令(共24个字节)继续执行。

    例如、我希望实现以下内容:

    我想将0x0000写入8个 DAC 输入寄存器。

    因此、命令为0x1、地址位为0x0到0x7、所以我想发送以下八个24位数据到帧

    0x100000、0x110000、0x120000、0x130000、0x140000、 0x150000、0x160000 和0x170000 。

    为此、我只遵循您的方法、我需要以字节格式传输数据、并且我希望每3个字节保留一条 CS 线路。  

    这意味着、我要将以前的数据除以

    0x10、0x00、0x00、0x11、0x00、 0x00、0x12、0x00、0x00、0x13、 0x00、0x00、0x14、0x00、0x00、 0x15、0x00、0x00、0x16、0x00、 0x00、0x17、0x00、0x00。

    但采用这种方法使用 DMA 时、非常重要的一点是、我不想只传输8位数据。

    因为我需要控制 CSHOLD 位也是正确的、所以我想从 DMA 执行32位传输。

    如果我想保持 CS 线路、我想将 CSHOLD 位写为1;如果不想保持 CSHOLD 位、我想将 CSHOLD 位写为0。

    这意味着我想在前两个字节时保持 CS 线路、并且在发送第三个字节时不想保持 CSHOLD。

    这意味着我的 DMA 传输数据将变为

    0x10FE0010、0x10FE0000、0x00FE0000、0x10FE0011、0x10FE0000、 0x00FE0000、0x10FE0012、0x10FE0000、0x00FE0000、0x10FE0013、 0x10FE0000、0x00FE0000、0x10FE0014、0x10FE0000、0x00FE0000、 0x10FE0015、0x10FE0000、0x00FE0000、0x10FE0016、0x10FE0000、 0x00FE0000、0x10FE0017、0x10FE0000、0x00FE0000

    如果解码一个字、例如 0x10FE0010

    这里 CSHOLD 第28位是1。

    由于我正在使用 CS0、CSNR 将为0xFE。

    我们配置了8位传输、TXDATA 为0x0010、因此高字节不会仅发送到从器件、即0x10会发送到从器件。

    下面是我的实现方式:

    测试后的结果如下:

    下面是我的完整项目、供您参考:

    e2e.ti.com/.../4300.SPI_5F00_DMA_5F00_TEST_5F00_LC4357.zip

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    非常感谢提供示例代码和清晰的说明。  您的输出波形看起来正是我需要的。

    我将您的代码复制到一个新的 TMS570LS3137 HALCoGen 项目中、并进行了一些编辑、以便从使用 SPI3转换为 SPI1、但我在 TMS570LS3137 HDK 电路板上的 SPI1 CS 或 CLK 上无法获得任何输出。  

    下面是我的完整项目供您参考、希望您能发现问题。  e2e.ti.com/.../SPI_5F00_DMA_5F00_TEST.zip

    您是否拥有 TMS570LS31x HDK 的访问权限?  

    我想知道 LC4357与 LS3137之间需要的代码差异?

    此致、

    -乔

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

    您好、Joe!

    您是否有权访问 TMS570LS31x HDK?  [/报价]

    遗憾的是、我没有 TMS570LS31x 板。

    请给我一点时间、我将尝试在 LC4357上创建 SPI1示例。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    现在、我已使 SPI1 CLK 和 CS 正常工作、但 CS 在整个传输过程中保持有效、请参阅所附的示波器照片。  抱歉、分辨率低、只有2个通道。  下方的波形为 CLK、上方的波形为 CS0/。

    为了使这一功能在目前为止可以正常工作,我按照另一个3137 MIBSPI DMA 示例,在 dmaConfigCtrlTxPacket ()中将 DMA PORTAGN 值从1更改为4。  我认为3137和 LC4357之间存在差异。

       G_dmaCTRLPKT_TX。 PORTASGN = 4;// PORTA_READ_PORTB_WRITE;

    我附上了我的项目作为参考。

    e2e.ti.com/.../SPI_5F00_DMA_5F00_TEST_5F00_11Oct2023.zip

    似乎 SPI1 TX 的 DMA 工作正常。  

    发送的数据与您的示例相同、我想知道哪些因素会导致 CS 无法根据数据中的 CSHOLD 值取消置位

    再次感谢您的所有帮助!

    此致、

    -乔

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

    Jagadish、您好!

    我发现 CS 无效脉冲太窄、无法显示在示波器上、但8个 DMA 事务(当我从电路中移除示波器时)成功写入 DAC! :-)   

    非常感谢你的所有帮助,代码,和伟大的解释!

    -乔

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

    Jagadish、您好!

    另一个、希望最后一个?、问题:

    如果 DMA 事务已完成、建议通过什么方式来判断?

    谢谢、此致、

    -乔

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

    您好、Joe!

    如果 DMA 事务已完成,您建议通过什么方法来判断 DMA 事务是否已完成?

    您可以通过轮询或启用 BTC 中断来找出。

    在本例中、该标志将在传输所有8条命令后置1。

    --

    谢谢。此致、
    Jagadish。

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

    谢谢 Jagadish!

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

    Jagadish、您好!

    虽然我可以执行1 8个命令 DMA 传输、但我无法成功完成第二个成功的传输。  我等待并通过轮询 BTC 标志来检查以确保第1个设置已完成、  

    我是否需要每次复位 DMA 引擎?

    您能否对系统进行快速测试、看看您是否可以执行2个或3 8个命令事务?

    谢谢。

    -乔

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

    您好、Joe!

    是否需要每次重置 DMA 引擎?

    无需复位 DMA 引擎。

    最简单的方法是在重新启用信道之前清除 BTC 标志、如下所示:

    --
    谢谢。此致、
    Jagadish。