单片机如能读取到flash芯片,其数据拥有量就能以若干M(兆)字节计,若进而能读取SD卡则不得了要以G(千兆)字节来计了。SD卡天生有随意扯出来到电脑或其他单片机上倒腾共享海量数据的神性,而且便宜不费银子,速度还也不慢,直连STC的IO口就能驱动(不要任何接口电路)。但是SD卡应用时比flash芯片难搞一点,约定的命令帧方式很麻烦,读写都得成块的蠢搞,还要占用较大的SRAM做缓存,严重的限制了其应用范围,难坏了一大帮业余科学实验家。
今这小亮一“读SD卡图形直接写屏”的非常规招式,不占SRAM内存了、代码量减少了、速度加快了、低阶的单片机也能引用了,这可是“鼠辈得翼成仙”的节奏,非同小可。看官若不耻试纳实验之,或能让你的SD卡的应用容易10倍、应用范围扩大100倍。有点吹,好在不犯法。靠谱实用就是硬道理。
贴出俺的科学实验中成功应用的代码模块:
//==================读彩色图形数据库直接写到彩屏============================
void LCD_SD_TX_ALL(u32 add)
{
u8 temp,i=80,p=0; //128X160彩色图形文件40960字节计为80页
u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //读块命令帧CMD17
LCDDEV_SetWindow(0,0,159,127); //屏幕开窗
while(i--){ u16 q=512;
table[1]=((add&0xff000000)>>24); //页地址填入命令帧
table[2]=((add&0x00ff0000)>>16);
table[3]=((add&0x0000ff00)>>8);
table[4]=add;
add=add+1; //页(512)递增
SPI_SD_CS =0;
do{ temp=write_cmd(table); }while(temp!=0); //连续蠢发命令帧,直到获取正确回答“0”。
SPI_SendByte(0xff);
while(SPI_SendByte(0xff)!=0xfe); //傻等接收口令“0xFE”
while(q--){ write_XDATA(LCD_DATA,SPI_SendByte(0)); } //读SD卡数据直接刷写到彩屏里的寄存器
SPI_SendByte(0xff); //空读CRC,虽与咱SPI通信方式无关,还是得依约行事。
SPI_SendByte(0xff);
SPI_SD_CS =1;
SPI_SendByte(0xff);
}
}
/*=============读SD卡40X72字符库直接写屏=============================================*/
void LCD_SD_HZ72(u8 x, u8 y, u8 S, u32 add)
{ u8 CharCode,BitCnt,temp; u16 h;
u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //读块命令帧CMD17
while(S--){
table[1]=((add&0xff000000)>>24); //填入页地址
table[2]=((add&0x00ff0000)>>16);
table[3]=((add&0x0000ff00)>>8);
table[4]=add;
add=add+1; //页递增
SPI_SD_CS =0;
do
{temp=write_cmd(table);
}while(temp!=0);
SPI_SendByte(0xff);
while(SPI_SendByte(0xff)!=0xfe);
LCDDEV_SetWindow(x,y,x+56,y+71); //字符显示位置开窗
for(h=0;h<512;h++){
CharCode = SPI_SendByte(0);
for(BitCnt=0;BitCnt<8;BitCnt++) {
if((CharCode&0x01)== 1) {LCD_Data(0xfffff);} //取字符颜色值
else {LCD_Data(0x0000); }
CharCode=CharCode>>1; }
}
x+=56;
SPI_SendByte(0xff);
SPI_SendByte(0xff);
SPI_SD_CS =1;
SPI_SendByte(0xff);
}
}
用SD卡套做的小卡卡座和废置电路板上截下的SD卡座,直连STC的SPI端口不需上拉电阻。地球资源被极用。
STC单片机读取图形数据后直接写屏。 你可能没注意到,实现SD卡功能不需改动硬件,只加代码段就能任性显示SD里的海量图形数据,
单片机调用SD卡需要用到物理地址,可用WINHXE查得。提要:SD卡有2G以下的V1.0版用CMD0和CMD1命令初始化,2G以上的V2.0版用CMD0、CMD8、CMD55+CMD41初始化。但是有几片SD卡或太山寨,弄了好久都初始化不了,被俺判定属于功能阉割类型,遗憾的放弃读它了。
|