STM32CubeMx 用 SD カードドライバー

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

おすすめ

転載: blog.csdn.net/weixin_44453694/article/details/123680102#comments_26523438