STM32マイコン35(HAL_I2C関数について)
1.本日の内容
(1) HAL_I2Cに関連する関数の使い方について理解する。
使用マイコン:
・目次
- STM32マイコン35(HAL_I2C関数について)
- 1.本日の内容
- 2.内容
- (1) HAL_I2C_Master_Transmit関数とは
- (2) HAL_I2C_Master_Transmit関数の使い方
- (3) HAL_I2C_Master_Reveive関数とは
- (4) HAL_I2C_Master_Reveive関数の使い方
- (5) HAL_I2C_Master_Transmit_IT関数とは
- (6) HAL_I2C_Master_Transmit_IT関数の使い方
- (7) HAL_I2C_Master_Reveive_IT関数とは
- (8) HAL_I2C_Master_Reveive_IT関数の使い方
- (9) HAL_I2C_Master_Seq_Transmit_IT関数とは
- (10) HAL_I2C_Master_Seq_Transmit_IT関数の使い方
- (11) HAL_I2C_Master_Seq_Reveive_IT関数とは
- (12) HAL_I2C_Master_Seq_Reveive_IT関数の使い方
- (13) HAL_I2C_Mem_Write関数とは
- (14) HAL_I2C_Mem_Write関数の使い方
- (15) HAL_I2C_Mem_Read関数とは
- (16) HAL_I2C_Mem_Read関数の使い方
- (17) CubeMXの設定
- 3.関連記事
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);
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関数とは
(4) HAL_I2C_Master_Reveive関数の使い方
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t 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関数とは
(6) HAL_I2C_Master_Transmit_IT関数の使い方
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, 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ライブラリで用意されている。
(8) HAL_I2C_Master_Reveive_IT関数の使い方
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t 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ライブラリで用意されている。
(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);
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ライブラリで用意されている。
(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);
使用例:
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);
使用例:
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);
使用例:
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を選択し、新しいプロジェクトを作成する。
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.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary