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.

[参考译文] AM6548:跨域 SPI DMA

Guru**** 2540720 points
Other Parts Discussed in Thread: SYSBIOS, AM6548

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/946136/am6548-cross-domain-spi-dma

器件型号:AM6548
Thread 中讨论的其他器件:SYSBIOS

您好!

我正在 J20连接器中测试 AM65X IDK 的 SPI。 它是 MCSPI1。 我的代码正在 R5F 内核上运行、在对 驱动程序表进行少量更改后、我可以发送和接收。

我想测试 DMA、我的问题是:  是否可以通过 MCU 域的 DMA 访问主域中的外设?

我找到 pdk_jacinto_07_00_00\packages/ti\drv\spi\examples\mcspi_slavemode\示例、并且能够成功运行它、但它处理内部连接的 SPI 端口、而无需域交叉。

此致、

卡尔曼

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

    卡尔曼、

    使用 MCU1_0的主域 UDMA/外设没有限制。

    您需要调整 SPI_SoC.c 以使用主域 McSPI 外设和主域 McSPI PDMA 线程

     #if 已定义(_Aarch64__)

    #define SPI_PDMA_TX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILD_THREAD_OFFSET + 0U)

    #define SPI_PDMA_RX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILS_THREAD_OFFSET + 0U)

    其他

    #define SPI_PDMA_TX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MCU_PDMA_MCU1_PSILD_THREAD_OFFSET + 0U)

    #define SPI_PDMA_RX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MCU_PDMA_MCU1_PSILS_THREAD_OFFSET + 0U)

    将其更改为

    #define SPI_PDMA_TX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILD_THREAD_OFFSET + 0U)

    #define SPI_PDMA_RX_THREAD_BASE       (CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILS_THREAD_OFFSET + 0U)

    #endif

     

    #if 已定义(_Aarch64__)

           /*主域*/

           CSL_MCSPI0_CFG_base、               /* baseAddr */

           CSL_IC0_INTR_MCSPI0_BUS_INTR_SPI、 /* intNum *

    其他

           /* MCU 域*/

           CSL_MCU_MCSPI0_CFG_base、

           CSL_MCU0_INTR_MCSPI0_INTR_SPI、

    将其更改为

            /*主域*/

           CSL_MCSPI0_CFG_base、               /* baseAddr */

           ??、 /* intNum */  

    #endif

    对于 intNum、通过 TRM、 MAIN2MCU_LVL_INTR0路由器允许从主电压域中选择192个级别的中断中的任何64个、以便通过 MAIN2MCU_LVL_INTR0_MUXCNTL_y 寄存器路由到 MCU R5内核

    表9-64. MAIN2MCU_LVL_INTR0中断映射

    MAIN2MCU_INTRTR_LVL_IN_96 96 96 SPI_0_INT SPI0中断级别

    我正在尝试找到一个参考代码、以便您通过 SYSFW 对中断路由进行编程。

    此致、

    Garrett

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

    您好、Garrett、

    感谢您的提示。

    我在运行时制作了这个 HACK、以便从 R5F 到达 MCSPI1:

    /*将 MCSPI1添加到驱动程序表中*/
    SPI_socGetInitCfg (2、&SPI_cfg);
    SPI_cfg.baseAddr = CSL_MCSPI1_CFG_base;
    SPI_socSetInitCfg (3、&SPI_cfg);
    
    /*将 MCSPI1_CLK 引脚多路复用器配置为接收、PDK 的 HACK */
    HW_WR_REG32 (((CSL_CTRL_MMR0_CFG0_BASE + CSL_MAIN_CTRL_MMR_CFG0_PADCONFIG0 + MCU_SPI1_CLK_PADCFG_OFFSET)、PIN_MODE (0)|\
    ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE)&(~PIN_PULL_DIRECTION));
    
    

    然后、我将根据您的建议尝试向"黑客"条目添加更多详细信息。

    欢迎使用任何非常简单的代码示例:首先、我只想发送和接收一个字节的缓冲、并按示波器观察信号。 我已 通过跳线帽将 MOSI 环回 J20连接器的 MISO 引脚。

    此致、

    卡尔曼

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

    卡尔曼、

     有关 SPI 函数 spiTestInteruptConfig(),请参阅随附的 MAIN2MCU 中断路由器文件。

    SPI 单元测试使用的中断编号在文件 intRtr_cfg.h 中定义

    e2e.ti.com/.../IntRtr_5F00_cfg.h

    e2e.ti.com/.../spiTestApp.c

    此致、

    Garrett

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

    您好、Garrett、

    您的第一个建议已经解决了我原来的问题。

    我对驱动程序表进行了进一步的攻击:

    /*将 MCSPI1添加到驱动程序表中*/
    SPI_socGetInitCfg (2、&SPI_cfg);
    SPI_cfg.baseAddr = CSL_MCSPI1_CFG_base;
    spi_cfg.intNum = CSLR_MAIN2MCU_LVL_INTR0_IN_MCSPI1_INTR_SPI_0;
    SPI_cfg.rxDmaEventNumber =(CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILS_THREAD_OFFSET + 0U)+ 4U;
    SPI_cfg.txDmaEventNumber =(CSL_PSILCFG_NAVSS_MAIN_PDMAIN1_PSILD_THREAD_OFFSET + 0U)+ 4U;
    SPI_socSetInitCfg (3、&SPI_cfg);
    

    查看我的 oscillogram:

    对于~750 μ s、芯片选择为低电平、数据传输(32字节@ 12.5 MHz)需要26 μ s。 这就是为什么我不在这里结束这个主题。

    我如何避免浪费这么长的时间?

    此致、

    卡尔曼

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

    卡尔曼、

    最近对 SPI 延迟进行了一些性能优化、让我了解一下最新状态、然后返回给您。

    此致、

    Garrett

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

    您好、Garrett、

    只需对 DMA 模式下的 SPI 驱动器做一点评论:

    我尝试发送260个字节、但只有256个字节通过32个字节 FIFO 进行传输(rxTrigLv = txTrigLevel = 32)。 将 FIFO 触发电平更改为1时、我得到的所有260字节。 该功能是在驱动程序中规划的(使用 FIFO 还是 DMA)、还是刚刚规划好?

    此致

    卡尔曼

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

    卡尔曼、

    我认为、根据设计、如果 Rx/txTrigLevel = 32、剩余的4个字节将不会传输。 理想情况下、它似乎是额外字节所需的超时函数。

    此致、

    Garrett

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

    您好、Garrett、

    我可以在 DMA 上使用低 FIFO 级别设置。 您是否有关于芯片选择时序的任何新信息?

    此致

    卡尔曼

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

    您好、Garrett、

    您是否有关于缩短较长芯片选择时间的信息?

    此致、

    卡尔曼

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

    卡尔曼、

    经过优化的代码当前以 CSL 而非 PDK SPI 驱动程序示例的形式实现、并附有 PDK v7.0的补丁。 您认为是否有用、或者您是否需要启用 DMA 的基于 SPI 驱动程序的实现?

    此致、
    Garrett

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

    您好、Garrett、

    一个漂亮而快速的 SPI 驱动器将是最好的、但是任何工作代码都是受欢迎的。

    此致、

    卡尔曼

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

    您好、Kalman、

    对延迟答复表示歉意。 我们已将此主题分配给新的所有者。 他们将在下周的某个时间(如果不是更早)为您提供回复。

    此致、

    Nick

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

    您好 Nick!

    我正在等待一个好的解决方案:-)

    BTW:

    PDK 的现有 SPI_transfer 函数对于处理命令、地址和虚拟字节等 SPI 开销时处理 EEPROM 或闪存器件而言不是高效/最佳的。 只读和只写操作不能"连接"并由单芯片选择活动覆盖(或者我还没有找到它)。 最好在驱动程序或专用芯片选择控制功能中具有此类存储器访问功能、至少切换 MCSPI_CHCONF_x.force 位。 还是应该使用 GPIO 输出进行存储器芯片选择?

    此致、

    卡尔曼

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

    您好、Kalman、

    我是该主题的新所有者。

    在 SPI 驱动程序方面、我们提供的唯一驱动程序是 pdk_jacinto_07_00_00\packages/ti\drv\SPI pdk_jacinto_07_00_00\packages/ti\CSL\src\IP

    感谢您对连接的只读和只写操作的反馈、我将与开发团队分享。 同时、另一个选项是使用 GPIO 输出进行存储器芯片选择、如您所述。

    此致、

    Dillon

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

    您好 Dillon、

    请不要忘记原始主题:在 DMA 模式下具有快速芯片选择功能的优化 MCSPI 驱动器。

    此致、

    卡尔曼

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

    您好、Kalman、

    我们提供的两个 MCSPI 驱动器位于  pdk_jacinto_07_00_00/packages/ti/CSL/src/IP/mcspi/V0/和  pdk_jacinto_07_00_00/packages/ti/drv/spi/src/v1/中。  

    此致、

    Dillon

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

    您好 Dillon、

    我已经进行了一些性能评估:131字节传输(从64KB EEPROM 读取128字节)@ 10MHz SPI 时钟频率、FIFO 关闭

    净数据传输时间为131 * 0.8 μ s = 104.8 μ s

    1. PDK

    ChipSelect 的宽度为5.6msec、除以131 =~42usec/字节

    McSPI

    我已经使用 mcspi 编写了我自己的 SPI 传输函数。

    结果:1.488msec / 131字节=~ 11usec/字节

    3.避免重复的地址计算

    我已经改进了我的代码、以避免每个 mcspi 函数调用进行寄存器地址计算。 我已经为相关寄存器定义了指针;在传递函数中仅计算一次指针值、并通过指针访问寄存器。

    uint32_t* rxReg =(uint32_t*)(baseAddress + CSL_MCSPI_RX0 +(chNum * 0x14));
    
    newData =* rxReg;//而不是 HW_RD_REG32 (baseAddr + MCSPI_CHRX (chNum))) 

      

     结果:327usec / 131字节=~2.5usec /字节

    我将尝试将 FIFO 处理添加到我的代码中、希望获得更好的结果、

    是否有任何提高驱动器性能的计划?

    我还需要您的帮助:是否有可用的中断驱动 SPI 示例?

    我已经尝试在 SPI_HWAttrs 结构中启用中断、但代码会运行以中止。 这可能是我的错、但我不知道如何让它变得更好?

    此致、

    卡尔曼

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

    您好、Kalman、
    感谢您提供的反馈和测试说明。 我将把这一信息传递给开发团队、以改进驾驶员。

    在中断驱动 SPI 示例中、  位于 pdk_jacinto_07_00_00/packages/ti/drv/spi/example/mcspi_slavemode/src/的 main_mcspi_slavemode/src/中的 main_mcspi_mode_mode.c 示例包含一些启用中断的测试。

    静态空 SPI_initconfig (uint32_t 实例、SPI_Tests *测试、uint32_t CHN、bool multiChn)
    {
    SPI_HWAttrs SPI_cfg; 

    此外 、AM335x SDK 中包含的 PDK 中还有一个示例。 该示例可在 pdk/packages/ti/drv/spi/example/firmware_example/src/smain_test.c 中找到、要查看的主要部分为 ESPI_test() Hwip_enableInterrupt ()。

    这些示例中的任何一个是否提供了您要查找的代码?

    此致、
    Dillon

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

    您好 Dillon、

    我已将缺少的中断路由器配置添加到我的代码中:

    /*中断必须从 MCSPI1路由到 mcu0 */
    /* cslr_intr_main2mcu_lvl_intrtr0.h 包含路由器输入端的 mcsp1中断号*/
    /* cslr_soc_baseaddress.h 包含路由器寄存器地址*/
    
    #define MUX_CHANNEL 63U //必须在[0..63]范围内
    spi_cfg.intNum = CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0 + MUX_CHANNEL;
    HW_WR_REG32 (CSL_MAIN2MCU_LVL_INTR0_CFG_BASE + 4U +(4 * MUX_CHANNEL)、CSLR_MAIN2MCU_LVL_INTR0_IN_MCSPI1_INTR_SPI_0);
    

    它按预期将0x00000061写入地址0x00A10100、并将 intNum 设置为223 (0xDF)。

    然后、我通过 enableIntr = true 设置启用中断。

    最后调用 SPI_transfer (具有131个字节) 会启动传输、芯片选择变为低电平、传输32个字节、但不再传输!  MCSPI_v1_hwiFxn 函数仅调用一次。 它应该运行5次。 芯片选择保持低电平。

    MCSPI1_CFG_MCSPI_XFERLEVEL 为0x00631B1F;这种情况有效是因为已发送32个字节、99个字节(0x63)正在等待传输。

    您对丢失的中断调用有什么想法吗?

    此致

    卡尔曼

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

    您好、Kalman、

    您使用哪种传输模式?

    默认模式为"SPI_MODE_BLOCK"、但尝试将传输模式设置为"SPI_MODE_CALL"。  

    此外、您使用的其余 SPI 参数是什么?

    /*!
    *@简要 SPI 参数
    *
    * SPI 参数与 SPI_OPEN ()调用一同使用。
    这些参数的默认值使用 SPI_PARAMS_INIT ()进行设置。
    *
    *@sa SPI_Params_init ()
    */
    typedef 结构体 SPI_Params_s{
    SPI_TransferMode 传输模式; /*!<阻塞或回叫模式*/
    uint32_t transferTimeout;/*!<系统中的 Transfer timeout
    节拍数(不支持全部
    实现*/
    SPI_CallbackFxn transferCallbackFxn;/*!<回调函数指针*/
    SPI_Mode 模式; /*!<主或从模式*/
    uint32_t 比特率; /*!<以 Hz 为单位的 SPI 比特率*/
    uint32_t 数据大小; /*!<以位为单位的 SPI 数据帧大小*/
    SPI_FrameFormat 帧格式; /*!< SPI 帧格式*/
    无效 *自定义; /*!<驱动程序使用的自定义参数
    实施*/
    }SPI_Params; 

    此致、

    Dillon

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

    您好 Dillon、

    我已更改为 SPI_MODE_CALLACK、但结果相同。 并添加了从未调用过的回调函数(因为中断处理程序只运行一次而不是运行5次...)

    以下是我在调用 SPI_open 之前的参数(它们正常、我得到了我的预期)

    然后、我通过调用 SPI_transfer 函数来执行主模式读取/写入。

    我认为 MCSPI_v1_hwiFxn 中断处理程序中有问题。

    它在开始时读取中断状态寄存器并将其保存在 intCode 中。 然后读取/写入 Tx/Rx 寄存器、在必要时更改 FIFO 触发级别等、最后根据保存的 intCode 清除中断。 当同一中断在操作期间上升时、它将丢失。

    是的、发生了这种情况!

    IRQSTATUS 是0x00000001、CHSTATUS 是0x0000002A、位于 MCSPI_v1_hwiFxn 中断处理程序的开头。 我用手清除了 IRQSTATUS、最后得到:

    CHSTAT 已更改为0x2F、发送/接收32个字节期间、IRQSTATUS 已改回1。 这个1将被最后一条指令清零、并且中断将丢失。

    可以检查一下吗?

    此致、

    卡尔曼

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

    您好 Dillon、

    将 IRQ 清除移动到中断处理程序表单的开始已得到帮助、但这还不够。 我已更改重建 PDK (2-3小时内:-)),并得到:

    中断已运行4次(而不是1次!!!)、XFERLEVEL = 0x00030302、剩余3个字节、FIFO 触发电平已正确调整;CHSTAT = 0x2F、但 IRQSTATUS0。 然后丢失第5个中断调用、该中断调用应发送剩余的3个字节并读取4并关闭芯片选择、即完成操作。

    你有什么想法吗?

    此致、

    卡尔曼

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

    您好、Kalman、

    尝试在 MCSPI_v1_hwiFxn 内设置断点 、并单步执行代码以查看 IRQSTATUS 设置为0的确切时刻。 一旦您跟踪了将 IRQSTATUS 设置为0的条件、请将其发布在此处、以便我更好地了解导致您所面临问题的原因。

    此致、

    Dillon

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

    您好 Dillon、

    下面是我的总结:

    IRQ

    线
      IRQ
    使能
    IRQ
    状态
    通道
    统计
    Xfer
    电平
    CHCONF 备注 RxFFF RxFFE TxFFF TxFFE EOT TXS RX
    3. 944. McSPIIntStatusClear 之前 00020005 1 2F 00431B1F 381603D0   0 1 0 1 1 1 1
      946 在 McSPIIntStatusClear 之后   0 2F 00431B1F     0 1 0 1 1 1 1
      961. MCSPI_transmitData_v1之后   0 0f 00421B1F   W1. 0 0 0 1 1 1 1
      985 在 MCSPI_receiveData_v1之后   0 2F 00421B1F   R1 0 1 0 1 1 1 1
        …μ A                          
      961. MCSPI_transmitData_v1之后   0 0f 00241B1F   发送了31个字节 0 0 0 1 1 1 1
      985 在 MCSPI_receiveData_v1之后   0 2F 00241B1F    R31 0 1 0 1 1 1 1
      961. MCSPI_transmitData_v1之后   1 0f 00231B1F   W32. 0 0 0 1 1 1 1
      985 在 MCSPI_receiveData_v1之后   1 2F 00231B1F   R32 0 1 0 1 1 1 1
    4. 944. McSPIIntStatusClear 之前   1 2F 00231B1F     0 1 0 1 1 1 1
      946 在 McSPIIntStatusClear 之后   0 2F 00231B1F     0 1 0 1 1 1 1
      …μ A                            
      961. MCSPI_transmitData_v1之后   0 0f 00041B1F   发送了31个字节 0 0 0 1 1 1 1
      985 在 MCSPI_receiveData_v1之后   0 2F 00041B1F   R32 0 1 0 1 1 1 1
      961. MCSPI_transmitData_v1之后   0 0f 00031B1F   W32. 0 0 0 1 1 1 1
      985 在 MCSPI_receiveData_v1之后   0 2F 00031B1F   R32 0 1 0 1 1 1 1
      1057. 在 McSPIFOTrigLvlSet 之后   0 2F 00030302.   准备最后一个 IRQ 0 1 0 1 1 1 1

    第一个和第二个运行等于第三个运行。 写入/读取每个字节时、CHSTAT.RXFFE 标志会切换。 IRQSTATUS.TX0_EMPTY 在写入第32个字节后置1、第4次运行除外。

    SPRUID7E 数据表第 8640页12.1.4.7.1.1章中的状态:

    "TXx_EMPTY 位在缓冲器中有足够的空间写入由 MCSPI_XFERLEVEL[5-0] AEL 位字段定义的多个字节时立即被置位。"

    有足够的空间容纳32个字节、还有3个字节、这应该足以设置请求、但 FIFO 中断逻辑与此星座图不同。 我已经考虑过时序、但在1MHz 和100kHz 时也得到了相同的结果。 我认为在调整 XFERLEVEL 寄存器中的触发级别值后,处理程序不应该返回,而是跳回开始并处理剩余的字节:-)

    10月9日、我在 DMA 上观察到类似的情况、当时我必须将 FIFO 水平降低到1才能传输所有字节。 这个解决方案在这里也有帮助、我将 FIFO 级别设置为0、即、关闭。

    这是使用修改后的中断处理程序(FIFO 关闭)进行的中断驱动 SPI 传输

    通过轮询、3.77毫秒的传输时间优于5.6毫秒、但太慢(131字节@ 10 MHz、~ 28微秒/字节)。

    您是否有更好的 SPI 驱动器?

    此致、

    卡尔曼

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

    您好、Kalman、

    感谢您的详细总结。  

    我们只有前面提到的两个驱动程序。 我将继续并在此处列出它们:

    • pdk_jacinto_07_00_00/packages/ti/CSL/src/IP/mcspi/v0/
    • pdk_jacinto_07_00_00/packages/ti/drv/spi/src/v1/

    作为测试,您是否可以尝试将数据大小从131字节增加到132、136、140、144 ... 160? 这样、我们就可以了解您的最终转账是否需要最小值、或者您在最终转账中遇到任何低于32的值的问题。

    此致、

    Dillon

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

    您好 Dillon、

    当需要更多的传输并且最后一个块小于 FIFO 大小时、就会产生问题(丢失最后一个中断)。

    字节计数 SPI 字节 结果 XFERLEVEL IRQEN CHSTAT
    10. 10. 好的 00000909 00000000 2e
    64 64 好的 00001B1F 00000000 2e
    65 64 00000001 00020005 2F
    95 64 001F1B1E 00020005 2F

    10 和64字节正常、传输正常、CS 变为高电平、驱动器关闭 SPI 通道。

    65和95字节错误、64字节被发送、最后一个中断丢失、CS 保持低电平。

    不要让我测试所有可能的 FIFO 长度设置,我会把这个职责留给 TI 的软件研究员;-)。

    但是、与硬件开发人员讨论这个问题会很有趣:这里会发生什么以及为什么预期的中断丢失?

    此致、

    卡尔曼

    PS:我设法单击了"已解决"按钮、现在我无法将其重新设置。

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

    您好、Kalman、

    我认为我理解您所面临的问题、下面让我总结一下这些问题、并尝试解决这些问题

    1. 优化的 SPI 驱动器/实现
    2. 当前实现–ISR 实现存在问题

    第二,我同意这是一个问题,在 ISR 结束时,如果设置了 INT,它应该跳回开头,并且一旦进入 ISR,就清除 INT。 如果您可以分享您为模拟此问题所做的更改、我可以将其用作缺陷的参考/测试案例。 我正在使用内部 JIRA ID PDK-8946来跟踪此缺陷是否关闭(一旦外部发现此问题、我将更新此主题)。

    第1点、基于 SYSBIOS 的驱动程序是一种通用驱动程序、很难在极低的开销下满足非常严格的期限/运行要求。 但是、我们可以使用 CSL 并实现所需的 SPI 操作。 pdk\packages/ti\cSL\examples\mcspi\mcspiMasterPerformance 中的示例在轮询/非中断模式下启用 FIFO 的情况下执行简单传输。 您能否在轮询模式下检查性能是否满足您的要求? 或者、如果您可以详细说明您的要求、我可以检查如何满足该要求(例如、为了在 CSL 示例中支持中断模式、需要其他一些配置)

    我还将检查是否可以将此线程移动到未解析的位置。

    此致、Sujith

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

    您好、Sujith、

    #1)非常感谢明确的 CSL 路径 pdk\packages/ti\cSL\examples\mcspi\mcspMasterPerformance!! 我一直在寻找类似的简单代码、只是不够聪明/幸运找到它。 我尝试构建和调试它、并成功使用 pdk_jacinto_07_00_00\packages/ti\CSL\examples\mcspi\mcspiMasterSlave\mcspiMasterSlave_SPI1_SPI2_v1.c 进行轮询(在内部。我没有将其重定向到 J20以观察信号)。 另一个文件 mcspiMasterSlave_SPI1_SPI2.c 看起来很有趣、因为我要查找 DMA、但我看到它不适用于 AM65xx、它涉及 EDMA 而不是 UDMA。 我是对的吗? 或者如何将其用于 AM6548的 R5F 内核?

    我想看到一些类似 AM65xx 的简单 SPI DMA 代码!

    这对我或 具有更高 DMA 性能的 PDK SPI 驱动程序而言是最好的帮助。

    我希望使用尽可能小的软件开销和最快的传输来实现 SPI 通信。


    以下是我的 POLLING 代码、它产生了最短的执行时间、131字节@10MHz 时为~210uec (到现在为止):

    bool SPI:::txrxRegP1OL (uint8_t* spiTxData、uint8_t* spiRxData、
    size_t spiDataLength) const //重叠传输
    {
    易失性 uint32_t ReadData;
    易失性 uint32_t* chRegs
    =(uint32_t*)(baseAddress + CSL_MCSPI_CH0CONF +(chNum *(CSL_MCSPI_CH1CONF–
    CSL_MCSPI_CH0CONF)));// chNum * 0x14
    
    #define chconfReg (chRegs)
    #define statusReg (chRegs +((CSL_MCSPI_CH0CONF)
    )+(CS0CL_CL_CL_CH2>CHSPI)#define CH0SPI_CL_CH0CONF (cCL_CL2
    (chRegs +((CSL_MCSPI_TX0 - CSL_MCSPI_CH0CONF)>> 2)) // 3
    #define rxReg (chRegs +((CSL_MCSPI_RX0 - CSL_MCSPI_CH0CONF)>> 2)) // 4.
    
    //没有 FIFO
    McSPITxFIFOConfig (baseAddress、MCSPI_TX_FIFO_DISABLE、chNum);
    McSPIRxFIFOConfig (baseAddress、MCSPI_RX_FIFO_DISABLE、chNum);
    
    * chctrlReg =* chctrlReg | MCSPI_CH0CTRL_EN_ACT; //启用通道
    *chconfReg =* chconfReg | MCSPI_CH0CONF_FORCE_MASK;// CS 打开
    
    *txReg = spiTxData? *spiTxData++:0;//发送第一个
    spiDataLength --;
    while (!(* statusReg & MCSPI_CH_STAT_TXS_EMPTY));
    while (spiDataLength)
    {
    *txReg = spiTxData? *spiTxData++:0;//发送下一个
    while (MCSPI_CH_STAT_RXS_FULL!=(* statusReg & MCSPI_CH_STAT_RXS_FULL));
    ReadData =*rxReg;//获取上一个
    if (spiRxData){
    *spiRxData++= ReadData;
    }
    spiDataLength --;
    }
    while (MCSPI_CH_STAT_RXS_FULL!=(* statusReg & MCSPI_CH_STAT_RXS_FULL));
    ReadData =*rxReg;//获取最后一个
    if (spiRxData){
    *spiRxData++= ReadData;
    }
    
    * chconfReg =* chconfReg &~MCSPI_CH0CONF_FORCE_MASK;// CS 关闭
    *chctrlReg =* chctrlReg &~MCSPI_CH0CTRL_EN_ACT; //禁用通道
    返回 true;
    } 

    不存在超时检查(建议)、正确处理 NULL 指针(但可以改用 RXON/TXONLY SPI 端口模式)、FIFO 配置可以在初始化时进行一次(但我正在尝试多种不同的并行配置)。

    您还看到其他需要改进的地方吗?


    2) 2)我尝试使用中断模式、因为轮询会阻止 CPU、并且我对 DMA 性能不满意。 这里是修改后的 SPI_v1.c 文件、我在其中将中断清除移动到了中断处理程序的开始 我使用了 PDK 驱动程序、将 SPI 通道配置为使用中断、FIFO 级别32进行10MHz 主器件操作、并调用 SPI_TRANSFER 函数、尝试从 SPI EEPROM 读取128字节、这意味着传输131字节并产生协议开销。

    e2e.ti.com/.../SPI_5F00_v1_5F00_hwiFxnMod.zip

    请记住:我使用了 AM65 IDK、在运行 R5F 代码的 J20连接器上观察到 MCSPI1信号;因此、我必须破解 PDK 驱动程序、因为它不支持此类跨域操作(为什么不呢? 这可能是另一个需要改进的地方!! 驱动程序表可以/应该包含所有可用硬件实例的条目! )。 但我认为有趣的情况也可以用更简单的配置来重现。

    我希望 PDK SPI 驱动程序中断能够得到修复。 这对我来说不是一个紧迫的问题、而是对 TI 来说。 您还应该为中断/DMA 驱动的操作提供如此出色的 C 语言简单 CSL 示例。

    感谢您的关注和帮助:-)

    此致、Kalman

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

    您好、Kalman、

    在1号

    DMA 由 AM65x 和更高版本器件中的 UDMA 实现。 UDMA 是下一代 DMA 引擎。

    在 \packages/ti\drv\spi\examples\mcspi_slavemode\src\main_mcspi_slave_mode.c 中实现的 SPI 驱动 程序能够使用 uDMA 移动数据。 请构建 MCSPI_Baremetal_Master_DMA_TestApp 和 MCSPI_Baremetal_Slave_DMA_TestApp 应用以对其进行测试。 此外、我检查并确认没有 CSL 示例/简单示例可在 DMA 模式下操作 SPI。

    您能不能帮助我更好地理解您的用例。 我将检查我们如何才能最好地实现它、下面列出了我的一些问题

    1. 数据传输的典型大小是多少
    2. 数据传输在本质上是突发的还是恒定的比特率
    3. 您是否需要多个通道
    4. 是现在需要生产还是需要评估

    在2号

    感谢您分享您所做的更改、我已经为 FIFO/ISR 更改提交了缺陷、并将努力将其关闭。

    此致、Sujith

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

    您好、Sujith、

    我从圣诞假期回来、祝您新年快乐、无生气。

    我对 DMA 代码使用了上述示例。

    我们将在不同的产品中使用 SPI 用于不同的用途。

    关于字节计数:

    a.具有128或256字节写入缓冲器的 EEPROM

    读取任意大小的数据、轮询状态寄存器(2字节)、写入使能(1字节)、写入块(128或256字节+ 3字节命令和地址)

    b.驱动移位寄存器进行串行/并行转换

    更多通道、1或4字节、硬件驱动芯片选择

    与我们自己的 FPGA 进行通信

    读/写4 ~200字节

    2.

    我不能正确理解您的问题。 我想我们将使用固定 SPI 时钟进行周期性传输、并根据外设器件的规格使用频率。 EEPROM 中的参数将在启动时读取一次。

    3.

    我们将使用更多端口、有时使用更多通道

    4.

    我们处于开发阶段

    此致、Kalman