如何使用8051单片机读写sd卡的TXT文件

如何使用8051单片机读写sd卡的TXT文件,第1张

第一步:你要模拟SPI协议读取SD卡的一个扇区

第二步:移植FATFS文件系统,或者其它文件系统也行。

第三步:用文件系统提供的函数对TXT文件进入基本的输入输出 *** 作,你移植的文件系统会有相关文档介绍。

第四步:要在显示屏上显示,还要加上字库,如果不显示就通过串口发给PC吧。

#include"c8051f340.h"

#include "io.h"

#include "mmc.h"

void delay(uint i) //delay i nus

{

while(--i)

{

}

} void delayms(uint i) //廷时1ms

{

uint de1,de2

for(de2=0de2<ide2++)

for(de1=0de1<1000de1++)

} //############################################################################

uchar mmc_read_byte (void) // 读出一字节

//############################################################################

{

uchar Byte = 0

uchar i = 0

sd_di=1

for (i=0i<8i++)

{

sd_clk=0

delay(4)

Byte=Byte<<1 // 先接收最高位。

if (sd_do==1)

{

Byte |= 0x01

} sd_clk=1

delay(4)

}

return (Byte)

}

//############################################################################

void mmc_write_byte(uchar Byte) //写入一个字节

//############################################################################

{

uchar i

sd_clk=1

for (i =0i<8i++)

{

if (Byte&0x80) // 先写高位的。

{

sd_di=1

}

else

{

sd_di=0

}

sd_clk=0

delay(4)

Byte=Byte<<1

sd_clk=1

delay(4)

}

sd_di=1

} //############################################################################

//Send Command MMC/SD

uchar mmc_write_command (uchar *cmd)

//############################################################################

{

uchar tmp = 0xff

uint Timeout = 0

uchar a

//set MMC_Chip_Select to high (MMC/SD)

MMC_Disable() //sendet 8 Clock Impulse

mmc_write_byte(0xFF) /* 发送8个时钟 */ //set MMC_Chip_Select to low

MMC_Enable() //sendet 6 Byte Command

for ( a = 0a<0x06a++) //send 6 Byte Command

{

mmc_write_byte(cmd[a])

} while (tmp == 0xff)

{

tmp = mmc_read_byte()//等待回复

if (Timeout++ >500)

{

break //超时返回

}

}

return(tmp) //返回响应信息

}

//############################################################################

//写单块,512字节,参数:要写扇区的地址,数据的指针

uchar mmc_write_sector (ulong addr,uchar *Buffer)

//############################################################################

{

uchar tmp

uint a

uchar idata cmd[] = {0x58,0x00,0x00,0x00,0x00,0xFF}//CMD24

//LED_MMC_WR=0

addr = addr <<9//addr = addr * 512

cmd[1] = ((addr &0xFF000000) >>24 )

cmd[2] = ((addr &0x00FF0000) >>16 )

cmd[3] = ((addr &0x0000FF00) >>8 ) //Send Command cmd24 an MMC/SD (Write 1 Block/512 Bytes)

tmp = mmc_write_command (cmd)

if (tmp != 0) //

{

//LED_MMC_WR=1

return(tmp)

} //

for (a=0a<100a++)

{

mmc_read_byte() ////Before writing,send 100 clock to MMC/SD-Card

}

//Send Start Byte an MMC/SD

mmc_write_byte(0xFE) //发送读、写命令后都要发送起始令牌FEH

for ( a=0a<512a++)

{

mmc_write_byte(*Buffer++)

}

//CRC-Byte schreiben /* 写入CRC字节 */

mmc_write_byte(0xFF)//Schreibt Dummy CRC

mmc_write_byte(0xFF)//CRC Code wird nicht benutzt

//Wartet auf MMC/SD-Karte Bussy /* 读取XXX0 0101字节 */ ????

while (mmc_read_byte() != 0xff){}//????

//set MMC_Chip_Select to high

MMC_Disable()

//LED_MMC_WR=1

return(0)

}

//############################################################################

//读Bytes个字节数据放在缓冲区内

//命令,缓冲区指针,长度

void mmc_read_block(uchar *cmd,uchar *Buffer,uint Bytes)

//############################################################################

{

//Send Command cmd an MMC/SD

uint a

if (mmc_write_command (cmd) != 0)

{

return

}

while (mmc_read_byte() != 0xfe){} for ( a=0a<Bytesa++)

{

*Buffer++ = mmc_read_byte()

}

//CRC-Byte auslesen /* 取走CRC字节 */

mmc_read_byte()//CRC - Byte wird nicht ausgewertet

mmc_read_byte()//CRC - Byte wird nicht ausgewertet

MMC_Disable()

return

} //############################################################################

//读一个扇区数据

//扇区地址,缓冲区指针

uchar mmc_read_sector (ulong addr,uchar *Buffer)

//############################################################################

{

//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte

uchar idata cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF} ///* READ SINGLE BLOCK */

//LED_MMC_WR=0

addr = addr <<9//addr = addr * 512 /* address*512,取512的整数倍 */ cmd[1] = ((addr &0xFF000000) >>24 )

cmd[2] = ((addr &0x00FF0000) >>16 )

cmd[3] = ((addr &0x0000FF00) >>8 )mmc_read_block(cmd,Buffer,512) //LED_MMC_WR=1

return(0)

} //############################################################################

uchar mmc_init ()//sd 初始化

//############################################################################

{

uchar Timeout = 0

uchar b

uchar idata CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}//CMD0

sd_do=1

sd_clk=1

sd_cs=1delayms(500)

//Initialisiere MMC/SD- in SPI-Mode

for ( b = 0b<0x10b++)

{

mmc_write_byte(0xff)

}

//Send Command CMD0 an MMC/SD-Karte

while(mmc_write_command (CMD) !=0x01) //等于1表示复位成功

{

//ComSendByte(0x82)// 返回错误

if (Timeout++ >5)

{ // led_run=1

return(1)

}

}

//Send Command CMD1 MMC/SD

Timeout = 0

CMD[0] = 0x41//Commando 1

CMD[5] = 0xFF //CMD1

while( mmc_write_command (CMD) !=0)

{

if (Timeout++ >100)

{

return(2)

}

}

//set MMC_Chip_Select to high (MMC/SD )

MMC_Disable()

return(0) // 成功

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11244249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存