STM32用cube配置FATFS模式下SPI读写SD卡
要求:掌握SD卡協議原理,用STM32F103 完成對SD卡的數據讀取(FAT文件模式)
目錄
- 一、SD卡與FATS
- 1、SD卡
- 2、FATFS文件系統
- 二、工程實現
- 1、編譯運行
- 2、接線
- 3、初始化文件模式
- 4、燒錄
- 5、實驗結果
- 三、代碼分析
- 四、實驗感想
- 參考文獻
一、SD卡與FATS
1、SD卡
(1)簡介
SD 卡(Secure Digital Memory Card)在我們生活中已經非常普遍了,控制器對 SD卡進行讀寫通信操作一般有兩種通信接口可選,一種是 SPI接口,另外一種就是 SDIO 接口。SDIO 全稱是安全數字輸入/輸出接口,多媒體卡(MMC)、SD 卡、SD I/O 卡都有 SDIO 接口。SD I/O 卡本身不是用于存儲的卡,它是指利用 SDIO 傳輸協議的一種外設。比如 Wi-Fi Card,它主要是提供 Wi-Fi功能,有些 Wi-Fi模塊是使用串口或者 SPI接口進行通信的,但 Wi-Fi SDIO Card是使用 SDIO 接口進行通信的。
(2)操作模式
SD卡的操作模式:SD卡模式(SDIO)、SPI模式(默認為SD模式)。
其中SD卡模式的信號線有:CLK、CMD、DAT0-DAT3,6根線。
SPI模式的信號線有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根線。
CLK 時鐘同步線
CMD 命令信號線,主機發出的命令以及從機對命令的響應都是通過這條線進行傳輸
DAT[3:0] 表示4條數據線,主機和從機的數據都是從這四條數據線上傳輸
(3)物理結構
一張 SD卡包括有存儲單元、存儲單元接口、電源檢測、卡及接口控制器和接口驅動器 5個部分。存儲單元是存儲數據部件,存儲單元通過存儲單元接口與卡控制單元進行數據傳輸;電源檢測單元 保證 SD卡工作在合適的電壓下,如出現掉電或上狀態時,它會使控制單元和存儲單元接口復位;卡及接口控制單元 5個部分控制 SD卡的運行狀態,它包括有 8個寄存器;接口驅動器控制 SD卡引腳的輸入輸出。
- SD卡功能框圖如下
2、FATFS文件系統
FATFS是面向小型嵌入式系統的一種通用的FAT文件系統,它由ANSI C語言編寫且完全獨立于底層的I/O介質,因此它可以很容易的不加修改的移植到其他處理器當中,就可以利用文件系統的各種函數,對已格式化的SD卡的文件進行讀寫。
二、工程實現
因為能力有限,所以這次主要完成的是對于已經完成的工程的直接使用,并且在此基礎上做出一點修改。 具體有關于工程的搭建,可以看這篇文章:
https://blog.csdn.net/qq_39758638/article/details/103573843
在這里放上工程的下載連接:
https://pan.baidu.com/s/1izzu14Zy2myHm2ZI4NFSGg
提取碼:t11v
1、編譯運行
打開下載的文件中的MDK-ARM文件夾,在其中可以找到工程文件,使用keil打開
編譯運行,發現沒有錯誤
2、接線
按下圖方式接線
| CS | PA4 |
| SCK | PA5 |
| MISO | PA6 |
| MISI | PA7 |
| VCC | 5V |
| GUN | GUN |
注意點:
- 供電需要是5V,最開始設置的供電是3.3V,但是實驗沒有成功,改成5V,才能夠成功運行,所以可能是3.3V的供電不足
- 連接的杜邦線盡可能短,并且最好連線緊一點,就是這些細節很大程度上決定了你會不會成功
3、初始化文件模式
在正式開始燒錄之前,要想初始化SD卡的,文件系統為FAT32,然后點擊開始就可以完成
出現彈窗,然后點擊確定
格式化成功
4、燒錄
打開mcuisp文件,按照以下順序進行燒錄
- 搜索串口
- 選擇剛才生成的hex文件
- 讀取器件信息
- 開始編程
出現右側的字樣說明燒錄成功
5、實驗結果
打開串口調試助手,然后點擊打開串口
如果右側一直是mian的字樣,嘗試用手按緊接線試一試
發現串口收到了信息,顯示SD卡初始化成功,掛載成功,打開成功,創建文件成功
使用讀卡器讀取SD卡,發現在文件夾中保存有一個文件HELLO.TXT
打開文件后,發現顯示了一串字符,但是含有亂碼
為了解決這個錯誤,對代碼進行了修改,將main.c中的這兩行注釋掉
再次執行一遍以上的步驟,發現沒有錯誤了
三、代碼分析
主函數
int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI1_Init();MX_FATFS_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); //enable uart printf(" mian \r\n");Get_SDCard_Capacity(); //得到使用內存并選擇格式化/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){ WritetoSD(WriteBuffer,sizeof(WriteBuffer)); HAL_Delay(500);WriteBuffer[0] = WriteBuffer[0] +0;WriteBuffer[1] = WriteBuffer[1] +1;write_cnt ++; while(write_cnt > 10){ printf(" while \r\n");HAL_Delay(500);} /* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ }SD卡寫入函數
void WritetoSD(BYTE write_buff[],uint8_t bufSize) {FATFS fs;FIL file;uint8_t res=0;UINT Bw; res = SD_init(); //SD卡初始化if(res == 1){printf("SD卡初始化失敗! \r\n"); }else{printf("SD卡初始化成功! \r\n"); }res=f_mount(&fs,"0:",1); //掛載// if(test_sd == 0) //用于測試格式化if(res == FR_NO_FILESYSTEM) //沒有文件系統,格式化{ // test_sd =1; //用于測試格式化printf("沒有文件系統! \r\n"); res = f_mkfs("", 0, 0); //格式化sd卡if(res == FR_OK){printf("格式化成功! \r\n"); res = f_mount(NULL,"0:",1); //格式化后先取消掛載res = f_mount(&fs,"0:",1); //重新掛載 if(res == FR_OK){printf("SD卡已經成功掛載,可以進進行文件寫入測試!\r\n");} }else{printf("格式化失敗! \r\n"); }}else if(res == FR_OK){printf("掛載成功! \r\n"); }else{printf("掛載失敗! \r\n");} res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);if((res & FR_DENIED) == FR_DENIED){printf("卡存儲已滿,寫入失敗!\r\n"); }f_lseek(&file, f_size(&file));//確保寫詞寫入不會覆蓋之前的數據if(res == FR_OK){printf("打開成功/創建文件成功! \r\n"); res = f_write(&file,write_buff,bufSize,&Bw); //寫數據到SD卡if(res == FR_OK){printf("文件寫入成功! \r\n"); }else{printf("文件寫入失敗! \r\n");} }else{printf("打開文件失敗!\r\n");} f_close(&file); //關閉文件 f_mount(NULL,"0:",1); //取消掛載}四、實驗感想
這次實驗并不困難,但是很容易因為一些微小的操作不當導致出錯。我在做實驗時,也是重復了許多次,才終于成功,是一次寶貴的經驗。
參考文獻
https://blog.csdn.net/ZHONGCAI0901/article/details/113190393
總結
以上是生活随笔為你收集整理的STM32用cube配置FATFS模式下SPI读写SD卡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于VPB的三维地形建模小结
- 下一篇: 软件设计师考试大纲(2004版)