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.

[参考译文] TMS320F28388D:具有16个以上字的 SPI 传输

Guru**** 2538960 points
Other Parts Discussed in Thread: TMDSCNCD28388D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1075423/tms320f28388d-spi-transmission-with-more-than-16-words

部件号:TMS320F28388D
“线程”中讨论的其它部件:TMDSCNCD28388DC2000WARETEST

大家好,

我使用 TMDSCNCD28388D controlCARD 作为 SPI 从控制电源转换器。 应用程序正在接收来自顶层控制单元(SPI 主控制单元)的参考,并在 DSP 中生成调制和 PWM 信号以驱动 IGBT, 同时,DSP 将模拟测量和不同 的故障反馈信号发回 主控制器,以计算新的设定点。 此应用程序可能需要多个大于16的单词来交换所有需要的变量,特别是在由同一单元控制多个转换器时。

将应用程序放在一边,重点是如何实现大于16个字的 SPI 传输。 我已经尝试使用 FIFO 和非 FIFO 模式(  分别使用 SPI_writeDataBlockingFIFO/SPI_readDataBlockingFIFO 和 SPI_writeDataBlockingNonFIFO/SPI_readDataBlockingNonFIFO),并且我总是会发现字数大于16时的限制。 沟通至少有16个字,可以按预期方式进行。 但是,我在发送/接收更多字词时无法成功,有人能帮助解决这个问题吗?

此外,最好避免 SPI 中断,因为它还使用 EtherCAT 通信,并且具有最高优先级。

提前感谢!  此致,

