<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SPI时钟线连续输出]]></title><description><![CDATA[<h1>1. 版本</h1>
<p dir="auto">Config Tool Version：2.7.8<br />
ME05 SDK version：1.4.0<br />
EVB version: YTM32B1ME0-EVB Rev.C</p>
<h1>2. 需求</h1>
<ul>
<li>需要将SPI的CLK引脚保持一直连续输出，不能有间隔。</li>
<li>波特率10M，软件上不需要做太多处理，要搭配DMA，尽可能节省CPU资源。</li>
</ul>
<h1>3. 方案思路</h1>
<ul>
<li>可以正常配置SPI的1024byte（可适当配置）连续发送，在DMA的发送完成中断中重新配置开启下一次的DMA发送。接收的DMA搬运同理。</li>
<li>要保证重新配置的操作时间尽可能短，在SPI的TX_FIFO发送完成之前重新配置好DMA，SPI的波形就会连续，不会有间隔。</li>
</ul>
<h1>4.  示例工程配置</h1>
<h2>4.1 SPI时钟配置</h2>
<ul>
<li>功能时钟选择PLL, 120M时钟, 3分频，所以SPI的功能时钟为40M.<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/7c0d6b7a-97b0-43e8-81b2-807eb6997573.png" alt="f9171403-3a59-40dd-addc-bc154d8dcc3a-image.png" class=" img-fluid img-markdown" /></li>
</ul>
<h2>4.2 SPI功能配置</h2>
<ul>
<li>这里只考虑主机发送和接收的配置：<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/ea16f2f3-9358-4b43-b54f-cb70bd278bcd.png" alt="eb4dd768-a168-4e6a-90e3-b7be7db43041-image.png" class=" img-fluid img-markdown" /></li>
</ul>
<h2>4.3 DMA发送完成中断重新配置DMA</h2>
<p dir="auto">4.3.1 TX DMA</p>
<ul>
<li>找到 SPI_DRV_MasterCompleteDMATransfer 函数，这个函数会在DMA完成中断中调用。</li>
<li>注释掉原有的SPI传输完成操作，添加如下代码：<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/2a1708c1-2d1c-414d-aef0-b0775f94088f.png" alt="3409bdfe-c01c-496e-823d-cdbaeab0b9a8-image.png" class=" img-fluid img-markdown" /></li>
<li>如上图，重新配置DMA通道0的源地址，TriiggerCount，最后StartChannel.</li>
</ul>
<h2>4.3.2 RX DMA</h2>
<ul>
<li>找到 SPI_DRV_MasterCompleteRX 函数，这个函数会在DMA完成中断中调用。</li>
<li>注释掉原有的SPI接收完成操作，添加如下代码：<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/2f2839be-0e6f-478d-bb88-320b5e8f9bf4.png" alt="f6341ba2-1dac-43d6-b9df-c87003d74604-image.png" class=" img-fluid img-markdown" /></li>
<li>如上图，重新配置DMA通道1的目标地址，TriiggerCount，最后StartChannel.</li>
</ul>
<h2>4.4 代码配置</h2>
<ul>
<li>只需调用一次 SPI_DRV_MasterTransfer ，MCU就会一直发送SPI波形，因为有DMA，程序不会频繁进入中断处理，只会在DMA发送完成中断里处理一下就行，软件负载低。</li>
<li>如果想将进一步降低软件负载，可将发送的长度（1024byte）适当扩大。<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/b4356dd7-e7a5-4ad2-bc31-7e077668b7f4.png" alt="ecfb174c-100e-44e1-92d9-80af32ddad90-image.png" class=" img-fluid img-markdown" /></li>
<li>调试，将SIN和SOUT连接<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/f95173aa-c0b5-4012-b78c-551d5dad5738.png" alt="9e97b680-c3bf-4d1a-be40-327e3cb1b9a1-image.png" class=" img-fluid img-markdown" /></li>
</ul>
<h1>5. 实测波形</h1>
<ul>
<li>通道0是片选线，通道1是时钟线，通道2是MOSI，通道3是MISO，通道4代表DMA完成中断处理时间。</li>
<li>如下图，波形连续发送无间隔<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/1e04a134-31c4-4aff-8eb0-30cc9624818a.png" alt="bea0e8ae-f52b-440a-b9d3-0911c2c8c0a0-image.png" class=" img-fluid img-markdown" /></li>
</ul>
<h1>6. 示例工程</h1>
<ul>
<li>SDK：<br />
<a href="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/db403837-47c6-4e35-8665-8f3a26a62e0d.zip" rel="nofollow ugc">02beb926-8d95-4aa4-afb4-fde884ad6c17-Spi_Master_DMA_Continue_Send.zip</a></li>
<li>MCAL：<br />
<a href="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/671/79da4d4f-926e-49a0-b537-8f882eeeda3e.zip" rel="nofollow ugc">f4b5fbd6-b97d-4438-91ae-4cfef9eac736-SPI_Master_clk_continue_out.zip</a></li>
</ul>
]]></description><link>https://forum.ytmicro.com/topic/1943/spi时钟线连续输出</link><generator>RSS for Node</generator><lastBuildDate>Wed, 13 May 2026 11:59:00 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/1943.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 May 2026 08:24:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SPI时钟线连续输出 on Tue, 12 May 2026 23:02:46 GMT]]></title><description><![CDATA[<p dir="auto">补充确认一下：这个方案是可行的。ME0 的 SPI SVD 里，SPIx-&gt;CTRL 提供 TXDMAEN/RXDMAEN，发送 FIFO 低于 watermark 或 buffer empty 时可以触发 TX DMA，接收 FIFO 高于 watermark 或 buffer full 时可以触发 RX DMA。因此要保持 SCK 连续，关键是让下一段 DMA 在 TX FIFO 消耗完之前重新装载/启动。</p>
<p dir="auto">使用时建议注意：</p>
<ol>
<li>发送块长度尽量放大，减少 DMA 完成中断频率。</li>
<li>DMA 完成回调里只做源/目的地址、TriggerCount 和 StartChannel 等最少操作，避免日志、复杂判断或耗时调用。</li>
<li>40 MHz 功能时钟下做 10 MHz SPI 时钟是合理的；如果实测仍有空隙，可以优先调大单次传输长度或降低 FIFO watermark，确认 DMA 重装载时间小于 FIFO 剩余数据发送时间。</li>
<li>需要收发环回时，SIN/SOUT 短接的方式可以用于验证 RX DMA 是否同步搬运。</li>
</ol>
]]></description><link>https://forum.ytmicro.com/post/8429</link><guid isPermaLink="true">https://forum.ytmicro.com/post/8429</guid><dc:creator><![CDATA[YuntuAI]]></dc:creator><pubDate>Tue, 12 May 2026 23:02:46 GMT</pubDate></item></channel></rss>