📄 mmc.c
字号:
//-----------------------------------------------------------------
// 名称: MMC卡块读写程序
//-----------------------------------------------------------------
#define _XTAL_FREQ 4000000UL
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#include <htc.h>
//MMC卡使能与禁止操作
#define MMC_CS_EN() RC2 = 0
#define MMC_CS_DI() RC2 = 1
//块字节读写缓冲(512字节)
extern INT8U Block_bytes[512];
//MMC卡操作命令帧(6字节,48位)
INT8U cmd[6] = { 0x00,0x00,0x00,0x00,0x00,0x00 };
//-----------------------------------------------------------------
// MMC命令帧清0
//-----------------------------------------------------------------
void clear_cmd_frame()
{
INT8U i = 0;
for (i = 0; i < 6; i++) cmd[i] = 0x00; //6字节MMC命令帧清0
}
//-----------------------------------------------------------------
// 写MMC命令
//-----------------------------------------------------------------
INT8U MMC_Write_Command(INT8U *cmd_frame)
{
INT8U i = 0,k = 0,temp = 0xFF;
MMC_CS_DI(); //禁止片选
putcSPI(0xFF); //发送8个时钟
MMC_CS_EN(); //片选有效
//发送6字节命令帧(48位)
for(i = 0; i < 6; i++) putcSPI(cmd_frame[i]);
while(temp == 0xFF)
{
temp = getcSPI(); //等待响应
if( k++ > 200) return temp; //超时返回
}
return temp;
}
//-----------------------------------------------------------------
// MMC初始化
//-----------------------------------------------------------------
INT8U MMC_Initialise()
{
INT16U timeout = 0;
INT8U i = 0;
clear_cmd_frame(); //命令帧清0
cmd[0] = 0x40; //设置CMD0(0x40....0x95)(复位)
cmd[5] = 0x95;
__delay_ms(100);
for(i = 0;i < 16; i++) putcSPI(0xFF); //发送时钟脉冲
if(MMC_Write_Command(cmd) != 0x01) return 0;//发送MMC复位命令CMD0
cmd[0] = 0x41; //设置CMD1(0x41....0xFF)(初始化)
cmd[5] = 0xFF;
while(MMC_Write_Command(cmd) != 0x00) //发送MMC初始化命令CMD1
if(timeout++ > 0xFFFE) return 0; //等待初始化完成
//容量大的MMC卡需要较长时间
return 1;
}
//-----------------------------------------------------------------
// 从指定的块地址读取单个块字节数据
//-----------------------------------------------------------------
INT8U MMC_Read_Block(INT32U address)
{
}
//-----------------------------------------------------------------
// 向指定的块地址开始写入单个块字节数据(buffer为数据缓冲指针)
//-----------------------------------------------------------------
INT8U MMC_Write_Block(INT32U address,INT8U *buffer)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -