<?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[YTM32B1HA0 FlexCAN Legacy Rx FIFO DMA 开启 D-Cache 时的 Cache 维护时序确认]]></title><description><![CDATA[<p dir="auto">芯片型号：YTM32B1HA0x<br />
SDK版本：1.4.0<br />
应用场景：FlexCAN Legacy Rx FIFO + DMA，Cortex-M7 D-Cache开启</p>
<p dir="auto">问题现象：</p>
<p dir="auto">FlexCAN Legacy Rx FIFO通过DMA接收报文后，SDK会解析ID、DLC，<br />
并对Data执行字节序转换。</p>
<p dir="auto">如果应用在FLEXCAN_EVENT_DMA_COMPLETE回调中对接收缓冲区执行<br />
SCB_InvalidateDCache_by_Addr()，偶发出现每4字节反转的现象。</p>
<p dir="auto">例如：</p>
<p dir="auto"><strong>期望数据：<br />
00 11 04 00  00 00 2D 0C</strong><br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/54/5809dc8f-ec5b-4d88-a5ce-30cc740a9a59.png" alt="e616e56e-8f8d-4014-a948-7a17c520d2fd-e3a073a3e3e155fa32971b12035bc9f9.png" class=" img-fluid img-markdown" /><br />
<strong>异常数据：<br />
00 04 11 00  0C 2D 00 00</strong><br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/54/b5d2a035-6784-4476-ad58-077ec0df8439.png" alt="2108b6d9-e6e9-4f85-8892-5d47f836f768-b319bd183c959ad555a882e180d47a30.png" class=" img-fluid img-markdown" /><br />
目前分析认为，DMA直接写SRAM，而CPU通过D-Cache访问缓冲区。<br />
SDK完成ID/DLC解析和字节序转换后，应用再次Invalidate，<br />
可能会丢弃CPU在Cache中完成但尚未回写SRAM的修改，<br />
导致后续重新读到DMA写入的原始格式。</p>
<p dir="auto">计划将Cache维护放到SDK的DMA所有权切换位置，时序如下：</p>
<p dir="auto">CleanInvalidate接收缓冲区<br />
-&gt; 配置并启动DMA<br />
-&gt; DMA完成<br />
-&gt; 停止DMA通道或确认DMA不再访问缓冲区<br />
-&gt; Invalidate接收缓冲区<br />
-&gt; SDK读取CS/ID/Data<br />
-&gt; 解析ID和DLC<br />
-&gt; 执行Data字节序转换<br />
-&gt; 触发用户回调</p>
<pre><code>SCB_CleanInvalidateDCache_by_Addr(rxBuffer, 16U);
DMA_DRV_StartChannel(channel);

/* DMA完成回调 */
DMA_DRV_StopChannel(channel);
SCB_InvalidateDCache_by_Addr(rxBuffer, 16U);

ParseIdAndDlc(rxBuffer);
SwapDataByteOrder(rxBuffer);
UserCallback(rxBuffer);
</code></pre>
<p dir="auto"><img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/54/7d5f4a4a-3de2-41f8-bb1e-6d3a731960f1.png" alt="e8688c98-a303-468e-a987-d6874365d8e1-8608560b0aae8a85b5d7bfd6698fa040.png" class=" img-fluid img-markdown" /><br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/54/dba9801f-6468-4176-ba39-ba01790e1264.png" alt="96cd757b-c421-4469-85bb-c90eda851fdc-45c66bfe5a60d7718b94b81504c11d3c.png" class=" img-fluid img-markdown" /><br />
应用回调中不再对rxBuffer执行Cache操作，并且先处理或复制当前报文，<br />
最后再重新调用FLEXCAN_DRV_RxFifo()挂接下一次DMA接收。</p>
<p dir="auto">typedef struct ALIGNED(32)<br />
{<br />
uint32_t cs;<br />
uint32_t msgId;<br />
uint8_t data[64];<br />
uint8_t dataLen;<br />
} flexcan_msgbuff_t;</p>
<p dir="auto">想请确认以下问题：</p>
<ol>
<li>
<p dir="auto">上述CleanInvalidate -&gt; DMA -&gt; Invalidate -&gt; SDK解析 -&gt; 用户回调<br />
的Cache维护顺序是否合理？</p>
</li>
<li>
<p dir="auto">DMA完成后，Invalidate是否必须放在SDK第一次读取CS、ID和Data之前？</p>
</li>
<li>
<p dir="auto">用户回调中是否不应再次Invalidate当前接收缓冲区？</p>
</li>
<li>
<p dir="auto">Legacy Rx FIFO的Cache维护长度使用16字节是否合适？</p>
</li>
</ol>
]]></description><link>https://forum.ytmicro.com/topic/2153/ytm32b1ha0-flexcan-legacy-rx-fifo-dma-开启-d-cache-时的-cache-维护时序确认</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 21:51:33 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/2153.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2026 02:35:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to YTM32B1HA0 FlexCAN Legacy Rx FIFO DMA 开启 D-Cache 时的 Cache 维护时序确认 on Tue, 04 Aug 2026 06:22:26 GMT]]></title><description><![CDATA[<ol>
<li>不确定代码结构，加到CPU第一次访问这个RAM区域前。</li>
<li>没问题。</li>
</ol>
]]></description><link>https://forum.ytmicro.com/post/9328</link><guid isPermaLink="true">https://forum.ytmicro.com/post/9328</guid><dc:creator><![CDATA[Frankie]]></dc:creator><pubDate>Tue, 04 Aug 2026 06:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to YTM32B1HA0 FlexCAN Legacy Rx FIFO DMA 开启 D-Cache 时的 Cache 维护时序确认 on Tue, 04 Aug 2026 03:33:38 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://forum.ytmicro.com/uid/1">Frankie</a> 感谢大佬的回复，请问当前Invalidate的位置是合理的吗（在DMA_DRV_StopChannel的后面，且Legacy Rx FIFO的Cache维护长度是16字节）</p>
]]></description><link>https://forum.ytmicro.com/post/9327</link><guid isPermaLink="true">https://forum.ytmicro.com/post/9327</guid><dc:creator><![CDATA[gaoSheng]]></dc:creator><pubDate>Tue, 04 Aug 2026 03:33:38 GMT</pubDate></item><item><title><![CDATA[Reply to YTM32B1HA0 FlexCAN Legacy Rx FIFO DMA 开启 D-Cache 时的 Cache 维护时序确认 on Tue, 04 Aug 2026 03:26:50 GMT]]></title><description><![CDATA[<p dir="auto">通常DMA和CPU交互的RAM建议设置为NO-CACHE区域。</p>
<hr />
<p dir="auto">DMA 传输完成，CPU 访问这片区域前，invald cache 一次就够了</p>
]]></description><link>https://forum.ytmicro.com/post/9326</link><guid isPermaLink="true">https://forum.ytmicro.com/post/9326</guid><dc:creator><![CDATA[Frankie]]></dc:creator><pubDate>Tue, 04 Aug 2026 03:26:50 GMT</pubDate></item></channel></rss>