【M5Stack_Core2】Serial I/F周り

シリアル入出力を自由に使えないとdebugがはかどらないので少し調べた。

f:id:chiyoh:20201011102625p:plain

なぜか回路検証をしていた。

f:id:chiyoh:20201011102859p:plain

test_serial.ino

//
// Serial 周り確認 
//
// 2020/10/11 chiyo.h
//
#include <M5Core2.h>
#include <utility/Sprite.h>
#include <stdio.h>
#include <touch.h>
#define ESP32
TFT_eSprite spr = TFT_eSprite(&M5.Lcd);

int gpio0 = 0;
void setup() {
  M5.begin();   // 外部I2C off
  Serial.printf("\n");
  Serial.flush();
  delay(50);
  yield();
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.clear(WHITE);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.printf("Serial Test!");
  
  // スプライト定義
  spr.setColorDepth(8);       // カラーモード
  spr.createSprite(320, 240); // 大きさ
  spr.fillSprite(TFT_WHITE);

  // Serial動作抑制
  Serial.end();
  // WDT無効
  disableCore0WDT();
  disableCore1WDT();

  pinMode(gpio0, INPUT);   // 入力モード
  delay(50);
  yield();
}

void loop() {
  int val = digitalRead(gpio0);
  spr.drawNumber(val, 0, 0, 4);
  spr.pushSprite(0,0);  // グラフ
  spr.fillSprite(TFT_WHITE);
  //Serial.println("");
  delay(200);
  yield();
}

GPIO0は、I2Sスピーカーにもつながっている。 ちょっと調べた感じでは、モノ出力スピーカに対してCTRL信号で、ICのON/OFF及びI2Sの出力R/L切り替えを行う。つまり、ステレオにしたい場合は、このモジュールを2つ用意する。 CTRLを3値制御だがデジタル出力なので右/OFFの2制御になっている。LRCKは、サンプリング周波数及びH/LでR/Lのデータを切り替えを制御。BCLKは、搬送クロック。SADTAはPCMデータ。つまり、スピーカを使っているときにはGPIO0には、サンプリング周波数でMPU側から周波数信号が出ている。

Serial通信に、PC側からデータ溢れチェックのRTSをGPIO0でCTS信号として使えるがそれ用に使っている感じではなさそう。

実際に回路を動かして確認してみる 昔の定番ターミナルにTeraTermというソフトがある。組み込みエンジニアにはおなじみなのかもしれない。昔懐かしいVT100コマンドも対応しているのでArduino IDEモニターではできないような高性能なことがCOMポートに対して可能。WiFi使ってTCP/IP接続の場合もこの端末は使える。で、ここではこいつのマクロを使用してDTS/RTS制御を行う。

f:id:chiyoh:20201011104726p:plain

serial_check.ttl

;
; Serial I/F周り確認
;
; ==============================================
; (0) リセットボタン押す
; ==============================================
;
; ==============================================
; (1)  まずは、状態確認
; ==============================================
getmodemstatus val
sprintf2 str '%d(%x) , result:%d' val val result
messagebox str "(1) Modem status"
;
; GPIO0 = 1
;
; M5側     端末側
; RTS(NC)->CTS(Low)
; DTR(NC)->DSR(Low)
;
;bit
;1  CTS( 送信可)信号がオンです。
;2  DSR( データセットレディ)信号がオンです。
;4  呼び出し信号がオンです。
;8  RLSD( 受信線信号検出)信号がオンです。
;
;  値が0ということは、M5側がRTS off DTR offということ
;

;
; ==============================================
; (2) READY PC端末の正常状態(フロー在りのとき)
; ==============================================
; DTR on(端末ON) RTS on(送信要求)
setdtr 1
setrts 1
messagebox "DTR1 RTS1" "(2) (II)"
;
; GPIO0 = 1
; 
; 特に変化しない
;


;
; ==============================================
; (3) STOP 送信STOP要求 RTS off
; ==============================================
; 
;setdtr 1
setrts 0
messagebox "DTR1 RTS0" "(3) (IV)"
;
; GPIO0 = 0
;
; GPIO0が0に変化
;

;
; ==============================================
; (4) 端末OFF DTR off RTS off
; ==============================================
; ※端末OFFなのにRTS on(送信リクエスト)にはならないので
; 
setdtr 0
setrts 0
messagebox "DTR0 RTS0" "(4) (I)"
;
; GPIO0 = 1
;
; GPIO0が1に変化
;


;
; ==============================================
; (5) RESET DTR off RTS on
; ==============================================
; ※異常状態
; 
setdtr 0
setrts 1
messagebox "DTR0 RTS1" "(5) (III)"
;
; GPIO0 = 1
;
; 回路的には、RESETボタンが押されている状態
; リセットになっているのは、MPUに対してだけなので
; 液晶や周辺回路は変化しない。MPUも立ち上がりedgeで
; リセット動作になるのでここでは変化ない
;


;
; ==============================================
; (6) リセット動作1 DTR off RTS on→off
; ==============================================
;
setrts 0
messagebox "DTR0 RTS0" "(6) (III->I)"
;
; GPIO0 = 1
;


;
; ==============================================
; (7) リセット動作2 DTR off RTS on→off
; ==============================================
;
setdtr 1
setrts 1
setdtr 0
messagebox "DTR0 RTS1" "(7) (II->III)"
setdtr 1
messagebox "DTR1 RTS1" "(7) (III->II)"
;
; リセット動作
;


;
; ==============================================
; (8) リセット動作3 download boot
; ==============================================
; (GIO0=0状態でリセット)
setdtr 1
setrts 1
setdtr 0
messagebox "DTR0 RTS1" "(8) (II->III)"
setdtr 1
setrts 0
messagebox "DTR1 RTS1" "(8) (III->II->IV)"
;
;
; download リセット動作
;


; ==============================================
; (9) リセットリセットボタンを押す
; ==============================================

log.txt

; ==============================================
; (0) リセットボタン押す
; ==============================================


ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
M5Core2 initializing...axp: vbus limit off
axp: gpio1 init
axp: gpio2 init
axp: rtc battery charging enabled
axp: esp32 power voltage was set to 3.35v
axp: lcd backlight voltage was set to 2.80v
axp: lcd logic and sdcard voltage preset to 3.3v
axp: vibrator voltage preset to 2v
OK

; ==============================================
; (6) リセット動作1 DTR off RTS on→off
; ==============================================

ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
M5Core2 initializing...axp: vbus limit off
axp: gpio1 init
axp: gpio2 init
axp: rtc battery charging enabled
axp: esp32 power voltage was set to 3.35v
axp: lcd backlight voltage was set to 2.80v
axp: lcd logic and sdcard voltage preset to 3.3v
axp: vibrator voltage preset to 2v
OK

; ==============================================
; (7) リセット動作2 DTR off RTS on→off
; ==============================================

ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
M5Core2 initializing...axp: vbus limit off
axp: gpio1 init
axp: gpio2 init
axp: rtc battery charging enabled
axp: esp32 power voltage was set to 3.35v
axp: lcd backlight voltage was set to 2.80v
axp: lcd logic and sdcard voltage preset to 3.3v
axp: vibrator voltage preset to 2v
OK


; ==============================================
; (8) リセット動作3 download boot
; ==============================================


ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x7 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

この確認と少し調べてわかったこと

  • M5がUSB接続されていてフリーズした場合、PC端末からリブートが行える。
  • シリアル回りの回路構成は、ESP32のプログラマ(マイコンにプログラムをUPLOADするための仕組み)なのでほとんど共通
  • USBケーブルを抜き差しするときにrebootがかかるのはRTOSのWDTかこの回路が原因