最近想把潘多拉板子的SD SPI驱动增加DMA功能,结果发现STM32L4的SPI总线巨坑
,
第一,不用SPI DMA功能时,接收一字节数据之前一定要发送一字节无效数据以保证时钟有效,否则就接收不到;
第二,启用DMA功能,发送没问题,可接收就一直不能等待DMA传输结束,原因就是第一点,接收时,DMA每传输一
字节之前没有发送一字节无效数据以保证时钟有效,坑
第三,我试过不用HAL库,用LL库重写SD SPI驱动,发现SD卡初始化完成后就使能SPI TX和RX的DMA功能,会导致在不用
DMA传输的情况下读数据出错,最典型就是读SD卡的CSD和CID寄存器(即块读),其他SD卡的指令读写没问题,坑
第四,LL库并不完善,STM32L4的SPI总线添加了FIFO功能,导致每次传输都要检查FIFO是否为空和总线忙,F1和F4没这情况,
按照F1和F4的思路会掉坑
最后一点,潘多拉板子裸机例程的SD SPI驱动中SD卡初始化有些问题,我用V2HC的SD卡一直初始化失败,直到我参考官方
SD SPI初始化流程(即Physical Layer Simplified Specification Version 6.00文档):
大概就是如果是V2的SD卡要在发送CMD8后先发送CMD58检查OCR(即卡兼容电压),之后才发送ACMD41直到返回0 。按照官方的初始化流程是
成功的;而按照例程的SD SPI驱动(发送CMD8后不发送CMD58,直接发送ACMD41直到返回0 )是一直失败。
一周热门 更多>