您的当前位置:首页SD卡读写程序设计(二)

SD卡读写程序设计(二)

2021-03-01 来源:爱问旅游网
SD卡读写程序设计(二)

一、概述

上次已经简单描述了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 );//写一个扇区

}

因篇幅问题不能全部显示,请点此查看更多更全内容