?? mmc.c
字號:
/******************************************
* 程序名稱: MMC(SD)卡讀寫程序
* 程序功能: MMC(SD)卡接口操作
* 目標硬件: AVR MCU "ATMEGA162" 16.0000MHz
* 創建日期: 2007-12
* 原創作者: XuGuoHong
* kk20y@yahoo.com.cn
* 修改記錄: 無
******************************************/
/* INCLUDE參數 */
#include <iom162v.h>
/* 全局變量 */
extern unsigned char sector[512];
/************************************
* MMC卡片選-1選中/0不選中
************************************/
void MMCCS(unsigned char cs)
{
if(cs==0)
PORTB|=(1<<PB4); /* SS=1 */
else
PORTB&=~(1<<PB4); /* SS=0 */
}
/*******************************
* MMC命令發送
*******************************/
unsigned char MMCWrCmd(unsigned char *cmd)
{
unsigned char i=0,k=0;
unsigned char temp=0XFF;
MMCCS(0); /* 片選無效 */
spi_send(0XFF); /* 發送8個時鐘 */
MMCCS(1); /* 片選有效 */
asm("nop");
for(i=0; i<6; i++)
{
spi_send(*(cmd++)); /* 發送命令 */
}
while(temp==0XFF)
{
temp = spi_send(0XFF); /* 等待回復 */
if(k++>200) /* 超時返回 */
{
return temp;
}
}
return temp;
}
/*******************************
* MMC初始化
*******************************/
unsigned char MMCInit(void)
{
unsigned int timeout;
unsigned char i=0,temp=0;
unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
DelayMs(500);
/* 發送一定數量的時鐘脈沖 */
for(i=0;i<0x10;i++)
{
spi_send(0XFF);
}
/* 發送CMD0 */
if(MMCWrCmd(cmd)!=0X01)
return 0;
/* 發送CMD1 */
cmd[0]=0X41;
cmd[5]=0XFF;
while(MMCWrCmd(cmd)!=0X00)
{
if(timeout++>0XFFFE) /* 等待初始化完成 */
return 0; /* 容量大的MMC卡需要用比較長時間 */
}
SPIHiSPD(); /* 提高MCU SPI速度 */
return 1;
}
/*******************************
* 讀取MMC-CID寄存器
*******************************/
unsigned char MMCCID(void)
{
unsigned char i;
unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
cmd[0]=0X40+10;
if(MMCWrCmd(cmd)!=0X00) /* 發送CMD9 */
return 0; /* 讀取失敗 */
for(i=0;i<16;i++)
//uart1_send(spi_send(0XFF));
spi_send(0XFF);
return 1;
}
/*******************************
* 讀取ONE BLOCK數據
* address-扇區地址
*******************************/
unsigned char MMCRdBolck1(unsigned long address)
{
unsigned int i;
unsigned char temp;
unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
cmd[0]=0X40+17; /* READ SINGLE BLOCK */
address=address<<9; /* address*512,取512的整數倍 */
cmd[1]=(address>>24);
cmd[2]=(address>>16);
cmd[3]=(address>>8);
cmd[4]=(address>>0);
if(MMCWrCmd(cmd)!=0X00) /* 發送CMD17 */
return 0; /* 讀取失敗 */
while(spi_send(0XFF)!=0XFE)
{
asm("nop"); /* 等待數據接受開始,受到0XFE表示開始 */
}
for(i=0;i<512;i++) /* 讀取數據 */
{
sector[i]=spi_send(0XFF);
}
spi_send(0XFF); /* 取走CRC字節 */
spi_send(0XFF);
return 1;
}
/*******************************
* 寫ONE BLOCK數據
* address-扇區地址
*******************************/
unsigned char MMCWrBlock1(unsigned long address,unsigned char *buffer)
{
unsigned int i;
unsigned char temp;
unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
cmd[0]=0x40+24; /* WRITE SINGLE BLOCK */
address=address<<9; /* address*512,取512的整數倍 */
cmd[1]=(address>>24);
cmd[2]=(address>>16);
cmd[3]=(address>>8);
cmd[4]=(address>>0);
if(MMCWrCmd(cmd)!=0X00) /* 發送CMD24 */
return 0; /* 寫入失敗 */
spi_send(0XFF); /* 發送填沖字節 */
spi_send(0XFE); /* 發送數據開始標志0XFE */
for(i=0;i<512;i++) /* 寫入數據 */
{
spi_send(sector[i]);
}
spi_send(0XFF); /* 寫入CRC字節 */
spi_send(0XFF);
temp=spi_send(0XFF); /* 讀取XXX0 0101字節 */
temp=temp&0X1F;
if(temp!=0X05)
return 0; /* 寫入失敗 */
while(spi_send(0XFF)==0X00)
{
asm("nop"); /* BUSY等待 */
}
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -