Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン35(HAL_I2Cの関数について)

STM32マイコン35(HAL_I2C関数について)

1.本日の内容

 (1) HAL_I2Cに関連する関数の使い方について理解する。

 

  使用マイコン

 

・目次

 

2.内容

(1) HAL_I2C_Master_Transmit関数とは

 ・通常のI2C通信のデータを送信する為の関数。

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 

(2) HAL_I2C_Master_Transmit関数の使い方
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
 引数について:
  ・I2C_HandleTypeDef *hi2c :I2Cバスのハンドルを指定
  ・uint16_t DevAddress   :通信先のスレーブのアドレスを指定(7ビット)   
     ※通常、スレーブデバイスのアドレスをここに指定。
      8ビットアドレスの最上位ビットは読み書きを示すビットで、
      この関数内で自動的に設定されます。
  ・uint8_t *pData       :送信するデータのポインタを指定。
  ・uint16_t Size          :送信するデータのサイズをバイト単位で指定
  ・uint32_t Timeout      :タイムアウト時間をミリ秒単位で指定  
 送信例:
 uint8_t data_to_send[2] = {0x12, 0x34}; // 送信するデータ
 HAL_I2C_Master_Transmit(&hi2c1,slaveAddress<<1,data_to_send,2,HAL_MAX_DELAY);

 ※slaveAddressは、通常7ビットで、R/W指定をするために、

  スレーブアドレスを1ビット左にずらし、0を入れる。

 参考:STM32マイコン25(LCD:ACM1602のI2C制御方法) - Project_OKI’s diary

 

 

※詳細は、ユーザーマニュアルを参照

 →UM1725 | STM32, STM8ファミリはSTの32bit/8bit汎用マイクロコントローラ製品

 

(3) HAL_I2C_Master_Reveive関数とは

 ・通常の外部のデバイスからI2C通信のデータを受信する為の関数。

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 
(4) HAL_I2C_Master_Reveive関数の使い方
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
 ・hi2c: I2Cハンドル構造体へのポインタ。
  これは、I2Cインターフェースを管理するために使用されます。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・pData: 受信したデータを格納するためのバッファへのポインタ。
 ・Size: 受信するデータのバイト数。
 ・Timeout: 通信のタイムアウト時間(ミリ秒)。
 使用例:
 uint8_t received_data[2]; // 受信したデータを格納するバッファ
 HAL_I2C_Master_Receive(&hi2c1,(slaveAddress<<1)|1,received_data,2, HAL_MAX_DELAY);

 ※slaveAddressは、通常7ビットで、R/W指定をするために、

  スレーブアドレスを1ビット左にずらし、1を入れる。

  (8ビットの場合は、いらない)

 
(5) HAL_I2C_Master_Transmit_IT関数とは
 ・STM32マイコン向けに提供されるHALライブラリで用意されている。
 ・I2C通信を使用してマスターデバイスからスレーブデバイスに対して非同期のデータ受信を行うためのもの。
 ・関数呼び出し後に送信が完了するまで待機せず、送信がバックグラウンドで行われる。
 ・送信完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
(6) HAL_I2C_Master_Transmit_IT関数の使い方
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
 ・I2C_HandleTypeDef *hi2c :I2Cバスのハンドルを指定
 ・uint16_t DevAddress   :通信先のスレーブのアドレスを指定 
 ・uint8_t *pData       :送信するデータのポインタを指定。
 ・uint16_t Size          :送信するデータのサイズをバイト単位で指定
 
 使用例:
 uint8_t sendData[2]; // 送信するデータのバッファ
 sendData[0] = 0xAA;
 sendData[1] = 0xBB;
 
 HAL_I2C_Master_Transmit_IT(&hi2c1, slaveAddress<<1,sendData,sizeof(sendData));
 
 
(7) HAL_I2C_Master_Reveive_IT関数とは

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 ・I2C通信を使用してマスターデバイスからスレーブデバイスに対して非同期のデータ受信を行うためのもの。
 ・非同期モードでデータ受信を行う。
 ・関数呼び出し後に受信が完了するまで待機せず、受信がバックグラウンドで行われる。
 ・受信完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
