microSDカードの読み書きをstm32のSPI通信で行う。(2024/6/12)
この動画が非常に参考になった。
自分の場合、このリンク先の「UPDATE 2」に該当した。
https://controllerstech.com/sd-card-using-spi-in-stm32/
回路は、以下の画像に注意して、(SDCのSPI列)
必ずSCLK以外のDO、DI、CSは、10kΩでプルアップし、3.3V電源はマイコン以外のものを用意する。
![画像18](https://assets.st-note.com/production/uploads/images/41914784/picture_pc_c235f24d2f02331677a15a0d0e3eceef.png)
![](https://assets.st-note.com/img/1718159899378-eAkkgNF4Te.png)
SPIの前にSDIOに挑戦したが、自滅した。
FATFSを追加。
![](https://assets.st-note.com/img/1718157185452-TF6twskvs1.png)
![画像2](https://assets.st-note.com/production/uploads/images/41772489/picture_pc_98b729a9f0973a689ed2f798250ca46e.png)
SPIを追加。
通信速度は、10Mを超えるとダメになることが多いらしいです。
![](https://assets.st-note.com/img/1718157215057-Mi4txTePsq.png)
![](https://assets.st-note.com/img/1718157240629-4v5pRD8Kjp.png)
SPI通信のSS(CS)用のピンを割り当てた。
(GPIOならなんでもいいが、参考先ではPB0に割り当てている。)
![画像5](https://assets.st-note.com/production/uploads/images/41772550/picture_pc_fca64255e8b822fca9ab6dcda76da5ca.png)
ここからfatfs_sd.cとfatfs_sd.hを入手し、それぞれ自分のSrcとIncに入れて、リフレッシュする。
https://controllerstech.com/wp-content/uploads/2020/07/SDCARD_SPI_OLD_F103.zip
![画像6](https://assets.st-note.com/production/uploads/images/41772711/picture_pc_e281c7e0e176b110f7b3924628b49480.png)
以下3つのファイルを開いて、下記のコードを追加。
![画像18](https://assets.st-note.com/production/uploads/images/41913834/picture_pc_ede9e52826697b7b5d953eb4b93a9f9e.png)
#include "fatfs_sd.h"
![画像18](https://assets.st-note.com/production/uploads/images/41913929/picture_pc_0b83642486583e3bd074e99a1e1184fe.png)
return SD_disk_initialize(pdrv);
return SD_disk_status(pdrv);
![画像19](https://assets.st-note.com/production/uploads/images/41913977/picture_pc_bd3cc67ae36bd251b07e52bb842231fb.png)
return SD_disk_read(pdrv, buff, sector, count);
![画像19](https://assets.st-note.com/production/uploads/images/41914066/picture_pc_7c2db0438dd7f265dd6f057dbbbc3fff.png)
return SD_disk_write(pdrv, buff, sector, count);
return SD_disk_ioctl(pdrv, cmd, buff);
![画像17](https://assets.st-note.com/production/uploads/images/41914140/picture_pc_874909e8d963c6eda8a30619a17dcbdf.png)
#include "stm32f4xx_hal.h"
extern SPI_HandleTypeDef hspi1;
#define SD_CS_GPIO_Port GPIOB
#define SD_CS_Pin GPIO_PIN_0
![画像17](https://assets.st-note.com/production/uploads/images/41914220/picture_pc_3f3bc7586253753f5d2527a07171a040.png)
volatile uint8_t FatFsCnt = 0;
volatile uint8_t Timer1, Timer2;
void SDTimer_Handler(void)
{
if(Timer1 > 0)
Timer1--;
if(Timer2 > 0)
Timer2--;
}
![画像17](https://assets.st-note.com/production/uploads/images/41914290/picture_pc_bc4f287d6e47b1e5db52a15344c39442.png)
FatFsCnt++;
if(FatFsCnt >= 10)
{
FatFsCnt = 0;
SDTimer_Handler();
}
最後にmain.cを実装する。
![画像21](https://assets.st-note.com/production/uploads/images/41915574/picture_pc_dbed0add612acc08e05b7d8f2333395e.png)
#include "fatfs_sd.h"
#include "stdio.h"
#include "string.h"
![画像17](https://assets.st-note.com/production/uploads/images/41914455/picture_pc_03cd1afe27e8a29ec13279d0e580b889.png)
FATFS fs;
FIL fil;
FRESULT fresult;
char buffer[1024];
char buffer2[1024];
UINT br, bw;
FATFS *pfs;
uint32_t fre_clust, tot_size, fre_size;
void send_uart(char *s)
{
HAL_UART_Transmit(&huart2, (uint8_t *) s, strlen(s), 2000);
}
![画像17](https://assets.st-note.com/production/uploads/images/41914567/picture_pc_88a47102275f9221d1c46038f13656ab.png?width=1200)
fresult = f_mount(&fs, "/", 1);
if(fresult == FR_OK){
send_uart("SD CARD mounted successfully!!!\n");
}else{
send_uart("ERROR!!! in mounting SD CARD...\n");
}
if(f_getfree("", &fre_clust, &pfs) == FR_OK){
tot_size = (pfs->n_fatent - 2) * pfs->csize * 0.5;
sprintf(buffer, "Total size: %15lu B\n", tot_size * 1024);
send_uart(buffer);
fre_size = fre_clust * pfs->csize * 0.5;
sprintf(buffer, "Free size: %15lu B\n", fre_size * 1024);
send_uart(buffer);
}
if(f_open(&fil, "file1.txt", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK){
strcpy(buffer, "ajwoeifjaponewpfniwenvpjoiwnheiwoapv\n");
f_write(&fil, buffer, strlen(buffer), &bw);
f_close(&fil);
}
if(f_open(&fil, "file1.txt", FA_READ) == FR_OK){
send_uart("file1 open.\n");
f_read(&fil, buffer2, f_size(&fil), &br);
send_uart(buffer2);
f_close(&fil);
}
自分はこれで動いた。
ファイルが書き込めているか否かは、パソコンで確認できる。
![画像19](https://assets.st-note.com/production/uploads/images/41914997/picture_pc_6e4faf76a3bbcfda4f1d423ee8925b96.png)
![画像20](https://assets.st-note.com/production/uploads/images/41915052/picture_pc_b971c689b5637d7c5ed58fe671da8bef.png)