一、概述
上次已经简单描述了SD卡读写程序的层次设计,今天开始一一实现。
二、命令接口程序设计
1、首先添加两个命令:sdrd和sdwr.
《在文件tast_uartcmd.c中》
#define UartCmdMaxCount 10
//现在支持10个内部命令
u8* UartCmdStrTable[UartCmdMaxCount]={ //串口命令字符串
\"help\
\"time\
\"sdrd\
};
2、添加命令处理程序:
UartCmdTable[8].UartCmdFunc=UartCmdSDRead;
UartCmdTable[9].UartCmdFunc=UartCmdSDWrite;
《在文件uartcmd.c中》
void UartCmdSDRead(void){}
void UartCmdSDWrite(void){} 先定义空函数,编译通过再说。
《在文件uartcmd.h中》
void UartCmdSDRead(void);
void UartCmdSDWrite(void);
然后编译,一次性编译通过。但是输入help,没有显示sdrd和sdwr命令,在帮助命令里还没有完成。
void UartCmdHelp(void){
Uart_PutString(\"cls \");
Uart_PutString(\"ledon \");
Uart_PutString(\"ledoff \");
Uart_PutString(\"time \");
Uart_PutString(\"temp \");
Uart_PutString(\"i2cwr \");
Uart_PutString(\"i2crd \\r\\n\");
Uart_PutString(\"sdrd \"); //以下两句为新添加。
Uart_PutString(\"sdwr \\r\\n\");
}
再次编译,sdwr和sdrd现在是两个空命令。
3、UartCmdSDRead()处理程序的编写
(1)设计目标:从SD卡读出一个扇区的内容,并以十六进制显示。
(2)框架设计
void UartCmdSDRead(void){
static u8 SDReadBuf[512]; //SD扇区缓冲区
u32 BlockNum=\"0\";
u16 i;
u8 StrHex[4]; //将8位字节转变为十六进制表示
SD_ReadBlock( BlockNum, SDReadBuf ); //读取制定扇区
for ( i=\"0\"; i<512; i++ ) // 将8位字节转变为十六进制,送串口输出
{ sprintf ( (char*)StrHex, \"%02X\
Uart_PutStr ( StrHex ); }
Uart_PutStr ( \" \" );
if ( i%16 == 15 ) Uart_PutStr (\"\\r\\n\");//每行十六个。
}
(3)添加sduser.c文件,里面包括sd卡操作的基本四个函数。
void SD_Config( void ){
}
void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf ){
u16 i;
for ( i=\"0\"; i<512; i++ )
{ ReadBuf[i] = 0xaa; } //返回0xaa用于测试
}
void SD_WritBlock( u32 BlockIndex, u8* WriteBuf ){
u16 i;
for ( i=\"0\"; i<512; i++ )
{ WriteBuf[i] = 0xaa; } //
}
void SD_EraseBlock( u32 BlockIndex, u32 BlockNum ){
BlockIndex=BlockNum; //防止编译器报错
}
建立头文件sdcard.h,包含sd卡操作的基本函数,
#ifndef __SDCARD_H
#define __SDCARD_H
void SD_Config( void );
void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf );
void SD_WritBlock( u32 BlockIndex, u8* WriteBuf );
void SD_EraseBlock( u32 BlockIndex, u32 BlockNum );
#endif /* __SDCARD_H */
然后在device.h中包含它,#include \"sdcard.h\"。
编译成功后,执行sdrd,屏幕显示32行,每行16个AA.
4、void UartCmdSDWrite() 处理程序的编写
void UartCmdSDWrite(void){
static u8 SDWriteBuf[512];
//SD扇区缓冲区
u32 BlockIndex=\"0\";
u16 i;
for ( i=\"0\"; i<512; i++ )
{ SDWriteBuf[i] = 0xBB; } //写入用于测试
SD_WriteBlock( BlockIndex, SDWriteBuf );//写一个扇区
}
因篇幅问题不能全部显示,请点此查看更多更全内容