UARTの不思議なRXパルスがOS X Arduino Dueに接続する

Arduino IDE 1.6.8、Arduino Due、Mac OS 10.11.3

複数のクライアントライブラリ(Python、JavaScript、IDEの内蔵シリアルモニタ)を使用してシリアルポートに接続すると、RXラインに8つの不思議なパルスが表示されています。 Logic Pro 16で1MS/sでサンプリングされた、約78-79us。

Mystery pulses

これらの8つのパルスは、57600ボーで解釈されるとFirmataファームウェアを詰まらせます。そして、彼らはすべての接続で起こります。

これは、Arduino 1.6.8 IDEの新規インストールと複数のスケッチを使用しています(通常の「Blink」スケッチでこれも再現されます)。

私のマシンでReproの手順:

  1. スケッチをインストールする
  2. ロジックアナライザを起動します。
  3. シリアルモニタに移動します。私は57600ボーのために私の鉱山を設定しました、改行行の終了、しかしそれは重要ではありません
  4. 必要に応じて、手順3を終了して繰り返します。
  5. シリアルポートに接続するたびにパルスを記録します

これを診断するための提案はありますか?それは何らかの方法でシリアルドライバレベルのように聞こえる。

14
追加された 編集された
ビュー: 3
どこから来ているかにかかわらず、実行しているファームウェアに重大なバグがあることを示すことで恩恵を受けたと考えてください。これは回復不可能な状態にすることはできません。これはプログラムのロジックのバグですか、あるいはUARTの処理コードがエラーフラグを適切に処理していませんか?
追加された 著者 rossp,
ソースを追跡するという点で、別のシリアルクライアントプログラム、別のコンピュータ/オペレーティングシステム、別のUSBシリアルデバイスなどを試すと便利です。
追加された 著者 rossp,
あなたはLinux上で57600で0xF0と解釈される単一パルスを得ます
追加された 著者 Majenko,
また、切断すると1つが表示されます。接続ボーレートはパルスの長さには影響しません。私の疑惑は、ATMega16U2のファームウェア(またはそれがどんなバージョンであれ、どんなチップでも)を実行しているということです。
追加された 著者 Majenko,
入力をありがとう、クリス。 Firmataファームウェアが0xF0の START_SYSEX を見たときそれは0xF7を見るまでバイトを処理し、タイムアウトのための準備はありません。だから私は起こっていると思うのは、これらのパルスが0xF0(私のデコードからこれを見ることができます)を生成することです。私はFirmataのためにできる最善のことは、最長の正当なデータパケットに十分な長さのある間隔の後にタイムアウトするようにパッチを提出することだと思います。
追加された 著者 user19292,
他のシリアルプログラムを試してみると、Firmataプロトコルとやりとりして、同じ動作を示すさまざまな基本的なシリアル実装(Python、JavaScript、Arduino IDEシリアルモニター)を使用する複数のライブラリがあります。私の次の計画は、Linuxマシンでこれを試して、同じ動作が見えるかどうかを確認することです。これは、これがOS X固有のものかどうかを孤立させるでしょう。
追加された 著者 user19292,
シリアルモニタを起動すると、arduinoモジュールがリセットされます。もしarduinoモジュールにブートローダがあれば、これはSTK500プロトコルのシグナルだと思います。
追加された 著者 Aleksandar Ivanisevic,
あなたのArduinoはUSBから電源を奪っていますか?
追加された 著者 U. Laxmeshwar,

1 答え

ショート:

ATMEGA16U2ファームウェア( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c )エミュレートされたUSBの設定を変更したり変更したりするとシリアルポートでは、USARTがリセットされます。これはArduinoシリアルモニタを開いても発生します(シリアル速度などを設定する必要があります)。これはあなたのスパイクを引き起こします。

長いです:

関数を見てください:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

ここでいくつかの行の後に、レジスタをゼロにすることによってUSARTをリセットすることがわかります:

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
    UCSR1B = 0;
    UCSR1A = 0;
    UCSR1C = 0;

現在のATMEGA16U2データシートの168ページで、UCSR1Bのビット3(TXEN1)を設定することにより、トランスミッタをイネーブルにし、通常のポート動作を無効にする(出力される)ことがわかります。データシートを引用する:

このビットを1に書き込むと、USARTトランスミッタがイネーブルされます。トランスミッタ   TxDnピンがイネーブルされている場合、通常のポート動作を無効にします。ザ   トランスミッタのディスエーブル(TXENnのゼロへの書き込み)は行われません   進行中および保留中の送信が完了するまで、すなわち、   送信シフトレジスタと送信バッファレジスタが   送信されるデータを含む。無効にすると、Transmitterはno   TxDnポートをオーバーライドしてください。

したがって、 UCSR1B = 0; を書くことで、入力として機能するTXD1ピンをオーバーライドすることはなくなりました。

ATMEGA16U2 TXDは、ATSAM3X8EのRXラインに接続されています。通常の動作では、UARTを有効にすると、データが送信されていなければそのラインはハイのままです。 UARTをディセーブルすると、その特定のラインはドライバが1になります。初期化コードはそのピンのプルアップを設定していないため、ピンはフローティング入力になり、 GND、またはプローブの入力インピーダンス(ピンとGNDの間)でさえも、ロジックレベルはゆっくりと0になります。

これを無効にするには、次のいずれかを行う必要があります。 1)ATMEGA16U2ファームウェアを、そのPINをOUTPUTとして値1で設定して変更します。 2)ATMEGA16U2ファームウェアを変更するには、そのピンのプルアップを有効にします。 3)(推奨)ATSAM3X8EのRXラインのプルアップを有効にします。

1
追加された