STM32CubeMx 用 SD カードドライバー
1. SDカードの概要
SD メモリ カード (セキュア デジタル メモリ カード) は、半導体フラッシュ メモリをベースにした新世代の高速ストレージ デバイスです。SD メモリ カードの技術は MMC カード (マルチメディア カード) フォーマットから発展し、SDIO (SD 入力/出力) カードは互換性のある SD メモリ カードに基づいて開発され、この互換性には機械的、電子的、電気的、信号的、およびソフトウェアが含まれます。 SD カードおよび SDIO カードは、一般に SD メモリ カードと呼ばれます。
SD カードは、高いメモリ容量、高速なデータ転送速度、優れたモビリティの柔軟性、優れたセキュリティを備えており、デジタル カメラ、タブレット PC、マルチメディア プレーヤーなどのポータブル デバイスで広く使用されています。
SD カードは、SD モードと SPI モードの 2 つのバス モードをサポートします。このうちSDモードは6線式を採用し、CLK、CMD、DAT0~DAT3をデータ通信に使用します。SPI方式は4線式を採用しており、データ通信にはCS、CLK、DataIn、DataOutを使用します。
SD モードのデータ転送速度は SPI モードよりも高速です。STM32F103ZE は独自の SDIO インターフェイス ドライバを備えています。最大速度は 4 ビット モードで 24MHZ、8 ビット バス モードで 48MHZ に達します。この章ではその使用方法を紹介しますHAL ライブラリを使用して SD カードのドライブを完成させます。
2. SDIO の概要
SD/SDIO MMC カード ホスト モジュール (SDIO) は、AHB ペリフェラル バスとマルチメディア カード (MMC)、SD メモリ カード、SDIO カード、および CE-ATA 機器間の操作インターフェイスを提供します。
SDIO の主な機能は次のとおりです。
- マルチメディア カード システム仕様バージョン 4.2 と完全に互換性があります。1 ビット (デフォルト)、4 ビット、および 8 ビットの 3 つの異なるデータ バス モードがサポートされています。
- 以前のマルチメディア カード システム仕様バージョンと完全な互換性 (上位互換性) があります。
- 以前のマルチメディア カード システム仕様バージョンと完全な互換性 (上位互換性) があります。
- SDメモリーカード仕様バージョン2.0と完全互換。
- SD I/O カード仕様バージョン 2.0 と完全な互換性があり、1 ビット (デフォルト) および 4 ビットのさまざまなデータ バス モードをサポートします。
- CE-ATA 機能を完全サポート (CE-ATA デジタル プロトコル バージョン 1.1 と完全互換)。
- 8ビットバスモードで最大48MHzのデータ転送速度
2.1 SDIO バス トポロジ
バス上の通信はコマンドとデータの転送によって実現されます。
マルチメディア カード/SD/SD I/O バス上の基本的な操作はコマンド/レスポンス構造であり、このようなバス操作はコマンドまたはバス メカニズムの下で情報交換を実現します。さらに、一部の操作にはデータ トークンもあります。
SD/SDIO メモリ カードで送信されるデータはデータ ブロックの形式で送信され、MMC で送信されるデータはデータ ブロックまたはデータ ストリームの形式で送信され、CE-ATA デバイスで送信されるデータもデータ ブロックの形式で送信されます。データブロック送信の形式。
-
SDIO「応答なし」および「データなし」操作
-
SDIO(複数)データブロック読み取り動作
-
SDIO(複数)データブロック書き込み動作
注: Busy (ビジー) 信号がある場合、SDIO (SDIO_D0 が Low にプルされる) はデータを送信しません。 -
SDIO 連続読み取り動作
-
SDIO連続書き込み動作
2.2 SDIO 機能の説明
- SDIO は 2 つの部分で構成されます。
● SDIO アダプタ モジュール: クロック生成、コマンド、データ送信など、MMC/SD/SDIO カードのすべての関連機能を実現します。
● AHB バス インターフェイス: SDIO アダプタ モジュール内のレジスタを操作し、割り込み信号と DMA 要求信号を生成します。
-
SDIO ブロック図
がリセットされた後、デフォルトでは SDIO_D0 がデータ送信に使用されます。マスターは初期化後にデータ バスの幅を変更できます。
マルチメディア カードがバスに接続されている場合、SDIO_D0、SDIO_D[3:0]、または SDIO_D[7:0] をデータ転送に使用できます。MMC バージョン V3.31 以前のバージョンは 1 ビットのデータ ラインのみをサポートしているため、SDIO_D0 のみを使用できます。
SD または SDIO カードがバスに接続されている場合、ホストは SDIO_D0 または SDIO_D[3:0] を使用してデータ転送を設定できます。すべてのデータラインはプッシュプルモードで動作します。 -
SDIO_CMD には 2 つの動作モードがあります。
● 初期化のためのオープン回路モード (MMC バージョン V3.31 以前のみ)。
● コマンド送信用のプッシュプル モード (SD/SD I/O カードおよび MMC V4.2 も初期化中にプッシュプル ドライバを使用します)。
SDIO_CK はカードのクロックです。1 ビットのコマンドまたはデータがクロック サイクルごとにコマンド ラインとデータ ライン上で送信されます。マルチメディア カード V3.31 プロトコルの場合、クロック周波数は 0MHz から 20MHz まで変化します。マルチメディア カード V4.0/4.2 プロトコルの場合、クロック周波数は 0MHz から 48MHz まで変化します。SD または SDIO カードの場合、クロック周波数は 0MHz から 48MHz まで変化します。 0MHzから25MHzまで変化します。
- SDIO は 2 つのクロック信号を使用します。
● SDIO アダプタ クロック (SDIOCLK=HCLK)
● AHB バス クロック (HCLK/2)
ピン | 意味 | 説明する |
---|---|---|
SDIO_CK | 出力 | マルチメディアカード/SD/SDIOカードクロック。これはホストからカードへのクロック ラインです。 |
SDIO_CMD | 双方向 | マルチメディアカード/SD/SDIOカードコマンド。これは双方向のコマンド/レスポンス信号線です。 |
SDIO_D[0:7] | 双方向 | マルチメディアカード/SD/SDIOカードデータ。これらは双方向データ バスです。 |
2.3 SDIOアダプター
SDIO アダプタは、マルチメディア/暗号化デジタル メモリ カード バスのマスター デバイス (ホスト) であり、マルチメディア カードまたは暗号化デジタル メモリ カードのグループを接続するために使用され、次の 5 つの部分で構成されます: ● アダプタ レジスタ モジュール ● コントロールユニット ● コマンド
チャネル
●
データ
チャネル
● データ FIFO
注: アダプタ レジスタと FIFO は AHB バス側のクロック (HCLK/2) を使用し、コントロール ユニット、コマンド チャネル、およびデータ チャネルは SDIO アダプタ側のクロック (SDIOCLK) を使用します。
SDIO の詳細については、STM32 中国語マニュアルを参照してください。
3. ハードウェアインターフェース
ピン | SDIO | SPI |
---|---|---|
SDIO_D2(PC10) | データライン | |
SDIO_D3(PC11) | データライン | SPI_CS チップセレクト |
SDIO_CMD(PD2) | 制御線 | SPI_MOSI マスター出力 |
SDIO_SCK(PC12) | 時計 | SPI_SCK クロック ライン |
SDIO_D0(PC8) | データライン | SPI_MISO マスター入力 |
SDIO_D1(PC9) | データライン |
4 ソフトウェアの設定
1. チップの選択
2. クロック構成
3. SDIO 構成
5 コード生成
1. SD 初期化
関連の設定については、STM32 中国語リファレンス マニュアル_V1.0 セクション 20.9.2 クロック制御レジスタ SDIO_CLKCR を参照してください。
void MX_SDIO_SD_Init(void)
{
/* USER CODE BEGIN SDIO_Init 0 */
/* USER CODE END SDIO_Init 0 */
/* USER CODE BEGIN SDIO_Init 1 */
/* USER CODE END SDIO_Init 1 */
hsd.Instance = SDIO;
hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;//在主时钟SDIOCLK的上升沿产生SDIO_CK
hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;//盘路时钟失能
hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;//始终输出SDIO_CK
hsd.Init.BusWide = SDIO_BUS_WIDE_1B;//总线宽度
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;//关闭硬件流控制
//当SD/SDIO卡或多媒体卡在识别模式, SDIO_CK的频率必须低于400kHz。
hsd.Init.ClockDiv = 6;//时钟分频系数,SDIO_CK=HCLK/(ClockDiv+2)
if (HAL_SD_Init(&hsd) != HAL_OK)//SD初始化
{
Error_Handler();
}
if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)//配置总线宽度
{
Error_Handler();
}
/* USER CODE BEGIN SDIO_Init 2 */
hsd.Init.ClockDiv=0;//重新设置时钟速度
/* USER CODE END SDIO_Init 2 */
}
2. SD 読み取りおよび書き込みセクター機能
その後の FATFS ファイル システムの移植を容易にするために、ここでは SD カード書き込みセクターと読み取りセクターの 2 つの機能をカプセル化します。
void SD_WriteDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt)
{
HAL_SD_WriteBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡写块
while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成
}
void SD_ReadDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt)
{
HAL_SD_ReadBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡读块
while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成
}
3. メイン関数は
、HAL ライブラリ、GPIO ポート、LCD 画面 (FSMC ドライバー)、SD カードの初期化を初期化し、カードのタイプとカード容量を取得し、最後に SD カードの読み取りおよび書き込みセクター関数を呼び出してデータの読み取りおよび書き込みを実現します。テスト。
uint8_t buf_tx[4096]="SD卡SDIO驱动HAL库配置测试数据STM32F103ZET6 -- Ver1.0";
uint8_t buf_rx[4096];
MX_GPIO_Init();
MX_FSMC_Init();
MX_SDIO_SD_Init();
MX_USART1_UART_Init();
MX_SPI2_Init();
/* USER CODE BEGIN 2 */
char buff[200];
NT35310_Init();//LCD初始化
LCD_Display_Str(LCD_WIDTH/2-strlen("SD卡初始化")/2*8,20,16,(u8 *)"SD卡初始化",BLACK);
if(hsd.State!=HAL_SD_STATE_READY)
{
LCD_Display_Str(20,40,16,(u8 *)"SD Init ERR",RED);
}
else
{
LCD_Display_Str(20,40,16,(u8 *)"SD Init OK",RED);
LCD_Display_Str(20,60,16,(u8 *)"卡类型:",RED);
if(hsd.SdCard.CardType==CARD_SDHC_SDXC)//2.0告诉卡
{
LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDHC",RED);
}
else if(hsd.SdCard.CardType==CARD_SDSC)//2.0普通卡
{
LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDSC",RED);
}
snprintf(buff,sizeof(buff),"块大小: %d byte\n",hsd.SdCard.BlockSize);
LCD_Display_Str(20,80,16,(u8 *)buff,RED);
snprintf(buff,sizeof(buff),"卡容量大小: %.2f GB\n",(hsd.SdCard.BlockNbr>>11)/1024.0);
LCD_Display_Str(20,100,16,(u8 *)buff,RED);
}
LCD_Display_Str(LCD_WIDTH/2-strlen("SD数据读写测试")/2*8,130,16,(u8 *)"SD数据读写测试",BLACK);
SD_WriteDisk(buf_tx,100,2);
LCD_Display_Str(20,150,16,(u8 *)"SD写数据: OK",RED);
SD_ReadDisk(buf_rx,100,3);
LCD_Display_Str(20,170,16,(u8 *)"SD读数据: OK",RED);
LCD_Display_Str(20,190,16,(u8 *)"数据内容:",RED);
LCD_Display_Str(20,210,16,(u8 *)buf_rx,BLUE);
4.ランニング効果
6. 参考例
HAL ライブラリ ドライバー SD カードの例: https://download.csdn.net/download/weixin_44453694/85022733
FATFS ファイル システムの移植: https://blog.csdn.net/weixin_44453694/article/details/118116943