米格尔

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

    您好,

    如果要交换16个以上的单词,显然需要在 FIFO 被填充之前清空它。

    如果您不想使用中断,我建议您为此使用 DMA。

    此致,

    克莱蒙特

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

    克莱门特,您好!

    感谢您的回答!

    我没有这款 DSP 的 DMA 经验,但正如我在 TI 提供的下一个示例(C:\ti\C2000\C2000Ware_4_00_00_00\driverlib\f2838x\examples\C28x\SPI\SPI_EX5_loopback_DMA.c)中所看到 的,它使用 FIFO 和 SPI 中断。 应该避免这种情况,因为 EtherCAT 中断旨在成为唯一使用的中断。 因此,我的问题是:

    是否有任何方法可以清空 RX FIFO 以接收新数据,并在 TX FIFO 中填充新变量,以便在前16个字后发送给主中继器,而不使用中断?

    我希望你们或其他人能帮助我。 再次感谢!

    巴西,

    米格尔

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

    米格尔

    您是否已经检查了最近发布的 C2000Ware 中可用的 SPI_NANNEBytes 和 SPI_receiveNBytes 函数(基于轮询的函数)?

    我还鼓励您查看以下不使用中断的示例。

    SPI_ex6_EEPROM -使用轮询方法

    SPI_EX7_EEPROM_DMA -使用 DMA 传输和接收。

    此致,

    马诺伊

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

    我当时假设你有一种实时周期,这样你就可以“燃烧并忘记”DMA 直到下一个周期,让他管理。

    这基本上是我们在设计中的管理方式,在每个实时周期,我们都会告诉 DMA 在何处获取/存储数据,然后在下一个周期,数据将存储在内存中,我们会将其检索。

    循环中没有 IT 使用。

    克莱蒙特

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

    您好,Manoj,

    感谢您的回复!

    是的,我已经检查了 C2000 Ware 中的所有可用示例以及我正在使用的 DSP 的 spi.h 和 SPI.c 文件。 我会详细介绍我的系统,以便更好地概述。

    我的应用中的 DSP 用作 SPI 从属器,因此我怀疑我可以使用 EEPROM 示例,因为 DSP 在那里充当主器。

    我 的 SPI 从属设备连接到实时系统(从现在开始 RTS)(具体说是 PLECS RT Box 3),该系统可以模拟我们要控制的不同电源转换器。 该 RTS 有一个 SPI 主块,该主块只能是主块,它以较低的级别管理 CLK 和 CS 线路,因此不能以任何方式触发或控制 SPI 通信的启动。 它仅具有 SPI 块的采样时间设置,该时间是 RTS 循环时间的倍数。 每个 SPI 采样时间,RTS 都会按顺序发送定义的字数(最多可达127个),从而在内部控制 CLK 和 CS 线路。 当然,此块具有常规设置,如 CLK 极性和相位等。此外,唯一可用的输入和输出是要发送的数据的 Tx 端口和接收从设备发送的数据的 Rx 端口。 这些端口是矢量化的, 其大小等于 SPI 主块中设置的字数。

    因此,我想阅读 DSP 中 RTS (转换器模拟变量和故障状态)发送的所有字,同时从 DSP 向 RTS 传输 PWM 调制的新比较值。 由于控制要求,我需要使用16位字,并且无法使用  SPI_TRANNEBytes 和 SPI_receiveNBytes 函数,因为 RTS 不允许我在传输后连接8位字。 这也会减少我可以用2个字来表达的数量。

    正如我所提到的,我可以用几个字<=到16来建立 DSP 和 RTS 之间的通信。 当我尝试发送更多信息时,DSP 寄存器上没有任何活动。 即使前16个单词也不会发送/接收。 现在您对我的应用程序和限制有了更多了解,您可以提供一些解决方案或提示吗?

    提前感谢!  巴西,

    米格尔

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

    克莱门特,您好!

    再次感谢您的帮助和时间!

    实际上,我 正在研究一种实时应用程序,因此这可能是一种可能性。 您是否知道我可以在哪里找到有关如何以这种方式配置和使用 DMA 的示例? 或者,您可以共享一些我可以用作起点的基本代码吗? 非常感谢。

    此外,如果你不介意,你也许可以看看我对 Manoj 的答复,我在这里详细阐述了我的申请。 也许,这可以让你更好地了解我要做的事情,并且你提出了一些我可以尝试实施的想法/解决方案。


    再次感谢! 巴西,

    米格尔

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

    您好,米格尔,

    不,我不会后悔,当我们从《技术参考手册》开始定义 DMA 配置时。
    最后,代码示例 将不会为您提供一切答案,特别是外围设备如何有效工作。

    DMA 是一种需要配置的复杂外围设备,尤其是在进行从内存到寄存器的交换时,这种情况尤其明显。

    我已经阅读了您对您的申请的解释,我发现了一些潜在的问题:

    1. 如果要接收的字词数量是可变的,则需要考虑一些 SW 机制来管理该 wrt。DMA 配置。
    2. 您说您尝试发送超过16个单词,但这意味着您尝试输入的数据要多于 FIFO 能够接收的数据,因此这让人感到奇怪。
    3. 如果您的 DSP 是从属设备,如果您的 RTS 和 DSP 未同步,则必须小心进行初始交换。

    克莱蒙特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="5126100" url="~/support/moncs/c2000微控制器-组/CC2000 /f/c2000 -微控制器-论坛/1075423/tms320f28388d-spi-transmission -包含16个字以上的字/3980305#3980305]],我提到,可以在数字小于16的 DSP 和数字的 RTS 之间建立通信。 当我尝试发送更多信息时,DSP 寄存器上没有任何活动。 即使前16个单词也不会发送/接收。 既然您对我的应用程序和限制有更多了解,那么您是否可以提供一些解决方案或提示?

    我会使用 DMA - SPI 来实现您正在尝试的目标。 需要配置 DMA 来控制 SPI 从服务器的传输和接收操作。 为 SPI 接收器操作分配 DMA 通道,为 DMA 传输操作分配另一个 DMA 通道。 对 SPI 从 RTS 接收的每个字都触发 SPIRXDMA,并在 SPI TX 缓冲区为空时触发 SPITXDMA。

    SPI_EX7_EEPROM_DMA 示例代码显示了如何使 SPI-DMA 在主模式下工作。 了解此示例代码是一个很好的起点,因为它显示了如何为 RX/TX 信道配置 DMA。

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

    克莱门特,您好!

    在此找到我对您的观点的答案:

    1.字数不可变。 它将取决于要控制的转换器,但我们计划根据转换器拓扑,为要发送/接收的字数设置一组#defines。 但我们确信,对于最简单的转换器(2级3相逆变器),字数超过16。

    2.我正在尝试发送32个字作为 SPI 通信的测试用例。 我打算用16个字进行2次传输。  我要做 的是用首字母16字填充 FIFO,然后在这些字被传输后和从主控收到的16字后,用接下来的16个字填充 FIFO,重复该过程。 但这似乎是我失败的地方,FIFO 正在溢出。 您对如何实现这一目标有什么意见吗? 当然,如果可能的话。

    3.是的,我已经意识到这可能是一个问题。 但幸运的是,可以实现同步。

    再次感谢! 巴西,

    米格尔

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

    您好,Manoj,

    我目前正在研究这种选择。 但使用 DMA 的学习曲线似乎相当陡峭。 我希望我能及时获得一些东西。

    但是,通过分析建议的示例,我可以看到它如何使用 FIFO 和 DMA 中断。 我在 TRM 中看到,当 DMA 处理外围设备时,这不会干扰 CPU。 这是真的吗? 这些中断是否会影响由 CPU 处理且必须具有最高优先级的 EtherCAT 中断? 或者,您认为这不会是问题,也不会影响 EtherCAT 通信?

    再次感谢! 巴西,

    米格尔

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

    您好,米格尔,

    哪个 FIFO 溢出? 接收或传输?

    无论如何,您只需写下 FIFO 中的可用字数,您的代码就可以对此进行检查。

    关于您对 DMA 的怀疑,是的,只要您不是将 CPU 和 DMA 访问同时进行的内存定位为目标,它就不会干扰 CPU,否则将会进行仲裁。

    如果您不允许 DMA 或 SPI 中断(通过 PIE)传播到 CPU,则不会向 CPU 传播,因此您不应该担心这一点。

    DMA (如果配置为)对文字接收或发射作出反应。

    巴西,
    克莱蒙特

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

    克莱门特,您好!

    我认为这两者都是因为 DSP 没有从主中继器接收任何内容,而主中继器接收到的前16个单词的2倍于 FIFO。 最后16个丢失/未加载。  关于您的观点,如果我先加载16个字,然后再加载16个字,则无法写入 FIFO。 是否可以清空 FIFO 并加载第二个包含16个字的软件包? 我想我不完全理解 FIFO 当时的工作原理。

    感谢您对 DMA 的评论,这非常有用。

    巴西,

    米格尔

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

    米格尔

    FIFO 是一个队列,一个单词不在其中,您就可以添加一个单词。

    如果已发送单词,则无需手动清空任何内容,FIFO 将被清空  

    您的 FIFO 被检索数据的主中继器清空。

    克莱蒙特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="5126100" url="~/support/moncs/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1075423/tms320f28388d-spi-transmission - with-more-16-Words /3981373#3981373英寸]我在 TRM 中读到,DMA 处理外设时,不应干扰 CPU。 这是真的吗? [/引用]

    是的,DMA 可用于处理 SPI 传输和接收通道,而无需 CPU 干预。

    [引用 userid="5126100" url="~/support/minors/c2000-minor-group/CC2000 /f/c2000微控制器-forume/1075423/tms320f28388d-spi-transmission-with-more-16-Words /3981373#3981373]\n 这些中断是否会影响由 CPU 处理且必须具有最高优先级的 EtherCAT 中断? 或者,您认为这不会是问题,也不会影响 EtherCAT 通信?

    这里有两件事。

    1) EtherCAT 属于连接管理器子系统(ARM M4),该子系统具有自己的中断处理程序,不应受到连接到 C28x-CPU 的 C28x-SPI 的影响

    2)您可以灵活地不为 SPI 事务触发 CPU 中断(C28x 中断),方法是在 EPIE 中不为 SPI /甚至 DMA 启用中断。

    此致,

    马诺伊

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

    克莱门特和马诺伊,

    我一直在研究和使用 SPI + DMA 解决方案。 到目前为止,我已经很好地了解了 DMA 模块及其配置。 我已经根据这些示例编写了自己的代码,从16个字开始,我已经用主发送的数据填充了我收到的数据值; 但是,即使我的发送数据缓冲区已填充,主中继器也不会从我的从属设备接收任何数据。

    我附上我的代码以查看您是否可以帮助我解决此问题:

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"
    //#包括"board.h"

    //
    //定义
    //
    #define GPIO PIN_SPIA_SIMO 58.
    #define GPIO 引脚 SPIA_SOMI 59.
    #define GPIO 引脚 SPIA_CLK 60.
    #define GPIO PIN_SPIA_Sten 61.

    #define SPI_SLAVE_BASE SPIA_BASE
    #define SPI_Slave 比特率32000000

    #define buer_length 16 //要传输/接收的单词数

    #define FIFO _LVL 8 // FIFO 中断级别
    #define burst FIFO _LVL //每个暴冲将清空 FIFO
    #define transfer buer_length/FIFO _LVL //传输需要4次突发,每次8次
    // RDATA 中的所有数据

    //
    //全球
    //
    UINT16_t sData[buer_length];//发送数据缓冲区
    UINT16_t RDATA[buer_length];//接收数据缓冲区

    //将缓冲区放置在 GSRAM 中
    #pragma data_section (sData,"ramgs0");
    #pragma data_section (RDATA,“ramgs1”);

    挥发 uint16_t done = 0;//标记以设置所有数据传输的时间

    //
    //函数原型
    //
    使 initdma(void);
    使 initSPIFO(void);
    中断 void dmaCh5ISR(void);
    中断 void dmaCh6ISR(void);

    //
    //主页
    //
    主无效(无效)

    UINT16_t i;

    //
    //初始化设备时钟和外围设备
    //
    device_init();

    //
    //禁用引脚锁定并启用内部上拉。
    //
    device_initGPIO ();

    //
    //初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
    //
    interrup_initModule();

    //
    //使用指向 shell Interrupt 的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrup_initVectorTable();

    //
    //主板初始化
    //
    //Board_init();

    //
    //本示例中使用的中断将重新映射到 ISR 功能
    //在此文件中找到。
    //
    中断寄存器(INT_DMA_CH5,&dmaCh5ISR);
    中断寄存器(INT_DMA_CH6,&dmaCh6ISR);

    //
    //设置用于 SPI 的 DMA,初始化用于 FIFO 模式的 SPI
    //
    initdma();
    initSPIFO();


    //
    //初始化数据缓冲区
    //
    对于(i = 0;i < buer_length;I++)

    sData[i]= i;
    RDATA[I]= 0;
    }

    //
    //启用此示例所需的中断
    //
    Interrup_enable (INT_DMA_CH5);
    Interrup_enable (INT_DMA_CH6);

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    //
    //启动 DMA 通道
    //
    DMA_startChannel (DMA_CH6_BASE);
    DMA_startChannel (DMA_CH5_BASE);

    //
    //等待 DMA 传输完成
    //
    while (!done);

    //
    // DMA 传输完成后,程序将在此处停止
    //
    ESTOP0;
    }

    //
    //在 FIFO 模式下配置 SPI A 的函数。
    //
    ininitSPIFO()无效

    //
    // SPI 引脚的配置
    //

    // SIMO
    GPIO 设置精确配置(GPIO_58_SPIA_SIMO);
    GPIO 设置 PadConfig (GPIO_58_SPIA_SIMO,GPIO 引脚类型上拉);
    GPIO 设置限定模式(GPIO_58_SPIA_SIMO,GPIO Qual_Asynos);

    // SOMI
    GPIO 设置引脚配置(GPIO_59_SPIA_SOMI);
    GPIO _setPadConfig (GPIO_59_SPIA_SOMI,GPIO 引脚类型上拉);
    GPIO 设置限定模式(GPIO_59_SPIA_SOMI,GPIO Qual_Asynos);

    // CLK
    GPIO 设置引脚配置(GPIO_60_SPIA_CLK);
    GPIO _setPadConfig (GPIO_60_SPIA_CLK,GPIO 引脚类型上拉);
    GPIO 设置限定模式(GPIO_60_SPIA_CLK,GPIO Qual_Asynos);

    //统计
    GPIO 设置引脚配置(GPIO_61_SPIA_Sten);
    GPIO 设置 PadConfig (GPIO_61_SPIA_Sten,GPIO 引脚类型上拉);
    GPIO 设置限定模式(GPIO_61_SPIA_Sten,GPIO Qual_Asynos);

    //
    //配置 SPI 之前必须将其重置
    //
    SPI_disableModule (SPI_Slave 基础);

    //
    // FIFO 配置
    //
    SPI_enableFIFO (SPI_Slave 基础);
    SPI_clearInterruptStatus (SPI_Slave_base,SPI_INT_RXFF | SPI_INT_TXFF);
    SPI_setFIFO InterruptLevel (SPI_Slave_base,(SPI_TxFIFO OLevel)先进先出_LVL,
    (SPI_RxFIFO (双相)先进先出(FIFO) LVL);

    SPI_setConfig (SPI_SLAVE_BASE,DEVICE_LSPCLK_FREQ,SPI_PROT_POL0PHA0,
    SPI_MODE_SLAVE,32000000,16);
    SPI_enableHighSpeedMode (SPI_SLAVE_BASE);
    SPI_disableLoopback (SPI_Slave 基础);
    SPI_setEmulationMode (SPI_SLAVE_BASE,SPI_Emulation_FREE_RUN);

    SPI_enableModule(SPI_Slave 基础版);
    }

    //
    // TX 和 RX 信道的 DMA 设置。
    //
    使 initdma()无效

    //
    //初始化 DMA
    //
    DMA_initController();

    //
    //为 TX 配置 DMA Ch5。 如果 FIFO 中有足够的空间,则为数据
    //将从 sData 缓冲区传输到 SPI 模块的传输
    //缓冲寄存器。
    //

    DMA_configAddresses (DMA_CH5_BASE,(uint16_t *)(SPIA_BASE + SPI_O_TXBUF),
    sData);
    dma_configBurst (dma_ch5_base,burst,1,0);
    DMA_configTransfer (DMA_CH5_BASE,传输,1,0);
    DMA_configMode (DMA_CH5_BASE,DMA_TRIG_SPIATX,DMA_CFG_OneShot_disable |)
    DMA_CFG_Continuous 启用| DMA_CFG_SIZE _16BIT);

    //
    //配置 DMA Ch5中断
    //
    DMA_setInterruptMode (DMA_CH5_base,DMA_INT_AT_END);
    DMA_enableInterrupt (DMA_CH5_BASE);
    DMA_enableTrigger (DMA_CH5_BASE);

    //
    //为 RX 配置 DMA CH6。 当 FIFO 至少包含8个字的“至”时
    //读取,数据将从 SPI 模块的接收缓冲区传输
    //注册到 RDATA 缓冲区。
    //

    DMA_configAddresses (DMA_CH6_BASE,RDATA,
    (UINT16_t *)(SPIA_BASE + SPI_O_RXBUF);
    dma_configBurst (dma_ch6_base,burst,0,1);
    DMA_configTransfer (DMA_CH6_BASE,TRANSFER,0,1);
    DMA_configMode (DMA_CH6_BASE,DMA_TRIG_SPIARX,DMA_CFG_OneShot_disable |)
    DMA_CFG_Continuous 启用| DMA_CFG_SIZE _16BIT);

    //
    //配置 DMA Ch6中断
    //
    DMA_setInterruptMode (DMA_CH6_BASE,DMA_INT_AT_END);
    DMA_enableInterrupt (DMA_CH6_BASE);
    DMA_enableTrigger (DMA_CH6_BASE);
    }

    //
    // DMA 通道5 ISR
    //
    _interrupt void dmaCh5ISR (void)

    DMA_STopChannel (DMA_CH5_BASE);
    interrup_clearACKGroup (interrup_ACK_group7);
    返回;
    }

    //
    // DMA 通道6 ISR
    //
    中断 void dmaCh6ISR (void)

    //uint16_t i;

    DMA_STopChannel (DMA_CH6_BASE);
    interrup_clearACKGroup (interrup_ACK_group7);

    //
    //检查数据完整性
    //
    /*for (i = 0;i < 128;I++)

    如果(RDATA[i]!= i)

    //出现问题。RDATA 不包含预期数据。
    ESTOP0;
    }
    }

    完成= 1;*
    返回;
    }

    我希望你们能帮我解决这个问题。 提前感谢!

    此致,

    米格尔

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

    更新到上一个帖子!

    我也能从从属设备传输到主设备,问题出在连接硬件上...

    但是,所附代码仅适用于16个字。 如果我超过该数字,通信就不会发生。 如无 DMA 版本所示。 您能帮您解决这个问题吗?

    再次感谢!

    米格尔

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

    在 DMA ISR 例程中,您正在传输/接收16个字后停止 DMA 通道。 正因为如此,当您尝试传递16个以上的单词时,它不起作用

    在以下配置中,

    从代码片段中:

    #define buer_length 16 //要传输/接收的单词数

    #define FIFO _LVL 8 // FIFO 中断级别
    #define burst FIFO _LVL //每个暴冲将清空 FIFO
    #define transfer buer_length/FIFO _LVL //传输需要4次突发,每次8次

    burn_size 为8个字。 这意味着您希望 DMA 对来自 SPI 的 DMA 触发事件执行8字传输。

    transfer_size 为2次突发。 这意味着一次 DMA 传输在两次突发后完成(8个字/突发)。 因此,在发射/接收两次突发(16个字)后,DMA 通道将停止(或停止)。 您是否尝试将传输大小增加到3 (或) 4。

    TRANSFER_SIZE 为3表示,您需要24个字的传输。

    TRANSFER_SIZE 为4表示,您需要32个字的传输。

    此致,

    马诺伊

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

    亲爱的 Manoj:

    从代码中可以看出,传输大小是根据 buer_length 和 FIFO _LVL 计算的。 因此,如果其中任何一个值发生变化,传输大小将相应调整。 在我的案例中,我已将 buff_length 从16更改为32,当我调试代码时,收到的数据缓冲区将填充“0”

    您能想到其他原因来解释为什么不能正常工作吗?

    谢谢! 此致,

    米格尔

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

    米格尔

    您是否在单影像模式下操作 DMA?

    您是否在读取0时检查过是否存在溢出情况? 此外,主管理员是否发送非零字?

    请探查您的 SPI 总线以获取任何线索。

    此致,

    马诺伊

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

    您好,Manoj,

    是的,我正在以一拍模式操作 DMA。

    我发现了这个问题,它是在实时系统方面(主)。 它的步长需要相应地增加,使之与要传送的字数相对应。 但是,如果这段时间太短,它不会发出任何错误或警告。

    感谢您的帮助和支持! 现在我觉得我在这款 DSP 的 SPI 和 DMA 上都变得更强大了。 您可以关闭线程

    祝你度过美好的一天! 此致,

    米格尔

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

    很想知道您能够解决这个问题。 我将结束这一主题