<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、概述
上次已经简单描述了SD卡读写程序的层次设计,今天开始一一实现。
二、命令接口程序设计
1、首先添加两个命令:sdrd和sdwr.
《在文件tast_uartcmd.c中》
#define UartCmdMaxCount 10 //现在支持10个内部命令
u8* UartCmdStrTable[UartCmdMaxCount]={ //串口命令字符串
"help","cls","ledon","ledoff",
"time","temp","i2cwr","i2crd",
"sdrd","sdwr"
};
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现在是两个空命令。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
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", SDReadBuf;
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 = 0xaa; } //返回0xaa用于测试
}
void SD_WritBlock( u32 BlockIndex, u8* WriteBuf ){
u16 i;
for ( i="0"; i<512; i++ )
{ WriteBuf = 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 = 0xBB; } //写入用于测试
SD_WriteBlock( BlockIndex, SDWriteBuf );//写一个扇区
}
用户1593293 2009-12-3 10:21