AVR或者51单片机的SD卡数据读写系统电路顺便有C程序代码的。我做LCM用于TFT屏测试当做图片存储用,

AVR或者51单片机的SD卡数据读写系统电路顺便有C程序代码的。我做LCM用于TFT屏测试当做图片存储用,,第1张

不知道这个对你有不有用,我发个主程序给你,拿去改改或许能用,

希望能帮到你:/

#include <reg52h>

#include <intrinsh>

#include "lcdh"

#include "MMCh"

uchar csd_data[16];

uchar cid_data[16];

unsigned char by;

unsigned int c_size, c_size_mult, read_bl_len;

unsigned long drive_size;

unsigned long size_mb;

/

延时子函数

/

void delayms(uint ms)

{

unsigned char k;

while (ms--)

{

for (k = 0; k < 228; k++)

;

}

}

/

主函数

/

void main(void)

{

P2 = 0xff;

P0 = 0xff;

LCD_init();

LCD_clear(5);

LCD_ShowString(38,5,colors[4],colors[7],"SD/MMC");

ChineseChar(32,22,0,colors[2],colors[7],1); //程

ChineseChar(48,22,0,colors[2],colors[7],2); //序

ChineseChar(64,22,0,colors[2],colors[7],3); //测

ChineseChar(80,22,0,colors[2],colors[7],4); //试

MMC_Init(); //初始化SD卡

if(Init_Flag == 0)

{

LCD_ShowString(12,50,colors[0],colors[7],"INIT SUCCESS");

LCD_ShowString(2,75,colors[0],colors[7],"TYPE:");

if(card_type)

{ LCD_ShowString(52,75,colors[2],colors[7],"SD");

ChineseChar(68,75,1,colors[2],colors[7],1); //卡

}

else

{ LCD_ShowString(52,75,colors[2],colors[7],"MMC");

ChineseChar(68,75,1,colors[2],colors[7],1); //卡

}

Read_CID_MMC(cid_data);

LCD_ShowString(2,95,colors[0],colors[7],"NAME:");

LCD_ShowChar(50,95,colors[2],colors[7],cid_data[3]);

LCD_ShowChar(58,95,colors[2],colors[7],cid_data[4]);

LCD_ShowChar(66,95,colors[2],colors[7],cid_data[5]);

LCD_ShowChar(74,95,colors[2],colors[7],cid_data[6]);

LCD_ShowChar(82,95,colors[2],colors[7],cid_data[7]);

Read_CSD_MMC(csd_data);

//C_SIZE为CSD[73:62]

c_size=csd_data[6] & 0x03; //bits 10

c_size<<=10;

c_size+=(unsigned int)csd_data[7]<<2;

c_size+=csd_data[8]>>6;

//READ_BL_LEN为CSD[83:80]

by= csd_data[5] & 0x0F;

read_bl_len=1;

read_bl_len<<=by; //2^by

//C_SIZE_MULT为CSD[49:47]

by=csd_data[9] & 0x03; //获取multiply

by<<=1;

by+=csd_data[10] >> 7;

c_size_mult=1;

c_size_mult<<=(2+by); //2^(c_size_mult+2)

//存储器容量=BLOCKNRBLOCK_LEN

//BLOCKNR = (C_SIZE+1) MULT MULT = (C_SIZE_MULT) 2^(C_SIZE_MULT + 2) BLOCK_LEN = (READ_BL_LEN < 12) 2^(READ_BL_LEN)

drive_size=(ulong)(c_size+1) (ulong)c_size_mult (ulong)read_bl_len;

size_mb= drive_size>>20; //10241024=1048576=2^20;

LCD_ShowString(2,115,colors[0],colors[7],"SIZE:");

LCD_ShowChar(52,115,colors[2],colors[7],size_mb/1000|0x30);

LCD_ShowChar(60,115,colors[2],colors[7],size_mb%1000/100|0x30);

LCD_ShowChar(68,115,colors[2],colors[7],size_mb%100/10|0x30);

LCD_ShowChar(76,115,colors[2],colors[7],size_mb%10|0x30);

LCD_ShowChar(84,115,colors[2],colors[7],'M');

LCD_ShowChar(92,115,colors[2],colors[7],'B');

}

else

{

LCD_ShowString(12,50,colors[0],colors[7],"INIT FAILURE"); //初始化失败

while(1)

{

LCD_ShowString(8,75,colors[2],colors[7],"CARD CHECK-UP"); //卡检查提示闪动显示

delayms(1000);

LCD_ShowString(8,75,colors[2],colors[7]," ");

delayms(1000);

}

}

while(1) ;

}

//

SD卡是串行SPI接口的,单片机里面能够占用很少资源读取sd卡内容的芯片很少,一般都要编写很大容量的程序才能读sd卡。所以你的想法要实现,需要一个很大的rootloader程序,不仅占用很大的单片机ROM空间,而且读sd卡中的程序速度也会比较慢,相比之下还不如直接使用传统并行接口的大容量EPROM芯片方便和划算。

所以说,你的想法,理论是可行,实际上好比一个有42大脚的人要去100米以外的地方,非要穿一个三寸金莲的鞋,为什么不光脚跑过去?

为何不把代码贴出来?你确信你的代码是正确的?

为何不把原理图给出来?你确定你的硬件也是没问题吗?

既然你的软件和硬件都没问题,那我想应该就是SD卡坏了,还是坏的很灵异那种。

TF卡就是SD卡。自己去找SD卡的读写资料,大把大把的。

再说,你也没说是哪个单片机。51只能模拟SPI,AVR有SPI模块,而STM32有专门的sd读写端口。所以三个程序完全不一样。

吼吼,那你有的干了。要读写文件的话。你还需要写FAT32格式文件的读写程序,如果再考虑SD卡的使用,估计你还要显示和 *** 作。上个 *** 作系统吧,UCOS或者别的开源系统都不错的。不跑也行,看你编程功底了。

以上就是关于AVR或者51单片机的SD卡数据读写系统电路顺便有C程序代码的。我做LCM用于TFT屏测试当做图片存储用,全部的内容,包括:AVR或者51单片机的SD卡数据读写系统电路顺便有C程序代码的。我做LCM用于TFT屏测试当做图片存储用,、单片机的程序可以烧进sd卡中吗然后单片机把sd卡的程序调进内存中进行运行谁做过这方面的设计啊……、51单片机读写SD卡数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9290307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存