Nucleo-F446REとNucleo-G431KBで4lioライブラリを使ってみました。4iloライブラリはI2C版のみの対応です。SPI版のSSD1306 OLEDを使用するには派生ライブラリのafiskonライブラリafiskon/stm32-ssd1306を使います。(次回予定)
以下の記事を参考にさせていただきました。
「4ilo」さん(本家) https://github.com/4ilo/ssd1306-stm32HAL
「可燃ごみ」さん「STM32 I2C接続OLEDディスプレイを使う」
使用したSTM32CubeIDEのバージョン: 1.10.1
なお、久しぶりにSTM32CubeIDEを立ち上げると延々とUpdateがかかるので事前に一度起動してUpdateを完了させると良いと思います。ST-LinkのファームウェアのアップデートもあるのでLチカなども走らせましょう。
Nucleo-F446RE
Board SelecotorでNuckeo-F446REを指定してDefult Modeで初期化。
MXの設定
STM32CubeIDEでは「Device Configuration Tool」と呼ばれるもので、「.ioc」ファイルを開くとIDE内で起動します。STM32CubeMXと機能的にはほぼ同等なので、このBlogではMXと呼んでいます。STM32CubeMXを別途立ち上げる必要はありません。
Pinout & Configuration
Connectivity
I2C1
Mode
I2C: I2C
Configuration
Parameter Settings
Master Features
I2C Speed Mode: Standard Mode
GPIO Settings
PB8 I2C1_SCL
PB9 I2C1_SDA
Parameter Settingsはデフォルトのまま、Standard Mode (100kHz)でOKです。Fast Mode(400kHz)でも動作します。
GPIO Settingsは右側のPinout図で設定すると左下のConfigurationペインに反映されます。ピン割当はArduinoヘッダのD14(PB8)、D15(PB9)に変更しました。
ハードウェアの準備
ブレッドボード配線図
SSD1306 | F446RE | Arduino Header |
---|---|---|
GND | GND | GND |
VDD | 3V3 | 3V3 |
SCK | PB8 | D15 |
SDA | PB9 | D14 |
ライブラリの準備
4ilo/ssd1306-stm32HALからZIPファイルをダウンロード(右上の「Code」-「Download ZIP」をクリック)して展開しておきます。
- ssd1306.h
- fonts.h
を「<Projectフォルダ>\Core\Inc\」に
- ssd1306.c
- fonts.c
を「<Projectフォルダ>\Core\Src\」にコピーします。IDEのProject ExplorerでProjectフォルダを右クリックし「Refresh」します。
ソースコード
MXでコード生成して、Core\Src\main.cに以下のコードを追加します。
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ssd1306.h" #include "fonts.h" /* USER CODE END Includes */ <略> /* USER CODE BEGIN 2 */ // Init lcd using one of the stm32HAL i2c typedefs ssd1306_Init(&hi2c1); // Write data to local screenbuffer ssd1306_SetCursor(0, 36); ssd1306_WriteString("4ilo", Font_11x18, White); // Copy all data from local screenbuffer to the screen ssd1306_UpdateScreen(&hi2c1); /* USER CODE END 2 */
実行している様子
I2C信号波形
外部Pullupなし Fast Mode(400kHz)
C1:SDA C2:SCL
I2CのSCLとSDAは、SSD1306モジュール上でPullupされているので、外部Pullupしなくても動作します。
外部Pullup 10kΩ Fast Mode(400kHz)
C1:SDA C2:SCL
外部Pullupすると信号波形がきれいになります。
外部Pullup 2.2kΩ Fast Mode(400kHz)
C1:SDA C2:SCL
外部Pullupの抵抗値を小さくしても400kHzクロックではあまり変わりませんね。
Nucleo-G431KB
Board SelecotorでNuckeo-G431KBを指定して「Defult Mode」で初期化。
MXの設定
Pinout & Configuration
Connectivity
I2C1
Mode
I2C: I2C
Configuration
Parameter Settings
I2C Speed Mode: Standard Mode
GPIO Settings
PA15: I2C1_SCL
PB7: I2C1_SDA
I2C Speed ModeはまずStandard Modeで動作確認し、Fast Mode、Fast Plus Modeに変更して動作確認しました。
ハードウェアの準備
ブレッドボード配線図
SSD1306 | G431KB | Arduino Header |
---|---|---|
GND | GND | GND |
VDD | 3V3 | 3V3 |
SCK | PA15 | D4 |
SDA | PB9 | D5 |
ライブラリの準備
Nucleo-F446REと同様にファイルをコピーします。
Core/Inc/fonts.h
Core/Inc/ssd1306.h
Core/Src/fonts.c
Core/Src/fonts.h
重要: STMG431KBを使うので、Core/Inc/ssd1306.hを以下のように変更します。
//#include "stm32f4xx_hal.h"
#include "stm32g4xx_hal.h"
main.cへのソースコードの追加はNucleo-F446REの場合と同じです。
実行している様子
I2C Speed Mode
10kΩの外部Pullupした場合、Standard Mode、Fast Modeでは動作しましたが、Fast Mode Plusでは動作しませんでした。外部Pullupを2.2kΩに変更するとFast Mode Plusでも動作しました。
Standard Mode(100kHz) 外部Pullup 10kΩ
C1:SDA C2:SCL
Fast Mode(400kHz) 外部Pullup 10kΩ
C1:SDA C2:SCL
Fast Mode Plus(1000kHz) 外部Pullup 10kΩ
C1:SDA C2:SCL
9bit目でACKされておらず(HIGHに引っ張りきれていない)、以降のI2C通信が失敗しています。
Fast Mode Plus(1000kHz) 外部Pullup 2.2kΩ
C1:SDA C2:SCL
Pullup抵抗の抵抗値を小さくすると、ACKが認識されて正常に通信が行われています。
注)オシロ波形の下に周波数を表示させていますが、C1:SDAの値です。クロック周波数を知るためにはC2:SCLの値を表示させるべきでした。クロック周波数はC2(青色)の波形数と目盛りから概算できます。
0 件のコメント:
コメントを投稿