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.

[参考译文] RTOS/MSP432P401R:TI-RTOS SDSPI 驱动程序和 DMA。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/628743/rtos-msp432p401r-ti-rtos-sdspi-driver-and-dma

器件型号:MSP432P401R
主题中讨论的其他器件:MSP430F6659

工具/软件:TI-RTOS

您好!

我一直在使用 TI-RTOS 和 TI-Drivers 开发一个项目、并且一直在尝试使用由德州仪器提供的具有 SDSPI 驱动程序的 FatFs。 在查看 MSP432和其他 TI MCU 的 SDSPI 代码实施时、我意识到它使用裸 SPI 而不是 DMA 来执行事务。 SDSPI 驱动器中是否存在阻止使用 DMA 的限制? 我认为这很奇怪、因为当前 SPI 驱动程序实施 DMA 来执行事务、SDSPI 不执行事务、但 DMA 在处理 SD 时非常重要。 TI 能否提供一些指导。 谢谢。

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

    您好、Otavio、

    [引述 USER="Otavio Augusto Gomes"]是否有一些限制阻止将 DMA 与 SDSPI 驱动程序一起使用? [/报价]

    我 不这么认为 、我认为这与 FatFs 的工作方式有关 、但让我在内部进行讨论、然后我会与您联系。

     谢谢、

     David

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

    我不知道我的问题是否真的很清楚。 我想了解为什么 MSP432的 TI-RTOS SDSPI 驱动程序实施不在内部执行数据锁 Tx/Rx 的带有 DMA 的 SPI 事务。 例如、SDSPIMSP432.c 中的数据锁 TX 函数

    静态 bool xmit_datablock (SDSPIMSP432_HWAttrsV1 const *hwAttrs、
    const uint8_t * buf、uint8_t token)
    {
    uint8_t resp;
    uint8_t wc;
    
    if (WAIT_READY (hwAttrs)!= 0xFF){
    /*返回时出错*/
    返回(false);
    }
    
    /* Xmit 数据令牌*/
    txSPI (hwAttrs、token);
    
    /*仅当令牌!= STOP_MULTIBLOG_TOKEN 时发送数据*/
    if (token!= stop_multiblock_token){
    /*是数据令牌*/
    WC = 0;
    /*使用8位计数器传输512字节块*/
    执行{
    /*发送 SD_Sector_size 字节数据块*/
    txSPI (hwAttrs、*buf++);
    txSPI (hwAttrs、*buf++);
    } while (-wc);
    
    /*未来增强以添加 CRC 支持*/
    txSPI (hwAttrs、0xFF);
    txSPI (hwAttrs、0xFF);
    
    /*检索数据响应*/
    RESP = rxSPI (hwAttrs);
    
    /*如果不接受,则返回错误*/
    if ((RESP & 0x1F)!= 0x05){
    返回(false);
    }
    }
    
    /*成功返回*/
    返回(true);
    } 


    我们可以看到,xmit_datablock()调用函数 txSPI()以将512字节数据块写入 SD 卡,但 txSPI 在没有 DMA 功能的情况下执行事务,如下面所示。

    静态内联 void txSPI (SDSPIMSP432_HWAttrsV1 const *hwAttrs、uint8_t dat)
    {
    uintptr_t 密钥;
    
    KEY = Hwip_disable();
    
    /*等待所有 TX/RX 完成*/
    while (!(map_spi_getInterruptStatus (hwAttrs->baseAddr、
    EUSCI_A_SPI_Transmit 中断)和 EUSCI_A_SPI_Transmit 中断){}
    
    /*将数据写入 TX */
    map_spi_transmitData (hwAttrs->baseAddr、dat);
    
    /*等待所有 TX/RX 完成*/
    while (!(map_spi_getInterruptStatus (hwAttrs->baseAddr、
    EUSCI_A_SPI_Receive_interrupt)和 EUSCI_A_SPI_Receive_interrupt){}
    
    /*写入期间读取的清除数据*/
    map_spi_receiveData (hwAttrs->baseAddr);
    
    Hwip_restore (key);
    } 

    我认为使用 DMA 可以大大提高数据吞吐量、 从而在数据传输到 SD 卡时使处理器无需执行其他任务。 是否有修改此驱动器以包含此功能的指南、或者是否有此操作的限制?

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

    您好、Otavio、

     是的、您的问题非常清楚。   几个月前,我有一个类似的问题。

    [引用用户="Otavio Augusto Gomes"]我认为,使用 DMA 可以大大提高数据吞吐量, 使处理器在数据传输到 SD 卡时无需执行其他任务

    的确、我为此编写了一个示例代码、请告诉我您是否想获得我修改过的文件的副本

    [报价用户="Otavio Augusto Gomes"]是否有修改此驱动器以包含此功能的指南,或者是否有限制?

    没有、就我所知、也没有限制。 但请了解这是 第三方软件、 如果 TI 对此软件进行了任何修改、则 TI 必须拥有并维护它。  

     希望这对您有所帮助。

       David

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

    尊敬的 David:

    感谢您的回答。

    [引用用户="DavidL"]

    的确、我为此编写了一个示例代码、请告诉我您是否想获得我修改过的文件的副本

    [/报价]

    我对如何在 TI SD 驱动程序中实现 DMA 有一些看法。 但是 、如果您能为我提供上述文件、我将不胜感激。 我打算将 DMA 的使用范围扩展到其他 TI SimpleLink 驱动程序。

    [引用用户="DavidL"]

    没有、就我所知、也没有限制。 但请了解这是 第三方软件、 如果 TI 对此软件进行了任何修改、则 TI 必须拥有并维护它。  

    [/报价]

    不用担心、我知道 TI 许可条款。

    再次感谢 David!

    此致。

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

    我将代码脱机发送到您的 utfpr 电子邮件帐户。

    此致、

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

    尊敬的 David:

    我有完全相同的请求。 我已修改 FatFs 低级文件中的代码(HAL_SDCard.c)、以使用 UCB2 SPI 触发器在 MSP430F6659上启用 DMA 的读取、但我的第一个实现失败(如下所示)。 因此、我想请求您的示例代码来查看我出错的地方。 但我很高兴知道这可以起作用。

    空 SDCard_init (空)

    静态无符号字符 TxRxDummy = 0xFF;

    针对 SD 卡操作的//端口初始化
    SPI_SEL |= SPI_CLK | SPI_SOMI | SPI_SIMO;
    SPI_DIR |= SPI_CLK | SPI_SIMO;
    SD_CS_SEL &=~SD_CS;
    SD_CS_OUT |= SD_CS;
    SD_CS_DIR |= SD_CS;

    //KLQ
    SPI_REN |= SPI_SOMI | SPI_SIMO;
    SPI_OUT |= SPI_SOMI | SPI_SIMO;
    //KLQ

    //初始化 SPI 主控操作的 USCI_B1
    UCB2CTL1 |= UCSWRST;//Put 状态机处于复位状态
    UCB2CTL0 = UCCKPL | UCMSB | UCMST | UCMODE_0 | UCSYNC;// 3引脚8位 SPI 主器件
    //时钟极性选择-无效状态为高电平
    //MSB 优先
    UCB2CTL1 = UCSWRST | UCSSEL_2;//使用 SMCLK、保持复位
    UCB2BR0 = 32;//初始 SPI 时钟必须小于400kHz (更改为12.288MHz/32=384)
    UCB2BR1 = 0;//f_UCxCLK = 25MHz/63 = 397kHz
    UCB2CTL1 &=~UCSWRST;//释放 USCI 状态机
    UCB2IFG &=~UCRXIFG;

    ////设置 DMA 以获取传输帮助
    //////----- 第1阶段:初始化 DMA3 TX ---
    // DMACTL0 |= DMA3TSEL_15;//步骤1.1:将传输触发器设置为 DMA 通道3传输选择15:USCIB2发送
    // DMACTL4 |= ENNMI + DMARMWDIS;//步骤1.2:启用 DMA 以使用 NMI (不可屏蔽中断)暂停
    // DMA3CTL = DMADD_0 //步骤1.3:单次传输(DMAEN 被禁用、当 DMA0SZ 计数为0时、必须为每个传输集重新启用)
    //| DMADSTINCR_0 //步骤1.4:无目的增量(字节宽源)
    //| DMASRCINCR_0 //步骤1.5:使源字递增(字节宽目的)
    //| DMADSTBYTE;//步骤1.6:字节传输(8位)
    //////----- 第2阶段:初始化 DMA4 RX ---------------
    // DMACTL0 |= DMA4TSEL_14;//步骤2.1:将传输触发器设置为 DAC12_0 (DAC12IFG 控制 DMA 以将值加载到 DAC12_0数据锁存器中)
    // DMA4CTL = DMADD_0 //步骤1.3:单次传输(DMAEN 被禁用、当 DMA0SZ 计数为0时、必须为每个传输集重新启用)
    //| DMADSTINCR_0 //步骤2.3:无目的增量(字宽源)
    //| DMASRCINCR_0 //第2.4步:按字递减源(字宽目的)
    //| DMADSTBYTE;//步骤1.6:字节传输(8位)

    / //**
    *@通过 DMA 上的 SPI 简要读取一帧字节
    *@param pbuffer 位置来存储接收到的字节
    *@param 大小指示要接收的字节数
    *@返回无
    秘书长的报告 /
    //void SDCard_readFrame (uint8_t * pbuffer、uint16_t size)
    //{
    //
    //静态无符号 char TxRxDummy = 0xFF;
    //
    // UCB2IFG &=~UCRXIFG;//确保 RXIFG 被清零
    //
    // DMA3DA =&UCB2TXBUF;//步骤1.7:目标地址固定在 USCI TX 缓冲区
    // DMA3SA =&TxRxDummy;//步骤1.8:源地址设置为一个恒定的虚拟写入字节
    // DMA3SZ =大小;//步骤1.9:传输数设置为帧大小
    // DMA3CTL = DMAEN;
    //
    // DMA4DA = pbuffer;//步骤2.6:目标地址固定在接收缓冲区电流扇区
    // DMA4SA =&UCB2RXBUF;//步骤1.8:源地址设置为 StimulusArray 的起始点(默认= WarbleTone @ 1000Hz)
    // DMA4SZ =大小;//步骤1.9: 传输数设置为帧大小
    // DMA4CTL = DMAEN;
    //}

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

    尊敬的 David:

    抱歉、我正在闭合线程之间跳跃。

    您是否可以发送那些使用 SPI-DMA 组合进行 SD 卡读写的文件?

    我也希望对我的项目使用相同的概念。

    此外、还想进一步查询 SDSPI 执行中使用的 SPI 函数。

    我看到只有在成功执行 SDSPI_open 函数调用时、函数"SDSPIMSP432_diskWrite"才会被注册。

    这是否意味着只有在我们执行应用程序代码中的 f_open 或 f_write 函数时才调用函数 SDSPIMSP432_diskWrite?

    我尝试验证 SD 卡线路上的 SPI 通信、因为调用函数 f_open 时出错。 即使 f_mount 始终成功、我始终得到的错误仍然是 FR_NOT _READY。

    不确定原因是什么?

    提前感谢您。

    Vikram

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

    我对拖延表示歉意。 请离线与我联系(您可以单击我的个人资料并以这种方式向我发送私人消息)。

    谢谢、

    David