STM32資料 応用編 1
STM32でI2C通信をやってみよう
なるべく簡単な説明でセンサーとの通信ができるようにしていきます!
I2C通信とは
センサーなどと通信するときによく使う!
配線も少なく、(比較的)簡単に実装できるのでおすすめ
いくつか特徴があるので、3つだけ紹介してみる
I2C通信の特徴
- 通信速度がそこそこ早い
- データとクロック用に2本の線を使う
- 複数のセンサーなどを同じ配線で扱える
I2C通信をするために
I2C通信の細かい説明をすると、結構難しくなってしまうので
ここでは、プログラムを書く上な要素を4つ紹介しておきます
I2C通信で使う4要素
- データを送る相手(I2Cアドレス)
- データの送信場所 (レジスタアドレス)
- 送信/受信するデータ (データ)
- データの長さ(データ長)
STM32でI2C通信をする方法
ピン設定について
SCL(クロック)とSDA(データ)用の2つのピンを設定しよう
設定項目が色々出てくるけど、基本はそのままで大丈夫!
プログラムについて
センサーとの通信で使う関数はこの2つになる
HAL_I2C_Mem_Read(&hi2c2, I2C_ADDR, REGISTER, 1, &receive_data, 1, 10);
この関数の引数について
- &hi2c2 ・・・使うi2cのピン
- I2C_ADDR・・・I2Cアドレス
- REGISTER・・・レジスタアドレス
- ○○○_data・・・送信/受信するデータ(ポインタ)
細かいお話
- 一番最後の'10'という引数について
これは、最大時間を設定している。通常は一瞬で通信が成功するが、上手くいかなかったときこの数字の秒数(単位はms)で諦めるように設定できる。
- REGISTERと&send_dataの後の'1'という引数について
これは、隣り合う複数のレジスタに一度に書き込むときに使う。例えば、0x10から0x12までの3つのレジスタに書き込みたいときは、send_data[3]のように3つの要素を持つ配列とセットでこのように書くことができる。
HAL_I2C_Mem_Write(&hi2c2, I2C_ADDR, 0x10, 1, send_data, 3, 10);
センサーの値などはxyzのデータが近いレジスタにあることがほとんどなので、知っておくと便利かも。
サンプルコード
それっぽいセンサーの値を用意をしてみました。実際の値は、センサーのデータシートなどに記載があるのでそちらを見てね。
名前 | 値 |
---|---|
使うピン | i2c2 |
I2Cアドレス | 0x68 |
REGISTER | 0x01 |
送信データ | 0x15 |
コードの中身としては、あらかじめ決めたレジスタに値を書き込んでその値が保存されているかを実際に読み取ってチェックするものです。
uint8_t I2C_ADDR = 0x68 << 1;
uint8_t TEST_REGISTER = 0x01;
uint8_t send_data = 0x15;
uint8_t receive_data = 0;
//値の書き込み
HAL_I2C_Mem_Write(&hi2c2, I2C_ADDR, TEST_REGISTER, 1, &send_data, 1, 10);
//値の読み取り
HAL_I2C_Mem_Read(&hi2c2, I2C_ADDR, TEST_REGISTER, 1,&receive_data, 1, 10);
//データの判定
if(send_data == receive_data){
//成功した時の処理
}
終わりに
今回はセンサーとの通信で使うI2C通信について説明しました
次回は、実際のセンサーから値を取ってみます!