用stc12c系列单片机利用IO模拟SPI总线驱动SD,其实SD开有两种协议的版本其中是SPI和SDIO,考虑到SPI简单,故采用SPI驱动SD卡,但是STC12C单片机的IO口是5V的电压。而SD的接口电压为3.3v故采用电阻分压的方法将5v转换为3.3v
利用两个电阻分压1.8k和3.5K分压计算可以实现3.3v。通过multisim仿真结果和理论一致。
这样就可以的到3.3v电平了。
stc和SD卡接口原理图如图。
写好程序后发现怎么都不能实现。于是一点一点调试,利用串口跟踪程序跑到哪一个函数里在读字符串数据函数里发送‘a’(0x61)。
利用串口调试助手发现数据总是61,以为是SPI发送函数有问题。在向下底层读字节函数判断是否正常。发现依然不正常。
0xFF! 53 44 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 62 FF 63 62 FF 63 62 FF 63 62 FF 63 62 FF 63 62 FF 63 62 FF 63 62 FF 63 62 FF 63
突然想到IO口的电平是不是正常,于是将SD退出卡槽。
编写一个验证性程序,先让所有的IO呈现点电平。用万用表测量结果ok
在拉高IO口。单片机端为5v于是测量SD卡端,通过电阻分压之后。测量发现只有1.2v左右。怎么会出现这个问题。
难道IO驱动能力太弱了吗!赶紧找出STC12C的DS查看IO的驱动电流。发现趋势驱动电流太低。
手册上写到可以采用推挽输出这样驱动能力增强。
按照手册上将输出的IO口全部改为推挽输出
再次测量发现SD端可以产出3.3v和0v
抱着希望再一次下载SD的程序。
总结其实stc数据手册上有关于5v转3.3v的电路,比用两个电阻分压要可靠的多。
MCU的io设置开漏然后上拉到3.3v
现在许多的器件都是3.3v的IO所以5v转3.3v电路很重要