?? sd-mmc_.h
字號:
/*********************************************************************
微 雪 電 子 WaveShare http://www.waveShare.net
目 的: 建立SD-MMC操作庫
目標系統: 基于AVR單片機
應用軟件: ICCAVR
版 本: Version 1.0
圓版時間: 2005-06-25
開發人員: SEE
說 明: 若用于商業用途,請保留此段文字或注明代碼來源
深 圳 微 雪 電 子 保 留 所 有 的 版 權
*********************************************************************/
/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新記錄:
----------------------------------------------------------------------
入口參數說明:
----------------------------------------------------------------------
待定參數說明:
----------------------------------------------------------------------
對外變量說明:
----------------------------------------------------------------------
對外函數說明:
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/
#ifndef SD_MMC_H
#define SD_MMC_H
// constants/macros/typdefs
// MMC commands (taken from sandisk MMC reference)
#define MMC_GO_IDLE_STATE 0
#define MMC_SEND_OP_COND 1
#define MMC_SEND_CSD 9
#define MMC_SEND_CID 10
#define MMC_SEND_STATUS 13
#define MMC_SET_BLOCKLEN 16
#define MMC_READ_SINGLE_BLOCK 17
#define MMC_WRITE_BLOCK 24
#define MMC_PROGRAM_CSD 27
#define MMC_SET_WRITE_PROT 28
#define MMC_CLR_WRITE_PROT 29
#define MMC_SEND_WRITE_PROT 30
#define MMC_TAG_SECTOR_START 32
#define MMC_TAG_SECTOR_END 33
#define MMC_UNTAG_SECTOR 34
#define MMC_TAG_ERASE_GROUP_START 35
#define MMC_TAG_ERARE_GROUP_END 36
#define MMC_UNTAG_ERASE_GROUP 37
#define MMC_ERASE 38
#define MMC_CRC_ON_OFF 59
// R1 Response bit-defines
#define MMC_R1_BUSY 0x80
#define MMC_R1_PARAMETER 0x40
#define MMC_R1_ADDRESS 0x20
#define MMC_R1_ERASE_SEQ 0x10
#define MMC_R1_COM_CRC 0x08
#define MMC_R1_ILLEGAL_COM 0x04
#define MMC_R1_ERASE_RESET 0x02
#define MMC_R1_IDLE_STATE 0x01
// Data Start Tokens
#define MMC_STARTBLOCK_READ 0xFE
#define MMC_STARTBLOCK_WRITE 0xFE
#define MMC_STARTBLOCK_MWRITE 0xFC
// Data Stop tokens
#define MMC_STOPTRAN_WRITE 0xFD
// Data Error Token values
#define MMC_DE_MASK 0x1F
#define MMC_DE_ERROR 0x01
#define MMC_DE_CC_ERROR 0x02
#define MMC_DE_ECC_FAIL 0x04
#define MMC_DE_OUT_OF_RANGE 0x04
#define MMC_DE_CARD_LOCKED 0x04
// Data Response Token values
#define MMC_DR_MASK 0x1F
#define MMC_DR_ACCEPT 0x05
#define MMC_DR_REJECT_CRC 0x0B
#define MMC_DR_REJECT_WRITE_ERROR 0x0D
/*--------------------------------------------------------------------
函數全稱:SPI 初始化
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
void spi_init(void)
{
sbi(DDRB,7);
cbi(DDRB,6);
sbi(DDRB,5);
sbi(DDRB,4);
SPCR = (1<<SP) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
}
/*--------------------------------------------------------------------
函數全稱:從SPI發送一個數據并返回一個獲取的數據
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
uint8 spi_(uint8 byte)
{
SPDR = byte;
while(!(SPSR & (1<<SPIF)));
return (SPDR);
}
/*--------------------------------------------------------------------
函數全稱:發送一個命令給MMC
函數功能:
注意事項:
提示說明:命令格式:0xFF, 命令, 地址, (CRC), 0xFF
輸 入:
返 回:
--------------------------------------------------------------------*/
uint8 MMC_setCmd(uint8 cmd, uint16 adrH, uint16 adrL)
{
spi_(0xFF);
spi_(cmd|0x40);
spi_((uint8)(adrH >> 8));
spi_((uint8)adrH);
spi_((uint8)(adrL >> 8));
spi_((uint8)adrL);
spi_(0x95); //第一個命令不能少,之后可以省去
spi_(0xFF);
return spi_(0xFF); //返回最后一個接收的數據
}
/*--------------------------------------------------------------------
函數全稱:MMC初始化
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
bool MMC_init(void)
{
uint8 i;
/* 為選中MMC, 必須先發送 10*8=80 個'1' */
sbi(PORTB,4);
for(i=0; i < 10; i++)
spi_(0xFF);
cbi(PORTB,4);
if(MMC_setCmd(MMC_GO_IDLE_STATE,0,0) != 1)
{
dispMMCErr();
return 0;
}
while(MMC_setCmd(MMC_SEND_OP_COND,0,0) !=0)
dispMMCChkExist();
return 1;
}
uint16 gTimeout = 0xFF;
uint8 gGetDat;
/*--------------------------------------------------------------------
函數全稱:MMC 獲取狀態
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
uint8 MMC_getSta(void)
{
gGetDat = 0xFF;
gTimeout = 0xFFFF;
while( (gGetDat==0xFF) && (gTimeout--) )
gGetDat = spi_(0xFF);
return gGetDat;
}
/*--------------------------------------------------------------------
函數全稱:MMC 等待空閑信號
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
uint8 MMC_waitIdle(void)
{
gGetDat = 0;
gTimeout = 0xFFFF;
while( (gGetDat!=0xFF)&& (gTimeout--) )
gGetDat = spi_(0xFF);
return gGetDat;
}
/*--------------------------------------------------------------------
函數全稱:MMC 等待起始信號
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
uint8 MMC_waitStart(void)
{
gGetDat = 0xFF;
gTimeout = 0xFFFF;
while( (gGetDat!=0xFE) && (gTimeout--) )
gGetDat = spi_(0xFF);
return gGetDat;
}
/*--------------------------------------------------------------------
函數全稱:MMC 寫內容到第一個扇區
函數功能:
注意事項:
提示說明:這里先指定到第一個扇區作為測試
輸 入:
返 回:
--------------------------------------------------------------------*/
bool MMC_writeSector(uint8 *pWrDat)
{
uint16 i;
if(MMC_setCmd(MMC_WRITE_BLOCK,0,512) !=0) //設置 塊 寫命令
return 0;
spi_(0xFE); //發送 起始標志
for(i=0;i<512;i++)
spi_(*pWrDat++); //發送數據
spi_(0xFF); //發送 2 個 dummy 字節
spi_(0xFF);
if( (spi_(0xFF)&0x1F) != 0x05 ) //0x1F = 0b 0001 1111
return 0; //0x05 = 0b 0000 0101
MMC_waitIdle();
return 1;
}
/*--------------------------------------------------------------------
函數全稱:MMC 讀內容到第一個扇區
函數功能:
注意事項:
提示說明:這里先指定到第一個扇區作為測試
輸 入:
返 回:
--------------------------------------------------------------------*/
bool MMC_readSector(uint8 *pRdDat)
{
uint16 i;
uint8 watchVal=0; //調試幫助變量
if(MMC_setCmd(MMC_READ_SINGLE_BLOCK,0,512) != 0)//設置 塊 讀命令
return 0;
MMC_waitStart(); //等待 起始信號
for(i=0;i<512;i++) //讀取數據
{
*pRdDat++ = spi_(0xFF);
watchVal = *(pRdDat-1); //調試幫助變量
}
spi_(0xFF); //發送 2 個 dummy 字節
spi_(0xFF);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -