質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Groovy

Groovyは、Java用のオブジェクト指向型プログラミング言語です。PythonやRuby、Perl、そしてSmalltalkに似た特徴を有する動的な言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

159閲覧

SC16IS740を利用したI2C-UART変換にてGuru Meditation Errorが発生する_M5Stack

mameta0509

総合スコア1

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Groovy

Groovyは、Java用のオブジェクト指向型プログラミング言語です。PythonやRuby、Perl、そしてSmalltalkに似た特徴を有する動的な言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2024/10/30 02:35

編集2024/10/30 02:37

リンク内容### 実現したいこと
SC16IS740(下記URL品使用)を利用してM5StackのI2C通信をUARTに変換したい。
https://www.switch-science.com/products/6027?srsltid=AfmBOoqi6esHTYGGv8DLsaRvQOSXAdy1zjxImWNRi6tWWsvTaWixrvEt」

使用したライブラリは下記のもので一部修正しております。(下記補足にて記載)
https://github.com/SandboxElectronics/UART_Bridge

発生している問題・分からないこと

現状、M5StackBasicとI2C-UART変換基板間での通信自体は成功しているようですが、read();コマンド実行時、Guru Meditation Errorが発生し、M5Stackが再起動される。

エラーメッセージ

error

111:05:52.456 -> device found 211:05:52.456 -> start serial communication 311:05:52.503 -> Sending 0x55 411:05:52.503 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. 511:05:52.503 -> Memory dump at 0x400d1cec: 00fffd25 5c004136 ad7b0c5c 611:05:52.503 -> Core 1 register dump: 711:05:52.503 -> PC : 0x400d1cf2 PS : 0x00060a30 A0 : 0x800d1559 A1 : 0x3ffb2240 811:05:52.503 -> A2 : 0x3ffc1c80 A3 : 0x02003455 A4 : 0x00000016 A5 : 0x00000000 911:05:52.503 -> A6 : 0x00000001 A7 : 0x00000078 A8 : 0x800d1cef A9 : 0x3ffb2220 1011:05:52.503 -> A10 : 0x3ffc1c80 A11 : 0x00000055 A12 : 0x00000020 A13 : 0x00000000 1111:05:52.535 -> A14 : 0x0000001d A15 : 0x00000001 SAR : 0x0000001c EXCCAUSE: 0x00000000 1211:05:52.535 -> EXCVADDR: 0x00000000 LBEG : 0x40086224 LEND : 0x4008623a LCOUNT : 0xffffffff 1311:05:52.535 -> 1411:05:52.535 -> 1511:05:52.535 -> Backtrace: 0x400d1cef:0x3ffb2240 0x400d1556:0x3ffb2260 0x400d3e86:0x3ffb2290

該当のソースコード

#include <Wire.h> #include <SC16IS750.h> #include <SPI.h> SC16IS750 i2cuart = SC16IS750(SC16IS750_PROTOCOL_I2C, SC16IS750_ADDRESS_BB); void setup() { Serial.begin(115200); Wire.begin(21, 22); Serial.println("I2C initialized"); i2cuart.begin(9600); Serial.println("SC16IS750 initialized"); if (i2cuart.ping() != 1) { Serial.println("device not found"); while (1); } else { Serial.println("device found"); } Serial.println("start serial communication"); // FIFOの初期化 i2cuart.initializeFIFO(); delay(10); Serial.println("Sending 0x55"); i2cuart.write(0x55); delay(10); // 送信後の待機時間 while (i2cuart.available() == 0); if (i2cuart.read() != 0x55) { Serial.println("serial communication error for 0x55"); while (1); } else { Serial.println("0x55 received successfully"); } delay(200); Serial.println("Sending 0xAA"); i2cuart.write(0xAA); delay(10); while (i2cuart.available() == 0); if (i2cuart.read() != 0xAA) { Serial.println("serial communication error for 0xAA"); while (1); } else { Serial.println("0xAA received successfully"); } delay(200); } void loop() {}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

元々、通信自体出来ず.hファイルにて下記記述を追加したところ通信自体は出来るようになったが、今回のエラーが発生した。
#ifdef AVR
#define WIRE Wire
#elif ESP32  ←追加
#define WIRE Wire ←追加
#else // Arduino Due
#define WIRE Wire1
#endif

補足

M5STAck ⇒変換基板(I2C入力) UART出口にてTX,RXをジャンパにてショートさせております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2024/10/30 12:51

> while (i2cuart.available() == 0); とか > while (1); を > while (i2cuart.available() == 0) delay(1); > while (1) delay(1); とでもしたら導師はは寝なくなったりしないかしら、と思いますけれど、そもそもそのwhile()に引っかかるのはなんででしょうね。 それぞれの段階で生のレジスタ値を取得して考えていく、とかいうことになりそうに思います。
mameta0509

2024/10/31 00:23

コメントありがとうございます。上記コメントの件を試しましたがまだ解決できていません。 エラーメッセージから追っていくと「i2cuart.write(0x55);」が実行できず再起動している雰囲気を感じます。そうなってくると.cppファイル内のエラーとなるのでしょうか?
mameta0509

2024/10/31 04:15

.cppファイルに下記文を追加し、直接書き込みを行った所成功しました。void SC16IS750::directWriteToRegister(uint8_t reg_addr, uint8_t val) { WriteRegister(reg_addr, val); } しかしながらこれでなぜうまくいったのか、本来のwriteとどう違うのかよくわかりません。(chatGPT頼みだったため・・・)また、この記述に変更し、本番のソフトに組み込んだ際何か問題がありそうな気もしています。
thkana

2024/11/03 07:08

https://github.com/SandboxElectronics/UART_Bridge のライブラリに、 SC16IS750::initializeFIFO() あるいは SC16IS750::directWriteToRegister(uint8_t reg_addr, uint8_t val) が無いような気がするのですが、私の勘違いでしょうか?
mameta0509

2024/11/06 04:07

連絡遅くなり申し訳ありません。 initializeFIFO()はライブラリにはなく、後から試しながら追加した物になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問