回复 4# changhao
SD卡调试一册通v100 中
Madeby:cumt_liang
一sd硬件 考虑到12xs单片机io口使用的是5v,而sd卡是3.3v,SD卡所能接受的逻辑电平与xs128提供的逻辑电平不匹配,如果采用直接连接的话,有可能导致sd卡烧毁,而采用串接电阻的方法得计算串联的阻值,这个阻值的大小和单片机的管脚电流等有关系,得阅读大量资料,考虑到 SD卡在SPI协议的工作模式下,通讯都是单向的,于是在单片机向SD卡传输数据时采用晶体管加上拉电阻法的方案,基本电路如图6所示。而在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。网上关于此类电路图有很多人发布,要自己选择才能确定什么才是适合自己的。所以我们制作了一个sd通吃板,有我们认为最好的方案,也有网上的多家精华,可以自己回去根据需求焊接几个电阻。这个方案需要双电源供电、
图1.电平变换电路
(一个5V电源一个3.3V电源供电),3.3V电源可以用AMS1117稳压管从5V电源稳压获取。这点特别要注意!3.3v 最好别接5V,毕竟人家官方要求这样的,不要挑战权威。(毕竟这是人家的孩子:))这个电路作者用了很好用。 二Spi软件: 温馨提示:网上有些版本的sd程序,大家可能拿来就用了,开始搞得时候我们也是这样学习的,特别提醒大家下,特别是你的板上其他口比如pp,ph,pt,pm有摄像头或者其他的东西,拿来的程序要特别注意程序的初始化是否把这些口转换成了输入或输出口。比如我的pt口p0、p1接的是摄像头的行场中断,他们当然是输入模式,结果网上下的程序却把它设置成了输出口,那么你的摄像头就有被搞坏的可能。(我的就是这样坏了,心疼的兄弟跳楼了,当然实验室是一楼。) 写这种软件,怎么算才是写的好,网上流传的到底哪个好?新手 无从考察,怎么办?找官方!!有事找孩子他爹,就算不是最好的,也 是比较好的。如图3在官网找的一个实例。附件1是手册。附件2是他的程序。我们研究下。解压文件如图2所示。 图2sd实例文件图 图3 sd的一个实例使用手册 1 void SPI_Init(void) void SPI_Init(void) {
SPI_SS = 1;
_SPI_SS= 1;
SPI2BR = 0x14;
// 375KHz SPI clock
SPI2C2 = 0x00;
SPI2C1 = SPI2C1_SPE_MASK | SPI2C1_MSTR_MASK; //具体含义见上册
} 查阅相关的文献 知道spi初始化,先要把Sd片选无效,然后设置工作模式,设置波特率。我们上册的初始化就是仿此的。 2 void SPI_Send_byte(byte u8Data) void SPI_Send_byte(byte u8Data) {
while(!SPI2S_SPTEF);
(void)SPI2S;
SPI2DL=u8Data;
while(!SPI2S_SPRF);
(void)SPI2DL;
} 左面的是官方例子。右面的我们学习改造的。 下面来说说道理。Dg128,xs128的传送与接收都用的一个寄存器spi0dr, while(!SPI2S_SPTEF);作用是看数据寄存器是否为空,只有他为空才能写数据,否则视为无效写入。 (void)SPI2S;
刷新标志位, SPI2DL=u8Data;将要写入的数据写入数据寄存器,这个时候SPI2S的响应标志会清除。 while(!SPI2S_SPRF); 为1时候表示数据寄存器的内容已经传完 (void)SPI2DL; 刷新标志位,为什么要用这两个刷新标志位的指令。是因为他们的标志位需要清除,清除过程如下。 图 4 标志位的清除过程 通过看图4就知道了,人家为什么有(void)SPI2DL;这个东西了。 好了到这里大家可能说,非要这样搞吗??官方就是老大吗??我不想抬扛,新手还是这样比较好,比较正统,而不是上来就自己另起炉灶搞一套。(如果你特别猛。那请走好你的路,别说我的路。:)) |