您好!您遇到的问题非常典型,很多开发者在使用SPI模式驱动SD卡(或SD NAND)时都会遇到这个“写入速度瓶颈”问题。
根据您的描述(SPI时钟30MHz,但实际写入速度仅500KB/s,且等待应答时间很长),问题的根源几乎可以确定不是在SPI总线本身的速度上,而是在于SD卡内部的“编程时间”。
让我们来深入分析一下:
SD卡内部有Flash存储单元和控制器。当你发送一个写入数据块(例如,CMD24
- 写单个块 或 CMD25
- 写多个块)的命令后,会发生以下几步:
主机发送数据和命令:你的MCU通过SPI总线将数据快速传输给SD卡。
SD卡接收数据:SD卡内部的缓冲区接收这些数据。
内部编程:这是最耗时的步骤。SD卡控制器需要将缓冲区里的数据实际编程(写入)到内部的NAND Flash单元中。这个操作需要毫秒(ms)级别的时间。
准备就绪:编程完成后,SD卡才会释放DO线(将其拉高),告诉主机“我准备好了”。
逻辑分析仪抓到的“很长等待时间”,正是步骤3的“内部编程时间”。在这段时间里,SPI时钟是停止的,主机在不断地读取SD卡返回的busy
信号。因此,即使你把SPI时钟调到100MHz,这段等待时间也几乎不会缩短,它取决于SD卡本身的品质和性能。
理论峰值速度:在理想情况下(只传输数据,无等待),SPI时钟为30MHz,因为是全双工,理论数据速率是 30Mbps / 8 = 3.75 MB/s。
您的实际速度:500KB/s ≈ 0.5 MB/s。这个速度与理论值相差巨大,印证了绝大部分时间都花在了等待上。
我们的测试经验:在SPI模式下,写入速度通常范围在 0.5 MB/s 到 2 MB/s 之间是常见的。要达到2MB/s的高位,需要非常好的卡和极致的优化。
结论:你测得的500KB/s确实偏慢,但问题的关键不是SPI传输慢,而是卡的反应慢。
既然瓶颈是卡的内部编程时间,我们的优化思路就是:让MCU在卡忙的时候去处理其他事情,或者减少卡忙的次数。
以下是几个非常有效的优化方案,请按顺序检查和尝试:
CMD25
)这是最有效的提升速度的方法!
现状(单块写入 CMD24
): 写一个块(通常512字节) -> 等待卡编程完成(几ms)-> 再写下一个块 -> 再等待... 大量时间浪费在反复的等待上。
优化后(多块写入 CMD25
): 发送CMD25
-> 连续发送N个数据块 -> 发送CMD12
停止传输 -> 只需要等待最后一次的编程时间。
效果:假设写10个块,单块写入需要等待10次,而多块写入可能只需要等待1次(或者少数几次),速度提升可达数倍甚至十倍。
操作步骤:
在发送CMD25
之前,可以先发送ACMD23
来设置预定义块数(告诉卡你准备连续写多少块),有些卡对此有优化。
发送CMD25
。
连续发送多个数据块(每个数据块前仍有起始令牌0xFC/0xFE
)。
发送停止传输令牌(8个CLK后的0xFD
)或发送CMD12
命令来终止传输。
等待最后一次繁忙结束。
注意:务必检查你的SD卡初始化代码,确保卡支持CMD25
并且该命令已启用。
虽然听起来矛盾,但有时是因为超时时间设置得太短,MCU误认为卡无应答而提前重试或报错,导致流程失败,实际并未完成写入。确保你的等待繁忙循环有足够的超时(例如500ms)。
确保在数据连续传输阶段(非等待繁忙阶段)速度达到极致:
使用DMA:如果MCU支持SPI DMA,一定要使用它来传输数据块,解放CPU。
提升SPI时钟:在初始化完成后,确认卡支持高速模式后,可以将SPI时钟从400kHz切换到最高速率(你的30MHz是合理的,甚至可以尝试更高,但需保证信号质量)。
优化代码:检查SPI读写函数,避免不必要的软件延时和开销。
不同的SD卡/SD NAND内部控制器和Flash品质差异很大。
尝试使用标有High Speed或Class 10及以上等级的卡。
SD NAND的型号也很重要,不同品牌的性能也不同。
上拉电阻:SPI总线的MISO线必须有上拉电阻(通常10kΩ-100kΩ),否则卡无法在繁忙时通过输出0来拉低这条线。
电源质量:确保电源稳定且容量充足。不稳定的电源会导致SD卡行为异常和内部编程变慢。
布线:高频信号线尽量短,避免干扰。
首要任务:修改你的驱动程序,将单块写入(CMD24
)改为多块连续写入(CMD25
)。这是解决你当前问题最可能生效的方法。
逻辑分析仪验证:修改代码后,再次用逻辑分析仪抓取波形。你应该会看到:连续发送多个数据块时,数据包之间几乎没有繁忙等待,只有一个很长的高电平(繁忙)出现在整个连续写操作的最后。
其次:检查硬件,确保MISO有上拉电阻,并换一张Class 10的高速卡做对比测试。
最后:如果速度仍不满意,再深入优化SPI的DMA配置等底层驱动。
希望这些详细的分析和建议能帮助你大幅提升写入速度!这是一个非常经典的“软硬件结合”的问题。祝调试顺利!
上一篇:芯片不耐高温原因及拆焊技巧