豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))_第1頁
豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))_第2頁
豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))_第3頁
豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))_第4頁
豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng))豆皮 - STM32開發(fā)板入門教程(十三) - SPI模式讀寫SD卡 (原創(chuàng)) 版權(quán)所有 STMFANS 原創(chuàng),轉(zhuǎn)載請(qǐng)保留出處 功能介紹 :使用SPI模式 讀寫SD卡block數(shù)據(jù) 可通過串口發(fā)送到PC機(jī)查看 SD卡是Secure Digital Card卡的簡稱,直譯成漢語就是“安全數(shù)字卡”,是由日本松下公司、東芝公司和美國SANDISK公司共同開發(fā)研制的全新的存儲(chǔ)卡產(chǎn)品。SD存儲(chǔ)卡是一個(gè)完全開放的標(biāo)準(zhǔn)(系統(tǒng)),多用于MP3、數(shù)碼攝像機(jī)、數(shù)碼相機(jī)、電子圖書、AV器材等等,尤其是被廣泛應(yīng)用在超薄數(shù)碼相機(jī)上。呵呵 現(xiàn)在

2、偶們做東西也喜歡用sd卡了 為啥? 容量大啊 價(jià)格便宜啊 讀寫次數(shù)100000次以上(也有資料說是300000次 呵呵) 這個(gè)次數(shù)夠猛了啊 讀寫的速度也很快 現(xiàn)在高速的SD卡寫速度可以達(dá)到20M/S 呵呵 如果你買的SD卡達(dá)不到這個(gè)速度 就應(yīng)該考慮一下是不是買到假貨了 呵呵 現(xiàn)在SD卡都是白菜價(jià)了啊 貌似4G的也就50塊錢一個(gè)啦 嗯 不扯遠(yuǎn)了 繼續(xù)正題 SD卡讀寫有2種方式 一種是SD模式 一種是SPI模式 SD模式操作時(shí)序復(fù)雜 使用的IO口也多 呵呵 常用的一般是SPI模式 我們今天介紹的也是SPI模式 接口簡單 移植也方便 速度也不慢了啊 使用高速的SPI模式 1M/S應(yīng)該是很容易達(dá)到的

3、剛剛把STM32下的SD卡讀寫移植好 也沒測試讀寫速度 呵呵 下回有時(shí)間把讀寫速度測試了發(fā)上來 呵呵 SD卡初始化過程:1. 初始化STM32的SPI接口 使用低速模式2. 延時(shí)至少74clock3. 發(fā)送CMD0,需要返回0x01,進(jìn)入Idle狀態(tài)4. 循環(huán)發(fā)送CMD55+ACMD41,直到返回0x00,進(jìn)入Ready狀態(tài)5. 設(shè)置讀寫block大小為512byte 5. 把STM32的SPI設(shè)置為高速模式讀一個(gè)block塊的過程1. 發(fā)送CMD17(單塊)或CMD18(多塊)讀命令,返回0x002. 接收數(shù)據(jù)開始令牌0xfe + 正式數(shù)據(jù)512Bytes + CRC 校驗(yàn)2Bytes寫一個(gè)

4、block塊的過程1. 發(fā)送CMD24(單塊)或CMD25(多塊)寫命令,返回0x002. 發(fā)送數(shù)據(jù)開始令牌0xfe + 正式數(shù)據(jù)512Bytes + CRC校驗(yàn)2Bytes附上一個(gè)datasheet上的標(biāo)準(zhǔn) spi mode initialization flow 初始化函數(shù)/* Function Name : SD_MMC_SPI_Init* Description : SD_MMC_SPI_Init* Input : None* Output : None* Return : zero init success, non-zero init error*/u8 SD_MMC_SPI_In

5、it(void) GPIO_InitTypeDef GPIO_InitStructure; /* Enable SPI1 and GPIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE); /* Configure SPI1 pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

6、 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure SD_MMC_SPI_CS */ GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SD_MMC_SPI_CS, &a

