STM32读写SDIO,F1\F4,非DMA
只能说SDIO是我目前遇到坑最多的,F1和F4的配置还不一样,问豆包每次问的结果都不一样,一会儿能DMA,一会儿不能DMA。
先总结一下我认为重要的坑点:
首先是配置方面:
1.打开硬件SDIO之后,F1需要上升沿Rising transtion;F4需要下降沿Faling transtion,至少我这样成了,按照豆包的说法必须这样
2.SDIOCLK clock divide factor设置成178,总之就是SDIO需要先低速激活SD卡,再转为高速传输,但是F4好像不需要配置,因为有专门的48MHZ的时钟,不管你设置什么,都会自动配置成400KHZ
3.必须打开SDIO 的NVIC(我是感觉没用到,不过说开就开吧)
4.DMA也必须开(也没用到啊,我用的轮询),F4有两个DMA,F1只有一个(那即便能用也肯定只能半双工了)。
5.虽然外部已经有了上拉电阻,但是D0-D3,CMD还是必须内部上拉电阻,设置成pull up,CLK不能上拉
6.这些GPIO全是PP模式,虽然有说CMD是开漏,但是只是协议方面的,硬件方面都是PP,SD卡的金手指也基本上都是PP
7.SD卡的CMD居然只有PP,不是I/PP,好像默认有I,所以默认不写I,真离谱,没有I怎么能读取到主机发送的信息,手册陋习啊。
8.SDIO的Mode配置成SD 1bit或者SD 4bit,但是我软件切换成高速的4bit失败了。
然后是软件里面:
1.读写的数组需要对齐操作 attribute((aligned(4)))
2.如果选择的是SD 4bit,那么F1还需要手动将4bit改为1bit,在初始化阶段hsd.Init.BusWide = SDIO_BUS_WIDE_1B;F4却不需要,因为即便选择4,这里也是1bit
3.系统的初始化SDIO只会配置IO口,需要手动初始化函数HAL_SD_Init(&hsd)来初始化SD卡
4.初始化成功之后需要修改传输速率,不然会导致不能写入sd卡,但是能从sd卡读取数据
5.初始化不能只修改对应寄存器,用函数的方式是最安全的,而且还是这样的三行,我的SD卡是CLASS4,好像至少得4MB/S,所以设置成了3,不过按理说bit1传输,18应该也行
HAL_SD_DeInit(&hsd);
hsd.Init.ClockDiv = 3;
HAL_SD_Init(&hsd);
搞定上面哪些坑之后,基本上就能通信成功了。
附上F1的工程:https://gitee.com/liang-deping/restart-stm32
浙公网安备 33010602011771号