经过验证测试,sd卡使用的spi模式为模式3(mode3),即CPOL和CPHA均为1,时钟线高电平空闲,第二个边沿(上升沿)进行采样。
下面为51单片机软spi读写一个字节时序(模式3)的代码示例,适用于sd卡的读写。
#define uchar unsigned char
bdata uchar spidw,spidr;//定义两个可以位寻址的uchar变量
sbit d0=spidw^0;
sbit d1=spidw^1;
sbit d2=spidw^2;
sbit d3=spidw^3;
sbit d4=spidw^4;
sbit d5=spidw^5;
sbit d6=spidw^6;
sbit d7=spidw^7;
sbit c0=spidr^0;
sbit c1=spidr^1;
sbit c2=spidr^2;
sbit c3=spidr^3;
sbit c4=spidr^4;
sbit c5=spidr^5;
sbit c6=spidr^6;
sbit c7=spidr^7;
sbit cs=P3^4;//sd卡的spi模式引脚cs
sbit spi_do=P3^5;//sd卡的spi模式引脚mosi
sbit spi_di=P3^7;//sd卡的spi模式引脚miso
sbit clk=P3^6;//sd卡的spi模式引脚clk
void yanshi(uchar t)
{
uchar a,b;
for(a=t;a>0;a--)
for(b=120;b>0;b--);
}
/*
sd卡spi模式读写函数,spi通讯要先自行使能sd卡的cs引脚
参数:
mm:要写入的一个字节数据
delay:spi通讯时是否加延时,以控制是低速spi还是高速spi。sd卡初始化时,sd的spi速度不能太快,否则初始化失败。
1:低速 0:高速
返回值:从spi中读取的一个字节数据
*/
*
uchar spiwr(uchar mm,uchar delay) //模式3上升沿采样
{
spidw=mm;
if(delay)yanshi(10);
clk=0;spi_do=d7; if(delay)yanshi(10);
clk=1;c7=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d6; if(delay)yanshi(10);
clk=1;c6=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d5; if(delay)yanshi(10);
clk=1;c5=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d4; if(delay)yanshi(10);
clk=1;c4=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d3; if(delay)yanshi(10);
clk=1;c3=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d2; if(delay)yanshi(10);
clk=1;c2=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d1; if(delay)yanshi(10);
clk=1;c1=spi_di; if(delay)yanshi(10);
clk=0;spi_do=d0; if(delay)yanshi(10);
clk=1;c0=spi_di;
return spidr;
}
注意: 大部分淘宝上买的sd卡读写模块,它的电路很简单,sd卡供电是使用了一个5v转3.3v的电源降压芯片,但是sd卡的控制引脚;如:mosi,miso,cs,clk都是直接接单片机,只不过每个引脚另外还接了一个3.3v的上拉电阻,如下图所示。这种电路是有隐患的。
由于51单片机的引脚是5v的,所以51单片机直接使用这个模块,一般就会出现sd卡损坏的情况,本人就遇到过,往sd卡存了几个文本文件,引脚模式没有设置,还是保持51默认的弱上拉模式,实验了几下,之后再用读卡器将sd卡插电脑上,sd卡显示文件系统损坏,文件全部没有了,最后只能让我又给它格式化了一下,还好没有坏。或者有时也会出现电脑识别sd卡特别慢的情况。
因此一般不能直接将sd卡接到51单片机的引脚上,最可靠的方法就是每个引脚都接上一个5v-3.3v电平转换芯片过渡。
退一步讲,如果只能用这样的电路,那么可以这么做(必须要这么做,否则sd卡坏的几率很大):51单片机的sd相关连接引脚在开机时就设置成开漏模式,STC的51单片机大多都是可以设置开漏的,具体可以看看STC单片机手册,但是这种办法也不保险,开机瞬间,下载程序时,引脚是不会开漏的,如果插着sd卡,长久必定会造成sd卡的损坏。
sd卡的读写就不再此介绍了,如果大家可以给我关注点赞,并在评论区留言的话,嘻嘻嘻,我会再发一个博客进行详细介绍51单片机的读写sd卡,并介绍移植51单片机的文件系统,如:fat32,基于Petit FatFs文件系统。