XXXXXXXXXXXXXXXXXX/NSDN/NGV/blob/master/cortex/firmware/ngv-sys/Drivers/NGV/sd.c
这里有STM32的驱动代码,参考了Arduino等的SD卡驱动,SD卡麻烦的是初始化。
方便起见可以考虑用Arduino做,不然文件读写还要加入fatfs
暑假想做一个lcd12864的badapple,现在显示器能单独显示,但SD卡中的内容读不出来,不清楚是什么原因,可能是程序出错了,也有可能是SD卡出错了,扇区什么物理地址和逻辑地址都试过了就是不能显示动画,显示器能单独显示应该不是这上面的问题。大一小白求大神帮忙看看是不是程序出问题了,还是其他方面的问题
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar ints; //初始化变速标志
sbit cs =P1^7;
sbit di =P1^6; //sd卡数据输入
sbit clk=P1^5;
sbit d0=P1^4; //SD卡数据输出
//uchar xdata table[512];
//错误代码//
#define cmd0 0x01
#define cmd1 0x02
#define sdw 0x03 //sd写错误
#define sdr 0x0f //sd读错误
void delay2(uint z)
{
while(z--);
}
//***************************************************************************************//
//*********************************spi驱动**********************************************//
void spi_w(uchar dat) //写数据
{
uchar i;
for(i=0;i<8;i++) { if(dat&0x80) di="1;" else clk="0;" if(ints) delay2(10); 初始化的时候时钟速度要慢 dat<<="1;" } uchar spi_r(void) 读数据 temp="0,j;" d0="1;" for(j="0;j<8;j++)" return (temp); *********************************spi驱动********************************************** *************************************************************************************** *********************************sd卡驱动********************************************** sd_com(uchar *com) i,temp,time="0;" cs="1;" spi_w(0xff); for(i="0;i<0x06;i++)" 写命令 spi_w(*com++); spi_r(); do 读到有返回 time++; while((temp="=0xff)&&(time<100));" return(temp); sd_reset() time,temp,i; cmd[]="{0x40,0x00,0x00,0x00,0x00,0x95};" ints="1;//开启初始化延时" {spi_w(0xff);} time="0;" 写cmd0 if(time>=200)
{return(cmd0); }
}while(temp!=0x01);
cs=1;
spi_w(0xff);
return 0;
}
uchar sd_int()
{
uchar time,temp;
uchar cmd[]={0x41,0x00,0x00,0x00,0x00,0xff};
cs=0;
time=0;
do
{
temp=sd_com(cmd);
time++;
if(time==100)
{return(cmd1);}
}while(temp!=0) ;
ints=0;
cs=1;
spi_w(0xff);
return 0;
}
uchar sd_w(unsigned long add,uchar *bu)
{
uchar temp,time;
uint i;
uchar cmd[]={0x58,0x00,0x00,0x00,0x00,0xff};//cmd24
add<<=9; 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24);
cmd[2]=((add&0x00ff0000)>>16);
cmd[3]=((add&0x0000ff00)>>8);
cs=0;
time=0;
do
{
temp=sd_com(cmd);
time++;
if(time==100)
{return(0xff);}
}while(temp!=0);
// for(i=0;i<100;i++) 插入若干clk {spi_r();} spi_w(0xfe); 写数据的开头 for(i="0;i<512;i++)" { spi_w(*bu++); } spi_w(0xff); 两个crc校验 temp="spi_r();" if((temp & 0x1f)!="0x05)" cs="1;" return(sdw); while(spi_r()!="0xff);" 一直读到sd卡向flash写完数据 spi_w(0xff) ; return(0); uchar sd_r(unsigned long add,uchar *buf) time,temp; uint j; cmd[]="{0x51,0x00,0x00,0x00,0x00,0xff};//cmd17" add<<="9;//" 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24);
cmd[2]=((add&0x00ff0000)>>16);
cmd[3]=((add&0x0000ff00)>>8);
cs=0;
time=0;
do
{
temp=sd_com(cmd);
time++;
if(time==100)
{return(sdr);}
} while(temp!=0); //说明命令写入成功
while(spi_r()!=0xfe);//读到数据的开头
for(j=0;j<512;j++) { *buf++="spi_r();" } spi_r(); 读2个crc cs="1;" spi_w(0xff); return (0); }< code></512;j++)></100;i++)></=9;></8;i++)>
XXXXXXXXXXXXXXXXXX/NSDN/NGV/blob/master/cortex/firmware/ngv-sys/Drivers/NGV/sd.c
这里有STM32的驱动代码,参考了Arduino等的SD卡驱动,SD卡麻烦的是初始化。
方便起见可以考虑用Arduino做,不然文件读写还要加入fatfs
200字以内,仅用于支线交流,主线讨论请采用回复功能。