今回はMbedを使ってI2Cによる通信を行ってみます。
HALを使ったI2Cの記事を こちら に書きましたが今回はMbedを利用した場合について書きました。
投稿時の開発環境を記しておきます。
PC:Windows10 OS
IDE: STM32CubeIDE Version1.3.0
Board: STM32Nucleo-F401RE
I2C通信の概要
・フィリップス(現NXP)セミコンダクターズが開発した通信方式
・SCLとSDAの2本の通信ラインを使って双方向で通信が可能
・通信速度は100k, 1Mbits/secなどいくつか選択肢がある
・マスタとスレーブが存在し、マルチマスタでの構築も可能
I2Cの詳しい仕様については こちら を見て頂ければと思います。
スレーブとなるターゲット
STM32(をマスタ)で制御し、スレーブのデバイスは以下のものを使ってみました。
価格は600円でネットを使って購入しました。
メーカーはSTマイクロです。デバイスのデータシートは こちら です。
SCL, SDAラインにプルアップ抵抗をつけるための半田づけジャンパー2箇所を半田づけしておきます。
接続
下表のとおりに接続します。
このモジュールは I2C か SPI のどちらで接続するのか5番ピンでインターフェースを選択することができます。
今回はI2Cで接続するので5番ピンを H (3.3V) につなぎます。
4番ピンはデバイスアドレスの最下位ビットです。これで同じデバイスを2つつなぐことができるわけですが、今回は1つなので L (GND) につないでおきます。
割り込みは使わないのでINT端子は接続していません。
Mbed OS2のプロジェクトファイル
Mbed OS2 が使えるプロジェクトをダウンロードできるようにしました。
詳しくは STM32 Mbed OS2 が使える STM32CubeIDEプロジェクト の記事をご覧ください。
プロジェクトファイルをダウンロードすることで、Mbedを使うための環境構築は不要になります。
使用するプロジェクト
Mbedを使うためには以下の記事の手順でプロジェクトを構築する必要があります。
・STM32CubeIDEでMbedを動かしてみる その1
・STM32CubeIDEでMbedを動かしてみる その2
・STM32CubeIDEでMbedする Ticker編
コーディングしてみる
MbedのI2Cの使い方は こちら のサイトを参考にしました。
タイマーが初期化されている必要があるので maini()関数の中の SystemClock_Config()の後にコードを書きます。
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
#define WHO_AM_I 0x0f
#define CTRL_REG1 0x20
#define WAKE_UP 0x90
#define P_ADRS 0x28
int err;
char buf[16];
uint32_t press;
I2C i2c(I2C_SDA, I2C_SCL);
buf[0] = WHO_AM_I; // Who am I ?
i2c.write(0xb8, (const char*)buf, 1);
i2c.read(0xb9, buf, 1);
if (0xbd == buf[0])
{
err = 0;
}
else
{
err = 1;
}
buf[0] = CTRL_REG1; // Control Register1
buf[1] = WAKE_UP;
i2c.write(0xb8, (const char*)buf, 2);
buf[0] = P_ADRS | 0x80;
i2c.write(0xb8, (const char*)buf, 1);
i2c.read(0xb9, buf, 3);
press = buf[2] << 16 | buf[1] << 8 | buf[0];
press /= 4096;
コードの解説
Mbedを使うとコンストラクタ内で初期設定を行ってくれるので手間がかからず楽チンです。
WHO_AM_I というレジスタの値を読んで、 0xbdであればデバイスを認識できているとのことです。
コントロールレジスタ1に WAKE_UP(0x90) を書いてパワーダウンモードを解除します。
気圧の計測値は 0x28 (P_ADRS), 0x29, 0x2a のレジスタから読み込みます。
P_ADRS | 0x80 とすることでアドレスをオートインクリメントして次々と読むことができます。
読んだ値を 4096 で割ることで単位 [hPa]の気圧を得ることができます。
気圧は 1014[hPa]でした。
コメントを書く