欢迎来到天天文库
浏览记录
ID:39464939
大小:43.00 KB
页数:5页
时间:2019-07-03
《AVR单片机的SD卡驱动程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、注:本程序只做学习用途.#include#defineSPI_DDRDDRB#defineSPI_PORTPORTB#defineSPI_PINPINB#defineSPI_SSPB0#defineSPI_MOSIPB2#defineSPI_MISOPB3#defineSPI_SCKPB1#defineSET_SD_CSPORTG
2、=(1<3、=(1<4、口为高#defineSDCSDDDR()DDRG5、=(1<6、=(1<7、(1<8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
3、=(1<4、口为高#defineSDCSDDDR()DDRG5、=(1<6、=(1<7、(1<8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
4、口为高#defineSDCSDDDR()DDRG
5、=(1<6、=(1<7、(1<8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
6、=(1<7、(1<8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
7、(1<8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
8、(1<9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
9、(1<10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
10、I,主机方式,MSB在前,模式0,128分频}voidSPI_High(void){//SPI高速模式SPCR=0;SPCR=(1<11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
11、(1<12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
12、=(1<13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
13、(1<14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
14、(1<15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
15、(1<16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
16、//将SSSCKMOSI置为输出}uint8_tSPI_RW(uint8_tdat){//SPI读写1Byte(欲想读之必先与之)SPDR=dat;while(!(SPSR&(1<17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x0018、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
17、;for(i=0;i<6;i++){SPI_RW(*cmd);cmd++;}SPI_RW(0XFF);//写入指令后附加8个时钟脉冲retry=0;do//不断地读{temp=SPI_RW(0XFF);retry++;}while((temp==0XFF)&&(retry<254));return(temp);}uint8_tSD_Init(void){uint8_ti,temp;uint16_tretry;//重试次数16位数据(适应大容量SD卡)uint8_tCMD[]={0x40,0x00,0x00,0x00
18、,0x00,0x95};SDCSDPORT();//G口设为输出SDCSDDDR();SPI_Init();SPI_Low();//SPI初始化低速模式for(i=0;i<200;i++)//WaitMMC/SDready...{asm("nop");}retry=0;do{SET_SD_CS;for(i=0;i<0x0f;i++){SPI_RW(0xff);//至少74个信号脉冲}temp=SD_Write_Com(CMD);//写入CMD0号命令,最大重试次数254retry++;if(retry==600){
19、SET_SD_CS;return(1);//写入CMD0号命令错误}}while(temp!=1);CMD[0]=0x41;//CMD1号命令CMD[5]=0xFF;retry=0;do{temp=SD_Write_Com(CMD);retry++;if(retry>60000)//写入CMD1号命令,最大重试次数60000{SET_SD_CS;//关闭片选return(1);//写CMD1命令失败}}while(temp!=0);SET_SD_CS;//关闭片选SPI_High();//初始化成功,SPI高速模式
20、SET_SPI_MOSI;//没数据时SD_MI应保持为高电平return(0);//成功初始化}uint8_tSD_Write_Sector(uint32_taddr,uint8_t*buffer){//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)uint8_ttemp,retry;uint16_ti;uint8_t
此文档下载收益归作者所有