7、mp;GPIO_InitStructure); / /* initialize SPI with lowest frequency */ SD_MMC_Low_Speed(); /* card needs 74 cycles minimum to start up */ for(u8 i = 0; i < 10; +i) /* wait 8 clock cycles */ SD_MMC_ReadWrite_Byte(0x00); /* address card */ SD_MMC_SPI_SELECT(); /* reset card */ u8 response; for(u16 i

8、= 0; ; +i) response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 ); if( response = 0x01 ) break; if(i = 0x1ff) SD_MMC_SPI_DESELECT(); return 1; /* wait for card to get ready */ for(u16 i = 0; ; +i) response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0); if(!(response & (1 << R1_IDLE_STATE) bre

9、ak; if(i = 0x7fff) SD_MMC_SPI_DESELECT(); return 1; /* set block size to 512 bytes */ if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512) SD_MMC_SPI_DESELECT(); return 1; /* deaddress card */ SD_MMC_SPI_DESELECT(); /* switch to highest SPI frequency possible */ SD_MMC_High_Speed(); return 0; 發(fā)送一個(gè)命令/* Func

10、tion Name : SD_MMC_Send_Command* Description : SD_MMC_Send_Command* Input : None* Output : None* Return : None*/u8 SD_MMC_Send_Command(u8 cmd, u32 arg) u8 Response; u8 Retry = 0; SD_MMC_ReadWrite_Byte(0xff); SD_MMC_SPI_SELECT(); /分別寫入命令 SD_MMC_ReadWrite_Byte(cmd | 0x40); SD_MMC_ReadWrite_Byte(arg &g

11、t;> 24); SD_MMC_ReadWrite_Byte(arg >> 16); SD_MMC_ReadWrite_Byte(arg >> 8); SD_MMC_ReadWrite_Byte(arg); SD_MMC_ReadWrite_Byte(0x95); do / 等待響應(yīng),響應(yīng)的開始位為0 Response = SD_MMC_ReadWrite_Byte(0xff); Retry+; while( (Response&0x80)!=0) && (Retry < 200) ); SD_MMC_SPI_DESELECT();

12、return Response; /返回狀態(tài)值 讀一個(gè)block塊 讀取成功返回0 非0 則讀取失敗/* Function Name : SD_MMC_Read_Single_Block* Description : SD_MMC_Read_Single_Block* Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error*/u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer) u8 Response; u

13、16 i; u16 Retry = 0; /讀命令 send read command Response = SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9); if(Response != 0x00) return Response; SD_MMC_SPI_SELECT(); / start byte 0xfe while(SD_MMC_ReadWrite_Byte(0xff) != 0xfe) if(+Retry > 0xfffe) SD_MMC_SPI_DESELECT(); return 1; /timeout

14、 for(i = 0; i < 512; +i) /讀512個(gè)數(shù)據(jù) *buffer+ = SD_MMC_ReadWrite_Byte(0xff); SD_MMC_ReadWrite_Byte(0xff); /偽crc SD_MMC_ReadWrite_Byte(0xff); /偽crc SD_MMC_SPI_DESELECT(); SD_MMC_ReadWrite_Byte(0xff); / extra 8 CLK return 0; 寫一個(gè)block塊 成功返回0 非0 則寫入失敗/* Function Name : SD_MMC_Write_Single_Block* Descrip

15、tion : SD_MMC_Write_Single_Block* Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error.*/u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer)u8 Response;u16 i;u16 retry=0; /寫命令 send write commandResponse = SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, secto

16、r<<9);if(Response != 0x00) return Response;SD_MMC_SPI_SELECT();SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff); /發(fā)開始符 start byte 0xfeSD_MMC_ReadWrite_Byte(0xfe); /送512字節(jié)數(shù)據(jù) send 512 bytes datafor(i=0; i<512; i+) SD_MMC_ReadWrite_Byte(*buffer+);SD_MMC_ReadW

17、rite_Byte(0xff); /dummy crcSD_MMC_ReadWrite_Byte(0xff); /dummy crcResponse = SD_MMC_ReadWrite_Byte(0xff);/等待是否成功 judge if it successfulif( (Response&0x1f) != 0x05) SD_MMC_SPI_DESELECT(); return Response;/等待操作完 wait no busywhile(SD_MMC_ReadWrite_Byte(0xff) != 0x00) if(retry+ > 0xfffe) SD_MMC_SPI_DESELECT(); return 1; SD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff);/ extra 8 CL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論