(8) HAL_I2C_Master_Reveive_IT関数の使い方
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
 ・hi2c: I2Cハンドル構造体へのポインタ。
  これは、I2Cインターフェースを管理するために使用されます。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・pData: 受信したデータを格納するためのバッファへのポインタ。
 ・Size: 受信するデータのバイト数。

 

 使用例:

 uint8_t receiveData[2]; // 受信データを格納するバッファ
 HAL_I2C_Master_Receive_IT(&hi2c1, (slaveAddress<<1)|1, receiveData, sizeof(receiveData));

 

 

(9) HAL_I2C_Master_Seq_Transmit_IT関数とは

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 ・I2C通信を使用してマスターデバイスからスレーブデバイスに対してシーケンシャルな非同期のデータ送信を行うためのもの。
 ※シーケンシャル送信とは、複数のデータバイトを連続して送信する操作のこと。
  ・関数呼び出し後に送信が完了するまで待機せず、送信がバックグラウンドで行われる。
 ・送信完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
(10) HAL_I2C_Master_Seq_Transmit_IT関数の使い方
HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Request, uint8_t *pData, uint16_t Size);
 ・hi2c: I2Cハンドル構造体へのポインタ。
  これは、I2Cインターフェースを管理するために使用されます。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・pData: 受信したデータを格納するためのバッファへのポインタ。
 ・Size: 受信するデータのバイト数。
 
 使用例:
 uint8_t sendData[2]; // 送信するデータのバッファ
 sendData[0] = 0xAA;
 sendData[1] = 0xBB;
 
 HAL_I2C_Master_Seq_Transmit_IT(&hi2c1, slaveAddress<<1,I2C_FIRST_FRAME, sendData, sizeof(sendData));
 
 
(11) HAL_I2C_Master_Seq_Reveive_IT関数とは

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 ・I2C通信を使用してマスターデバイスからスレーブデバイスに対してシーケンシャルな非同期のデータ送信を行うためのもの。
 ※シーケンシャル送信とは、複数のデータバイトを連続して送信する操作のこと。
  ・関数呼び出し後に受信が完了するまで待機せず、受信がバックグラウンドで行われる。
 ・受信完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
(12) HAL_I2C_Master_Seq_Reveive_IT関数の使い方
HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Request, uint8_t *pData, uint16_t Size);
 ・hi2c: I2Cハンドル構造体へのポインタ。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・Request: 通信の種類を示すフラグや要求を指定するパラメータ。
      一般的には0を指定することで、通常の受信操作を行う。
 ・pData:受信データを格納するバッファへのポインタ。
      受信したデータはこのバッファに格納される。
 ・Size: 受信するデータのバイト数。

 

 使用例:

 uint8_t receiveData[2]; // 受信データを格納するバッファ
 
 HAL_I2C_Master_Seq_Receive_IT(&hi2c1,(slaveAddress<<1)|1, I2C_FIRST_FRAME, receiveData, sizeof(receiveData));

 

 

(13) HAL_I2C_Mem_Write関数とは

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 ・指定されたメモリアドレスに対してデータを書き込むための非同期関数。

 ・I2C通信を使用して特定のメモリアドレスにデータを書き込むために使用する。

 ・デバイスに対してデータを書き込むことができる。
 ・関数呼び出し後に書き込みが完了するまで待機せず、書き込みがバックグラウンドで行われる。
 ・書き込み完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
 
(14) HAL_I2C_Mem_Write関数の使い方
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
 ・hi2c: I2Cハンドル構造体へのポインタ。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・MemAddress:書き込むメモリアドレス。
 ・MemAddSize:メモリアドレスのサイズ(バイト単位)。
         通常、1又は2バイトのアドレスが使用される。
 ・pData:書き込むデータが格納されたバッファへのポインタ。
 ・Size: 受信するデータのバイト数。
 ・Timeout: 通信のタイムアウト時間(ミリ秒)

 

 使用例:

 uint8_t sendData[2]; // 書き込むデータを格納するバッファ
 sendData[0] = 0xAA;
 sendData[1] = 0xBB;
 
 HAL_I2C_Mem_Write(&hi2c1, slaveAddress<<1, memAddress, I2C_MEMADD_SIZE_8BIT, sendData, sizeof(sendData), HAL_MAX_DELAY);

