不知道这个对你有不有用,我发个主程序给你,拿去改改或许能用,
希望能帮到你:/
#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卡数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)