概要
前回ピンの方法を取得しましたが、I2Cなどが設定されているかがわかりませんでした。今回もうすこし深いところのレジスタを取得して、どんな用途で利用されているのかも表示できるようにしてみました。
ESP32のGPIOの仕組み
GPIOは0から39までの40個あり、34から39までは入力専用になります。また、24と28から31までは利用することができないようです。
さて、この40個のGPIOですがADCが利用可能なRTC経由のGPIOと、それ以外のGPIOに分かれています。RTC経由だとULP(Ultra Low Power)からもアクセス可能な利点などがありますが、今回は深く触れません。
通常のGPIOとして利用する場合には、このまま直結で問題ないのですがUARTなどをハードウエア制御をする場合には、特殊な回路に接続する必要があります。このための機能がプリフェラルや、GPIOマトリクスと呼ばれています。
UARTの場合には送信のTXと、受信のRXがあります。送信の場合にはCPUからUARTの送信専用回路にデータが送られ、ハードウエア処理をしてその結果を実際のGPIOに接続し、送信します。
同じように受信のRXの場合GPIOで受信し、UARTの受信専用回路に信号が送られ、ハードウエア処理をした結果をCPUが受け取ります。この専用回路とGPIOを紐付けるのがGPIOマトリクスになります。存在はなんとなく知っていましたが、ライブラリを利用していると自動的に設定されるため、意識せずに使うことができます。
受信時の処理(INPUT)
受信時は0から255までの受信用専用回路に対して、どのGPIOを設定するかを指定します。
FUNC SIG_IN_SEL FUNC_IN_INV_SEL FUNC_IN_SEL NOTE 1 1 0 17 SPIQ 2 1 0 8 SPID 14 1 0 3 U0RXD/TXD 17 1 0 0 U1RXD/TXD 29 1 0 33 I2CEXT0_SCL 30 1 0 32 I2CEXT0_SDA 95 1 0 22 I2CEXT1_SCL 96 1 0 21 I2CEXT1_SDA
上記のような関係になり、FUNCで回路を指定してSIG_IN_SELが有効フラグです。ここでは有効なファンクションしか表示していません。FUNC_IN_INV_SELが信号を反転するかで、FUNC_IN_INV_SELが指定するGPIOになります。
NOTEはファンクションの説明で、私が仮に入れたものになります。
送信時の処理(OUTPUT)
0から39のGPIOに対して、そのままCPUに接続するのか、出力用専用回路に接続するのかを設定するレジスタが存在しています。
GPIO FUNC_OEN_INV_SEL FUNC_OEN_SEL FUNC_OUT_INV_SEL FUNC_OUT_SEL NOTE 1 0 0 0 14 U0RXD/TXD 6 0 0 0 0 SPICLK 8 0 0 0 2 SPID 16 0 0 0 5 SPICS0 17 0 0 0 1 SPIQ 21 0 0 0 96 I2CEXT1_SDA 22 0 0 0 95 I2CEXT1_SCL 26 0 0 0 17 U1RXD/TXD 32 0 0 0 30 I2CEXT0_SDA 33 0 0 0 29 I2CEXT0_SCL
上記のような構造になり、GPIO別にファンクションを指定する形です。
関数化しました
#include "M5StickC.h"
#include "ESP32LiteDebugGPIO.h"
void setup() {
M5.begin();
delay(1000);
dispGpio();
}
void loop() {
}
ライブラリマネージャーより、ESP32LitePackを入れてもらうと、スケッチ例にESP32LiteDebugGPIOがあります。この例ではM5StickCですが、素のESP32でも利用することができます。
GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE ----------------------------------------------------------------------------- 0 HIGH INPUT PULLUP I/O 1 LOW OUTPUT I/O [O]U0TXD_OUT_IDX 2 LOW INPUT PULLDOWN I/O 3 HIGH INPUT I/O [I]U0RXD_IN_IDX 4 LOW INPUT PULLDOWN I/O 5 HIGH OUTPUT I/O 6 LOW OUTPUT PULLUP I/O [O]SPICLK_OUT_IDX 7 HIGH INPUT PULLUP I/O 8 LOW OUTPUT PULLUP I/O [O]SPID_OUT_IDX 9 HIGH INPUT PULLUP I/O 10 HIGH INPUT PULLUP I/O 11 HIGH INPUT PULLUP I/O 12 LOW INPUT PULLDOWN I/O 13 LOW OUTPUT I/O [O]VSPICLK_OUT_IDX 14 HIGH INPUT PULLUP I/O 15 LOW OUTPUT I/O [O]VSPID_OUT_IDX 16 HIGH OUTPUT PULLUP I/O [O]SPICS0_OUT_IDX 17 HIGH OUTPUT PULLUP I/O [O]SPIQ_OUT_IDX 18 HIGH OUTPUT I/O 19 LOW INPUT I/O [I]VSPIQ_IN_IDX 20 LOW INPUT I/O 21 HIGH OUTPUT PULLUP OPEN_DRAIN I/O [O]I2CEXT1_SDA_OUT_IDX 22 HIGH OUTPUT PULLUP OPEN_DRAIN I/O [O]I2CEXT1_SCL_OUT_IDX 23 HIGH OUTPUT I/O 25 LOW INPUT I/O 26 LOW INPUT I/O 27 LOW INPUT I/O 32 LOW INPUT I/O 33 LOW INPUT I/O 34 LOW INPUT I 35 LOW INPUT I 36 LOW INPUT I 37 HIGH INPUT I 38 LOW INPUT I 39 HIGH INPUT I
結果は上記みたいな出力がされます。M5Liteライブラリで、シリアルモニタからGPIOを送信しても表示されるようになっています。実際の処理はESP32LiteDebugGPIO.hの中身を見てもらえればわかると思いますので、解説しません。レジスタからゴリゴリ情報を集めているだけになります。
データの見方ですが、左からGPIOと現在の信号レベル、INPUTかOUTPUTかのpinModeと、プルアップなどの設定値、I/O種別と割り当てられたファンクションになります。
UART0はSerialクラスなので、GPIO1がTX、GPIO3がRXに設定されているのがわかります。SPI系がフラッシュで、VSPI系がLCD周り、内部で利用しているI2Cが21と22に設定されていることなどがわかります。
ファンクションが設定されていないGPIOでも内部で利用されている場合があるので注意してください。例えばLCDで使われているSPIのCS信号はGPIO5なのですがOUTPUTにはなっていますがファンクションは指定されていません。CS信号は単純なので直結のGPIOとして利用されています。
ESP32のSerial.begin()のみ
GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE ----------------------------------------------------------------------------- 0 HIGH INPUT PULLUP I/O 1 LOW OUTPUT I/O [O]U0TXD_OUT_IDX 2 LOW INPUT PULLDOWN I/O 3 HIGH INPUT I/O [I]U0RXD_IN_IDX 4 LOW INPUT PULLDOWN I/O 5 HIGH INPUT PULLUP I/O 6 LOW OUTPUT PULLUP I/O [O]SPICLK_OUT_IDX 7 HIGH INPUT PULLUP I/O 8 LOW OUTPUT PULLUP I/O [O]SPID_OUT_IDX 9 HIGH INPUT PULLUP I/O 10 HIGH INPUT PULLUP I/O 11 HIGH INPUT PULLUP I/O 12 LOW INPUT PULLDOWN I/O 13 LOW INPUT PULLDOWN I/O 14 HIGH INPUT PULLUP I/O 15 HIGH INPUT PULLUP I/O 16 HIGH OUTPUT PULLUP I/O [O]SPICS0_OUT_IDX 17 HIGH OUTPUT PULLUP I/O [O]SPIQ_OUT_IDX 18 HIGH INPUT I/O 19 LOW INPUT I/O 20 LOW INPUT I/O 21 HIGH INPUT I/O 22 HIGH INPUT I/O 23 LOW INPUT I/O 25 LOW INPUT I/O 26 LOW INPUT I/O 27 LOW INPUT I/O 32 LOW INPUT I/O 33 LOW INPUT I/O 34 LOW INPUT I 35 LOW INPUT I 36 LOW INPUT I 37 LOW INPUT I 38 LOW INPUT I 39 LOW INPUT I
試しにいろいろ取得してみました。上記がプレーンな状態のESP32になります。UART0とフラッシュのSPIしか指定されていません。未指定の未使用でもプルアップされているGPIOなどがあるので注意して利用する必要があります。
M5Stack
GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE ----------------------------------------------------------------------------- 0 HIGH INPUT PULLUP I/O 1 LOW OUTPUT I/O [O]U0TXD_OUT_IDX 2 LOW INPUT PULLDOWN I/O 3 HIGH INPUT I/O [I]U0RXD_IN_IDX 4 HIGH OUTPUT I/O 5 HIGH INPUT PULLUP I/O 6 LOW INPUT PULLUP I/O 7 HIGH OUTPUT PULLUP I/O [O]SPIQ_OUT_IDX 8 LOW OUTPUT PULLUP I/O [O]SPID_OUT_IDX 9 HIGH OUTPUT PULLUP I/O [O]SPIHD_OUT_IDX 10 HIGH OUTPUT PULLUP I/O [O]SPIWP_OUT_IDX 11 HIGH OUTPUT PULLUP I/O [O]SPICS0_OUT_IDX 12 LOW INPUT PULLDOWN I/O 13 HIGH INPUT PULLDOWN I/O 14 HIGH OUTPUT I/O 15 HIGH INPUT PULLUP I/O 16 HIGH INPUT I/O 17 LOW INPUT I/O 18 LOW OUTPUT I/O [O]VSPICLK_OUT_IDX 19 HIGH INPUT I/O [I]VSPIQ_IN_IDX 20 LOW INPUT I/O 21 HIGH INPUT I/O 22 HIGH INPUT I/O 23 LOW OUTPUT I/O [O]VSPID_OUT_IDX 25 LOW INPUT I/O 26 LOW INPUT I/O 27 HIGH OUTPUT I/O 32 HIGH OUTPUT I/O [O]LEDC_HS_SIG_OUT7_IDX 33 HIGH OUTPUT I/O 34 LOW INPUT I 35 LOW INPUT I 36 LOW INPUT I 37 HIGH INPUT I 38 HIGH INPUT I 39 HIGH INPUT I
GPIO32がLEDCに設定されています。これはPWMのことですね。利用用途を調べるとLCDのバックライトになっています。
M5Stack Core2
GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE ----------------------------------------------------------------------------- 0 HIGH INPUT PULLUP I/O 1 LOW OUTPUT I/O [O]U0TXD_OUT_IDX 2 LOW INPUT PULLDOWN I/O 3 HIGH INPUT I/O [I]U0RXD_IN_IDX 4 HIGH OUTPUT I/O 5 HIGH OUTPUT I/O 6 LOW INPUT PULLUP I/O 7 HIGH OUTPUT PULLUP I/O [O]SPIQ_OUT_IDX 8 LOW OUTPUT PULLUP I/O [O]SPID_OUT_IDX 9 HIGH OUTPUT PULLUP I/O [O]SPIHD_OUT_IDX 10 HIGH OUTPUT PULLUP I/O [O]SPIWP_OUT_IDX 11 HIGH OUTPUT PULLUP I/O [O]SPICS0_OUT_IDX 12 LOW INPUT PULLDOWN I/O 13 LOW INPUT PULLDOWN I/O 14 HIGH INPUT PULLUP I/O 15 HIGH OUTPUT I/O 16 HIGH INPUT I/O 17 LOW INPUT I/O 18 LOW OUTPUT I/O [O]VSPICLK_OUT_IDX 19 LOW INPUT I/O 20 LOW INPUT I/O 21 HIGH OUTPUT PULLUP OPEN_DRAIN I/O [O]I2CEXT1_SDA_OUT_IDX 22 HIGH OUTPUT PULLUP OPEN_DRAIN I/O [O]I2CEXT1_SCL_OUT_IDX 23 LOW OUTPUT I/O [O]VSPID_OUT_IDX 25 LOW INPUT I/O 26 LOW INPUT I/O 27 LOW INPUT I/O 32 LOW INPUT I/O 33 LOW INPUT I/O 34 LOW INPUT I 35 LOW INPUT I 36 LOW INPUT I 37 LOW INPUT I 38 HIGH INPUT I [I]VSPIQ_IN_IDX 39 HIGH INPUT I
GPIOの使い方が変更されています。本当はこの資料の他に各GPIOがどこに接続されているのかの資料を合わせてみたほうが理解は早いと思います。
まとめ
ライブラリマネージャーからヘッダファイルをインクルドするだけで利用できるので、ぜひ試してみてください。レジスタからの読み出しだけなので、特別副作用はないはずです。
この資料と回路図を見直して、各M5シリーズのGPIO割当資料を完成させねば、、、




コメント