SD卡SPI读写模式,基于51单片机的讲解

本文详细介绍了51单片机使用SPI模式3与SD卡进行通信的原理,提供了一段示例代码,并警告了直接使用5v电平与3.3v SD卡接口可能造成的损坏问题。建议使用电平转换芯片以确保SD卡安全,并提及了不使用转换芯片时可能的隐患和应对措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过验证测试,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文件系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值