この例では、

・I2Cハンドル hi2c1 を使用

・slaveAddress のスレーブデバイスに通信

・memAddress で指定されたメモリアドレスに

・sendData バッファ内のデータを書き込み。

 

これは例えば、温度センサ(MLX90614ESF-DCH)など、メモリアドレスを指定して使用するI2Cデバイスを使用する際に、この関数を使用する。

 

 

(15) HAL_I2C_Mem_Read関数とは

 ・STM32マイコン向けに提供されるHALライブラリで用意されている。

 ・指定されたメモリアドレスのデータを読み取るための非同期関数。

 ・I2C通信を使用して特定のメモリアドレスのデータを読み込むために使用する。

 ・関数呼び出し後に読み取りが完了するまで待機せず、読み取りがバックグラウンドで行われる。
 ・読み取り完了時に割り込みが発生し、コールバック関数が呼び出されることがある。
 
(16) HAL_I2C_Mem_Read関数の使い方
HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
 ・hi2c: I2Cハンドル構造体へのポインタ。
 ・DevAddress: 通信相手のI2Cデバイスのアドレス。
 ・MemAddress:読み取るメモリアドレス。
 ・MemAddSize:メモリアドレスのサイズ(バイト単位)。
         通常、1又は2バイトのアドレスが使用される。
 ・pData:読み取ったデータを格納するバッファへのポインタ。
 ・Size: 読み取るデータのバイト数。
 ・Timeout: 通信のタイムアウト時間(ミリ秒)

 

 使用例:

uint8_t receiveData[2]; // 読み取ったデータを格納するバッファ
 
HAL_I2C_Mem_Read(&hi2c1, (slaveAddress<<1)|1, memAddress, I2C_MEMADD_SIZE_8BIT, receiveData, sizeof(receiveData), HAL_MAX_DELAY);

 

(17) CubeMXの設定

 ・File→New ProjectでSTM32F401を選択し、新しいプロジェクトを作成する。

  (a) Pin設定画面の下記ピンを設定する。

    ・PB9をI2C1_SDA   (LCD制御用 I2C_SDA)

    ・PB8をI2C1_SCL          (LCD制御用 I2C_SCL)

 

  (b) それぞれのピンの名前を右クリック、Enter User Labelで

    画像の名前に変更する。(変更しなくてもよい。)

 

 

  (b) ConnectivityのI2C1を選択し、LCDの仕様に合わせて、下記設定を行う。

Mater Feature
  I2C Speed Mode Standard Mode
  I2C Clock Speed 100000
Slave Features
      Clock No Stretch Mode Disable
 Primary Address Length selection 7-bit
 Dual Address Acknowledged Disable
 Primary slave address 0
 Generala Call address detection Disabled

 

   下記に簡単に、それぞれの設定の意味を示す。

設定項目 説明
Master Features I2C通信のマスター側の設定項目
I2C Speed Mode

I2Cのスピードモード設定。

標準モード、Fastモードが選択可能

※今回はそこまで速度が必要ないので標準。

I2C Clock Speed

I2Cのクロック速度設定。Hz単位で設定可能

※データシートより100kHzに設定

Slave Features I2C通信のスレーブ側の設定項目
Clock No Stretch Mode スレーブデバイスによるクロックのストレッチを禁止するか選択。
Primary Address Length selection

プライマリアドレスのビット数を7ビット

または10ビットで設定可能。

Dual Address Acknowledged スレーブデバイスが2つのアドレスを認識するかどうか選択可能。
Primary slave address スレーブデバイスのプライマリアドレスを設定可能。
General Call address detection ジェネラルコールアドレスの受信を有効にするか選択可能。

※仕様上、LCDのI2Cクロックスピードは100kHzまで可能。

線の長さなどによっては、そのスピードだと通信できない可能性がある。

その場合は、70kHzなどクロックスピードを落とすと通信出来るようになる。

 

 

 

  (c)NVICを設定 (割り込みを使用する場合)

 

  (d) 割り込みの優先順位を下げる。

 

  (e) プロジェクト名を付け、Toolchain/IEDをTrueSTUDIOに設定

 
 

3.関連記事

関連記事一覧:
 
組み込みC言語
 
STM32のデータシートなど: