⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 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 + -