簡易データ送受信チップ仕様
by K.I
Index
簡易的なデータ送受信を行なうプロトコルを定義して、
送受信用のチップをプログラムした。
- 特徴
- 内蔵CR発振(約4MHz)によりクロック入力は不要で、外付け部品が少ない。
- 電源電圧範囲3.0〜5.5V
- 待機時の消費電流が少ない。(多分)
- ピン数が少ないので、4bitデータ送受信回路とした。
- NRZI変調によるデータ転送のため、データ極性は考えなくて良い。
- 簡易的な自動ボーレート調整。
[top]
MicroChip社の 12C509Aを使用した。このチップの特徴として
- 8pin DIPパッケージで、非常に小型。
- 内蔵のCR発振回路を持ち、約4MHzのクロックを生成可能。
- SLEEPモードで消費電流の少ない待機状態にして、入力ピン(3bit分のみ)の電圧変化によるWake-up起動が可能。
- 電源電圧範囲3.0〜5.5V
- CALL可能な範囲は0〜FF1、GOTO可能範囲は0〜1FF、CALL用スタックは2段だけなのでプログラムは注意が必要。
- 初期設定が終了するとスリープモードに入る。
- 送信イネーブルをH状態にすると、Wake-upしてデータを1回だけ送信する。
- 最初にidle信号、続けてstart信号を送信する。
- 4bitデータを4B/5B変換して、5bitとしてからNRZI変調で送信する。
- 最後にend信号を送信する。
- 送信イネーブルが約1秒以上H状態の場合、繰り返し送信モードになる。
- 送信動作の終了、或いは繰り返し送信モードで送信イネーブルがH状態になった場合は、またスリープ状態に入る。
- ボーレートは約1200bps(CR発振のため、不正確)
CR発振でボーレートを正確に合わせることが出来ないため、受信部では最初に転送速度の調整を行なってから受信動作に入るようにした。
- 電源投入、或はRxDに信号が入ることによるWake-upで、起動してボーレート調整に入る。RxDに信号が無ければ、スリープする。
- 最初のIdle信号を利用して、ボーレートの調整を行なう。RxEは受信したデータを認識した場合にそのまま出力する2。
- START信号(11000)の連続した信号0を3回受信した時点で、受信動作を開始する。
- 5bitのNRZI信号を受け、5B/4B変換して4bitデータとして受信する。
- 制御信号以外の受信データ(4bit)をOUT0〜3に出力し、END信号が入るまで繰り返す。
- END信号を受けると3、 約0.75秒後4にOUT0〜3とRxEをL状態に戻し、スリープ状態に入る。
1ページ切替えすれば範囲外も可能ではあるが、かなり面倒になる。
2あまり意味はないが、デバッグ用として。
3それ以外のコードを受けると即座にスリープ状態に入る。
4送信回路が連続モードに入るのが約1秒なので、その前に受信待機状態に入る必要があるため。
[top]
以下のような各5bitのデータを順に送信する。
- idle信号(11111)→ 受信部はこれでボーレート調整を行なう
- Start信号(11000)→ データ送信を開始を示す(3bitの無変化状態を検出する)
- Data信号 → 4bitデータを4B/5B変換して5bitコードとして送信する
- End信号(01101)→ データ送信の終了を示す
以下に、送信データの例(データ'A'を送信)を示す。
- 最後がHで終わる場合には、1ボーレートクロック後にLに落とす5。
NRZIでのクロック挿入とコントロール用の信号を付加するために、4bit信号を5bitコードに拡張してから、データ送信する。
data(4bit) | code (5bit) | Interpretation |
0000 | 11110 | data 0 |
0001 | 01001 | data 1 |
0010 | 10100 | data 2 |
0011 | 10101 | data 3 |
0100 | 01010 | data 4 |
0101 | 01011 | data 5 |
0110 | 01110 | data 6 |
0111 | 01111 | data 7 |
1000 | 10010 | data 8 |
1001 | 10011 | data 9 |
1010 | 10110 | data A |
1011 | 10111 | data B |
1100 | 11010 | data C |
1101 | 11011 | data D |
1110 | 11100 | data E |
1111 | 11101 | data F |
| | |
---- | 11111 | idle |
---- | 11000 | start |
---- | 01101 | end |
---- | 00100 | error |
データの変化が、データ1を表すデータ変調方式。
- データの極性を考慮する必要が無い。
- マンチェスタ符号等に比べて、転送速度を速くできる。
- 反面、全て0となるデータの場合にデータ変化が無いために同期出来なくなるので、
変化点を挿入する工夫が必要となる。例えば、
- 送信部では0が6回続いたら1を追加し、受信部では0が6回続いたら1を削除する
- 4B/5B変換等の符合化、或いはスクランブルや圧縮を行なってからデータを送信する。
5NRZIなので、どちらでも良いのだが、なんとなく。
[top]
- MICROCHIP社純正のMPLABのアセンブラを使用。
- 標準で、トレース可能なデバッガが附属しているので、開発し易い。但し、Wake-UP等はシュミレート出来ない。
[top]
この送受信チップを使った回路例を以下に示す。
[top]
- CR発振のため、連続動作時にはボーレートのズレ6が発生して、受信エラーになる可能性がある。
- 雑音等によるデータエラーの発生への対応は、ほとんどしていない。
- 立ち上がり、立ち下がりの判定は、2us間隔で3回チェックする。
- エラー発生時は、スリープに入るだけ。
6但し、これは送信受信のクロック周波数がかなり変動した場合である。クロックとデータとのズレはデータ'1'の時に同期されるので、そんなに大きくならない。
[top]
- [TX020320] 送信用チップ試作
- 問題点:/TxEを1秒以上'L'にすると連続送信モードだが、データ部だけでなくidleからデータまでを繰り返してしまう。
- [TX020322] 送信用チップ改訂
- 上記の問題点を改良。あと送信データを最後にLに戻すようにした。
- [RX020515A] 受信用チップ試作
- 直接接続では動作するが、変調回路を介すると、かなり不安定な動作になる。
- [RX020520] 受信用チップ改訂
- コード表の誤りで0A→8となっていた。本来は4→0A→4、8→12→8なので、テーブルを0A→4に訂正した。
- 雑音の影響を考えて、データの立上がり、立下がり判定を2回から3回に変更。→ほとんど改善されない。
- [RX020521] 受信チップ改訂
- クロック検出の時点で、RXEのデータ中心付近にヒゲがある→本来はこの時点では中心検出は出来ないはず。暴走している?
- 5B/4B変換時にデータ範囲をチェックするようにした。→動かなくなった?
- [RX020523] 受信チップ改訂
- コード以外の不正データ(雑音等による)で暴走する危険があったので、不正コードはスリープするように変換テーブルを書き換えた。
- 受信クロックのカウンタRX_Nの範囲を100〜130から100〜150に広げた。(実質上130付近らしい。全く動作しなくなる場合の主原因だったようだ)
- 今回の改訂で、かなり安定して動作するようになった。
- [RX020527] 受信チップ改訂
- RXE出力で5bitのWord境界に約10usのHパルス、或いはLに落ちる現象は、 データ確定後に10usのHパルスを出すコード7が原因だったので、そのコードを削除してRXEを保持するようにした。
- 変換テーブルの書き換えで、RX020520の改訂が元に戻ってしまったので修正。
7最初RXEはそういう仕様で作り始め、その後RXデータをそのまま出力する仕様に変えたのだが、以前のコードが残っていた。
[top]
[電子工作関連に戻る]