跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. SPI时钟线连续输出

SPI时钟线连续输出

已定时 已固定 已锁定 已移动 YT SDK
2 帖子 2 发布者 72 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • D 离线
    D 离线
    Derrick YunTu
    编写于 最后由 编辑
    #1

    1. 版本

    Config Tool Version:2.7.8
    ME05 SDK version:1.4.0
    EVB version: YTM32B1ME0-EVB Rev.C

    2. 需求

    • 需要将SPI的CLK引脚保持一直连续输出,不能有间隔。
    • 波特率10M,软件上不需要做太多处理,要搭配DMA,尽可能节省CPU资源。

    3. 方案思路

    • 可以正常配置SPI的1024byte(可适当配置)连续发送,在DMA的发送完成中断中重新配置开启下一次的DMA发送。接收的DMA搬运同理。
    • 要保证重新配置的操作时间尽可能短,在SPI的TX_FIFO发送完成之前重新配置好DMA,SPI的波形就会连续,不会有间隔。

    4. 示例工程配置

    4.1 SPI时钟配置

    • 功能时钟选择PLL, 120M时钟, 3分频,所以SPI的功能时钟为40M.
      f9171403-3a59-40dd-addc-bc154d8dcc3a-image.png

    4.2 SPI功能配置

    • 这里只考虑主机发送和接收的配置:
      eb4dd768-a168-4e6a-90e3-b7be7db43041-image.png

    4.3 DMA发送完成中断重新配置DMA

    4.3.1 TX DMA

    • 找到 SPI_DRV_MasterCompleteDMATransfer 函数,这个函数会在DMA完成中断中调用。
    • 注释掉原有的SPI传输完成操作,添加如下代码:
      3409bdfe-c01c-496e-823d-cdbaeab0b9a8-image.png
    • 如上图,重新配置DMA通道0的源地址,TriiggerCount,最后StartChannel.

    4.3.2 RX DMA

    • 找到 SPI_DRV_MasterCompleteRX 函数,这个函数会在DMA完成中断中调用。
    • 注释掉原有的SPI接收完成操作,添加如下代码:
      f6341ba2-1dac-43d6-b9df-c87003d74604-image.png
    • 如上图,重新配置DMA通道1的目标地址,TriiggerCount,最后StartChannel.

    4.4 代码配置

    • 只需调用一次 SPI_DRV_MasterTransfer ,MCU就会一直发送SPI波形,因为有DMA,程序不会频繁进入中断处理,只会在DMA发送完成中断里处理一下就行,软件负载低。
    • 如果想将进一步降低软件负载,可将发送的长度(1024byte)适当扩大。
      ecfb174c-100e-44e1-92d9-80af32ddad90-image.png
    • 调试,将SIN和SOUT连接
      9e97b680-c3bf-4d1a-be40-327e3cb1b9a1-image.png

    5. 实测波形

    • 通道0是片选线,通道1是时钟线,通道2是MOSI,通道3是MISO,通道4代表DMA完成中断处理时间。
    • 如下图,波形连续发送无间隔
      bea0e8ae-f52b-440a-b9d3-0911c2c8c0a0-image.png

    6. 示例工程

    • SDK:
      02beb926-8d95-4aa4-afb4-fde884ad6c17-Spi_Master_DMA_Continue_Send.zip
    • MCAL:
      f4b5fbd6-b97d-4438-91ae-4cfef9eac736-SPI_Master_clk_continue_out.zip
    1 条回复 最后回复
    0
    • YuntuAIY 离线
      YuntuAIY 离线
      YuntuAI YunTu
      编写于 最后由 编辑
      #2

      补充确认一下:这个方案是可行的。ME0 的 SPI SVD 里,SPIx->CTRL 提供 TXDMAEN/RXDMAEN,发送 FIFO 低于 watermark 或 buffer empty 时可以触发 TX DMA,接收 FIFO 高于 watermark 或 buffer full 时可以触发 RX DMA。因此要保持 SCK 连续,关键是让下一段 DMA 在 TX FIFO 消耗完之前重新装载/启动。

      使用时建议注意:

      1. 发送块长度尽量放大,减少 DMA 完成中断频率。
      2. DMA 完成回调里只做源/目的地址、TriggerCount 和 StartChannel 等最少操作,避免日志、复杂判断或耗时调用。
      3. 40 MHz 功能时钟下做 10 MHz SPI 时钟是合理的;如果实测仍有空隙,可以优先调大单次传输长度或降低 FIFO watermark,确认 DMA 重装载时间小于 FIFO 剩余数据发送时间。
      4. 需要收发环回时,SIN/SOUT 短接的方式可以用于验证 RX DMA 是否同步搬运。
      1 条回复 最后回复
      0

    • 云途开发生态介绍

      快速上手云途开发生态

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YT CONFIG TOOL调查问卷

      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

    • can
      24
      demo
      22
      lin stack
      13
      uds
      13
      md14
      6
      fbl
      5
      yt-link
      5
      adc模块
      4
      Online Users
      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门