BluePill > I2CインターフェイスのLCDを接続する

BluePillにI2Cインターフェイスを持ったLCDを接続して動作確認をします。
BluePillの情報はこのページを参考にします。

配線するときに便利なのでピンアサインの図をプリントアウトして使います

BluePillの回路図は以下の通りです。

このBluePillに接続しようとするLCDは以下のものです。
ACM1602NI-FLW-FBW-M01 キャラクタLCDでインターフェイスがI2C,秋月電子で購入可能です。

次にCubeMXを起動してプロジェクトを作成します。
CPUはSTM32F103C8 を選択

RCCで外部オシレータを有効にし、SYS部分でDebugにSerial Wireを選択。

ピンのアサインは以下の通りです。

基板上のLED PC13を出力に設定します。Blue Pill ではここまでの設定はどのプロジェクトでもすることにしています。

I2C1を有効にするとPB6,PB7がI2Cに割り当てられます

APB1,APB2のクロックを確認すると8MHzになっているのがわかります

I2C1の通信速度はデフォルトで100kHzになっているのでこのままにしておきます。

ソースは以下の通りです。

#defineでLCDのアドレスを定義しておきます。
秋月電子の取説にはLCDのアドレスは0xA0となっていましたがこのアドレスでは動作せず0x50が動作するアドレスでした。アドレスがあっていないとLCDの1行目が黒くなり何も表示されません。

初期化関数とデータ書き込み関数、コマンド書き込み関数を定義して実行するとLCDにキャラクタが表示されるようになりました。

注意しなければいけないのがHAL_I2C_Master_Transmitのアドレス指定です。
HAL_I2C_Master_Transmit(&hi2c1,ACM1602ADDR<<1,txBuf,2,100);
のように引数のアドレスの値を左シフトをして与えることです。

I2Cのアドレスが取説通りではないこととHAL_I2C_Master_Transmitのアドレス指定で、無駄な時間を費やしましたがACM1602にキャラクタを表示することができました。

またネットの情報ではI2Cのクロックは遅くしないと動作しないとのテスト結果もありましたがこちらのLCDでは100kHzでも動作することが確認できました。