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.

[参考译文] TM4C129ENCPDT:tm4c129encpdt

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1370962/tm4c129encpdt-tm4c129encpdt

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:EK-TM4C1294XL

工具/软件:Code Composer Studio

大家好!

我目前正在处理一个项目、涉及在 DMA 模式下使用四路 SPI (QSPI)通信。 我要查找专门涉及此主题的任何文章、教程或文档。

  • QSPI 中 DMA 模式的配置和设置。
  • 演示 QSPI 与 DMA 的代码示例或示例项目。
  • DMA 模式下 QSPI 的常见缺陷和故障排除提示。

如果有人能向我介绍相关资源或分享自己的经验、我会非常感激。

提前感谢您的帮助!

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

    您好!

     我们有一个针对 QSPI 的非 DMA 示例。 您可以在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\SSI_quad_mode 中找到示例。

     我们有一个 uDMA 示例、演示了两个存储器之间以及存储器与 UART 之间的传输。 我们没有针对 QSPI 的 uDMA 示例。 但是、您可以改编 UDMA 中 UART 到 SPI 的示例。 此示例可在  C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\udma_demo 中找到。

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

    尊敬的 Priya:

    这些文档可以在 C:\ti\TivaWare_C_Series-2.1.4.178\docs 中找到。 对于"应用示例"、可以参考"SW-EK-TM4C1294XL-UG- 2.1.4.178"。 这可能有助于检查您的要求和实现的可能性。 希望这对 您有所帮助。

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

    您好 Charles、非常感谢您的响应  C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\ssi_quad_mode 此处的 示例基于 RTOS、我将寻找不带 RTOS 的示例。 我曾尝试在没有 RTOS 的情况下修改上述示例、但它对我不起作用。 如果您有任何建议、请告诉我。

    器件型号:ektm4c129exl 评估板

    主题: TivaWare_C_Series-2.2.0.295

    #包含
    #包含
    #包含
    #包含

    #include "driverlib/ssi.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"

    #include "inc/hw_ints.h"
    #include "inc/hw_ssi.h"
    #include "inc/hw_memmap.h"

    #define configCPU_CLOCK_Hz (( unsigned long ) 120000000 )
    //用于接收数据的全局变量
    uint32_t g_pui32DataRx1[4];
    uint32_t g_ui32Index = 0;
    //函数原型
    静态空 prvConfigureSSIMaster (void);
    静态空 prvConfigureSSISlave (void);
    静态空 prvSSITransmitTask (void);
    静态空 prvSSIReceiveTask (void);
    void delayMs (int ms);
    int main (空)
    {
    //将 SSI0配置并初始化为主机
    prvConfigureSSIMaster();

    //将 SSI1配置并初始化为从设备
    prvConfigureSSISlave();
    prvSSITransmitTask();
    prvSSIReceiveTask();
    while (1)
    {

    返回0;

    静态空 prvConfigureSSIMaster (void)
    {
    uint32_t ui32DummyRead;

    /*必须使能 SSI0外设才能使用。 */
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);

    /*该示例使用端口 A[7:2]作为 SSI0引脚。 GPIO 端口需要
    *启用以使用这些引脚。 */
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

    /*配置 SSI 管脚的 GPIO 设置。 该函数还为
    *控制这些引脚到 SSI 硬件。 请查阅数据表以
    *查看每个引脚分配了哪些函数。 */

    /*为 SSI0功能配置管脚复用。 SSI0对
    * SSICLK、SSIFss 和4个数据管脚。 需要启用 GPIO 端口、
    *可以使用这些引脚。
    * GPIO 引脚分配如下:
    * PA7 - SSI0XDAT3
    * PA6 - SSI0XDAT2
    * PA5 - SSI0XDAT1
    * PA4 - SSI0XDAT0
    * PA3 - SSI0Fss
    * PA2 - SSI0CLK */
    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
    GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
    GPIOPinConfigure (GPIO_PA6_SSI0XDAT2);
    GPIOPinConfigure (GPIO_PA7_SSI0XDAT3);

    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 |
    GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);

    //*配置并启用 SPI 主模式的 SSI0端口。 使用 SSI0、
    *系统时钟电源,空闲时钟低电平和低电平有效时钟
    *飞思卡尔 SPI 模式、主机模式、2MHz SSI 频率、8位数据。 实现
    * SPI 模式、您可以在 SSI 单元为
    *空闲。 您还可以配置您希望捕获数据的时钟边沿、
    *开启。 请参考器件数据表以了解有关
    *不同的 SPI 模式。 */
    SSIConfigSetExpClk (SSI0_BASE、configCPU_CLOCK_Hz、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、
    2000000,8);

    /*为 SSI0启用 Quad-SSI 模式。 */
    SSIAdvModeSet (SSI0_BASE、SSI_ADV_MODE_QUAD_WRITE);

    /*在传输期间将 FSS 引脚保持为低电平。 将控制 FSS
    *直接由 SSIAdvDataPutFrameEnd()执行。 如果调用
    * SSIAdvDataPutFrameEnd 要将数据写入 FIFO、FSS 将被取消置位
    *对应的数据。 */
    SSIAdvFrameHoldEnable (SSI0_BASE);

    /*启用 SSI0模块。 */
    SSIEnable (SSI0_BASE);

    /*从 SSI 端口读取任何剩余数据。 这可确保接收
    * FIFO 为空,所以我们不会读取任何不需要的垃圾邮件。 在这里完成
    *因为 SPI SSI 模式是全双工的,允许您发送和
    *同时接收。 SSIDataGetNonBlocking 函数返回
    *返回数据时为"true"、未返回数据时为"false"。
    *"非阻塞"功能检查接收数据中是否存在任何数据
    * FIFO 和不会"挂起"如果没有. */
    while (SSIDataGetNonBlocking (SSI0_BASE、&ui32DummyRead))
    {


    静态空 prvConfigureSSISlave (void)
    {
    uint32_t ui32DummyRead;

    //必须启用 SSI1外设。 */
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);

    /*该示例将端口 B、D 和 E 用作 SSI1引脚。 GPIO 端口
    *需要启用才能使用这些引脚。 */
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

    /*配置 SSI 管脚的 GPIO 设置。 该函数还为
    *控制这些引脚到 SSI 硬件。 请查阅数据表以
    *查看每个引脚分配了哪些函数。 */

    /*为 SSI1功能配置管脚复用。 SSI1使用
    *用于 SSICLK、SSIFss 和4个数据引脚的 PortB、PortD 和 Porte。
    *需要启用 GPIO 端口才能使用这些引脚。
    * GPIO 引脚分配如下:
    * PD5 - SSI1XDAT3
    * PD4 - SSI1XDAT2
    * PE5 - SSI1XDAT1
    * PE4 - SSI1XDAT0
    * PB4 - SSI1Fss
    * PB5 - SSI1CLK */
    GPIOPinConfigure (GPIO_PB5_SSI1CLK);
    GPIOPinConfigure (GPIO_PB4_SSI1FSS);
    GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
    GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
    GPIOPinConfigure (GPIO_PD4_SSI1XDAT2);
    GPIOPinConfigure (GPIO_PD5_SSI1XDAT3);

    GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5 | GPIO_PIN_4);
    GPIOPinTypeSSI (GPIO_PORTD_BASE、GPIO_PIN_5 | GPIO_PIN_4);
    GPIOPinTypeSSI (GPIO_Port_BASE、GPIO_PIN_5 | GPIO_PIN_4);

    /*根据匹配情况为 SPI 从机模式配置并启用 SSI1端口
    * SPI 模式、时钟速度和数据大小参数作为主机。 */
    SSIConfigSetExpClk (SSI1_BASE、configCPU_CLOCK_Hz、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_SLAVE、
    2000000,8);

    /*为 SSI1启用 Quad-SSI 模式。 */
    SSIAdvModeSet (SSI1_BASE、SSI_ADV_MODE_QUAD_READ);

    /*在接收 FIFO 为半空或多于半空时启用 SSI1中断。 */
    SSIIntEnable (SSI1_BASE、SSI_RXFF);

    /*在 NVIC 中使能 SSI1中断。 */
    IntEnable (INT_SSI1);

    /*启用 SSI1模块。 */
    SSIEnable (SSI1_BASE);

    /*从 SSI 端口读取任何剩余数据。 这可确保接收
    * FIFO 为空,所以我们不会读取任何不需要的垃圾邮件。 在这里完成
    *因为 SPI SSI 模式是全双工的,允许您发送和
    *同时接收。 SSIDataGetNonBlocking 函数返回
    *返回数据时为"true"、未返回数据时为"false"。
    *"非阻塞"功能检查接收数据中是否存在任何数据
    * FIFO 和不会"挂起"如果没有. */
    while (SSIDataGetNonBlocking (SSI1_base、&ui32DummyRead))
    {


    静态空 prvSSITransmitTask (void)
    {
    uint32_t pui32DataTx0[4]={'T'、'I'、'V'、'A'};
    INT I=0;
    /*虚拟写入以启动四路 SSI 模式操作所需的从器件。 */
    SSIDataPut (SSI0_BASE、0);
    对于(I=0;I<4;I++){
    /*检查最后一个数据字节是否排队等待发送。 */
    如果(i =(4 - 1)){
    /*在最后一个数据上调用 SSIAdvDataPutFrameEnd 将输出
    *数据并使 FSS 引脚无效。 */
    SSIAdvDataPutFrameEnd (SSI0_BASE、pui32DataTx0[i]);
    }其他{
    /*使用"阻塞" Put 函数发送数据。 */
    SSIDataPut (SSI0_BASE、pui32DataTx0[i]);


    静态空 prvSSIReceiveTask (空)
    {
    uint32_t pui32DataRx1[4];
    uint32_t ui32Index;

    /*检查接收 FIFO 中是否有可用数据*/
    while (! SSIIntStatus (SSI1_BASE、SSI_RXFF)
    {
    (一)公司名称;

    /*接收数据*/
    对于(ui32Index = 0;ui32Index < 4;ui32Index++)
    {
    /*使用"阻塞"get 函数接收数据。 */
    SSIDataGet (SSI1_base、&pui32DataRx1[ui32Index]);

    /*由于我们使用的是8位数据,因此需要对 MSB 进行屏蔽。 */
    Pui32DataRx1[ui32Index]&= 0x00FF;

    // SSI1中断处理程序
    void SSI1IntHandler (void)
    {
    uint32_t ui32Status;

    //读取中断状态
    ui32Status = SSIIntStatus (SSI1_base、true);

    //清除产生的中断
    SSIIntClear (SSI1_BASE、ui32Status);

    //检查中断是否是由于 RX FIFO 半满所致
    IF (ui32Status 和 SSI_RXFF)
    {
    //接收数据
    while (SSIDataGetNonBlocking (SSI1_base、&g_pui32DataRx1[g_ui32Index])&&(g_ui32Index < 4))
    {
    //由于我们使用的是8位数据,因此需要对 MSB 进行屏蔽
    G_pu32DataRx1[g_ui32Index]&= 0x00FF;

    //递增索引
    G_ui32Index++;

    //如果接收到所有数据
    如果(g_ui32Index >= 4)
    {
    //调用接收任务函数
    prvSSIReceiveTask();

    //重置下一次接收的索引
    G_ui32Index = 0;



    //延迟功能
    void delayMs (int ms){
    SysCtlDelay ((configCPU_CLOCK_Hz /(3 * 1000))* ms);

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

    尊敬的 Priya:

      C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\SSI_quad_mode\目录中无此类文件。 请参见下方的。 您可能使用了 https://www.ti.com/lit/pdf/spma086的应用手册中的 FreeRTOS 示例覆盖了该目录

     何不再次下载 TivaWare SDK 呢?