第二步:移植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) // 成功
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)