石黒/日誌/2013-07-02
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[石黒/日誌]]
*シリアル通信のモジュールを作ろう! [#sb524a8f]
-DE2-115
-NSLにて記述
-準備として以下の知識が必要
--RS232C
--UART
**シリアル通信って? [#dfc18edc]
1ビットの情報を1本の信号線上に逐次送信する通信の方式の総称。モールス信号もシリアル通信と言える。
パラレル通信は信号線が2本以上あるもの。直感的にはパラレルのほうが速そうに思えるが、実はパラレルだとクロックのずれやノイズ耐性などで高速化に限界がある。
**RS232Cって? [#l8dd8bfe]
Recommended Standard 232 version C
シリアル通信の規格のひとつ。25pinのコネクタを使うことになっているが、実際普及しているのは9pinのもの。さらに、最低3pin(送信のTXD, 受信のRXD, GND)あれば通信できる。
今回これを調べているのはH8マイコンとFPGAを接続するためなのだが、配線する際はRXDとTXDをクロスさせることに注意する。
***通信方式 [#c00b5c5a]
[Start bit]->[Data]->[Parity]->[Stop bit]
+[Start bit]信号がないとき、信号線には常にH(1のこと)が流れている。0を一度流すことでデータの始まりを合図する。
+[Data]下位ビットから送る。8bitかもしれないし7bit(ASCIIならこれで足りる)かもしれない。
+[Parity]パリティチェックを行う場合、Data中の1の合計が偶数なら1,奇数なら0を送る。しかし、もしエラーが分かっても修正できず、RS232Cではあまり用いる意味がないので通常はチェックしない。
+[Stop bit]1を流すことでデータの終わりを合図する。Stop bitの長さは設計者に依存する。
さて、2者間で通信をしなければならない場合、お互い同じ方式に統一しなければならない。パラメータは以下のようになる。
- Dataの長さ(8, 7)
- Parityの仕様(odd, even, none)
- Stop bitの長さ(1, 1.5, 2)
- Bit rate(通信速度)
今回はASCII文字の送受信が成功してから、この上に必要になるプロトコルを設計していく。
- http://www.nahitech.com/nahitafu/mame/mame5/rs232c.html
- http://www.fukufukudenshi.com/v2/RS-232C/
**UARTって? [#o16b5153]
Universal Asynchronous Receiver Transmitter
以下の機能を持つ回路のこと
- パラレル信号をシリアル信号に変換して送り出す
- 受け取ったシリアル信号をパラレル信号に変換する
これを今回は設計することになる。送信するビット列はRS232Cの方式に従う。
- http://www.ele-lab.com/tips_uart.html
- http://www.maroon.dti.ne.jp/koten-kairo/works/dsPIC/serial1.html
**仕様 [#ac75b2e2]
***通信方式 [#nb37fb30]
12Step本の初期設定に従う(といっても、実はKOZOSの実装では相手に合わせて設定が変更できるようになっている)。p46, 表1.2にパラメーターが記載されている。コード上ではp.67, リスト2.5である。
:Bit rate|9600bps
:Dataの長さ|8bit
:Stop bitの長さ|1bit
:Parityの仕様|none
:フロー制御|none (RTS, CTSのピンのこと。そもそも今回は3pinしか使えないのでOK)
***モジュールの構成 [#oe3587be]
- http://documentation.renesas.com/doc/products/mpumcu/rjj09b0165_h83069rf.pdf
これも12Step本の構成に従い、ちょうど鏡合わせになるように真似て作ってみる。
コントローラ1個に対して 1バイトのレジスタ * 8個 が存在する。レジスタの意味はp.65, 表2.3とp.66, 表2.4が参考になる。これはUSARTになっていて、設定する情報が少し多い。
レジスタ8byteの内訳
- SMR(1byte) | Clock select, Stop bit長, Parityの仕様(種類, 有効/無効), Data長, 同期モード |
- BRR(1byte) | Bit rate |
- SCR(1byte) | 送受信の有効/無効 |
- TDR(1byte) | Data(Transmitted) |
- SSR(1byte) | 送信完了/受信完了 |
- RDR(1byte) | Data(Received) |
SMR以外のレジスタの使い方については2ndステップのコードと、H8マイコンの仕様書を読むことで覚える。
***H8/3069Fの場合 [#ve5033e3]
|Bit|7|6|5|4|3|2|1|0|
|RDR(Receive Data Register)| | | | | | | | |
|TDR(Transmit Data Register)| | | | | | | | |
|SMR(Serial Mode Register)| C/A | CHR | PE | O/E | STOP | MP | CKS1 | CKS0 |
|SCR(Serial Control Register)| TIE | RIE | TE | RE | MPIE | TEIE | CKE1 | CKE0 |
|SSR(Serial Status Register)| TDRE | RDRF | ORER | FER/ERS | PER | TEND | MPB | MPBT |
|BRR(Bit Rate Register)| | | | | | | | |
-SMR説明
|| C/A | CHR(Character Length) | PE(Parity Enable) | O/E(Odd/Even) | STOP | MP(Multi Processor) | CKS1 | CKS0 |
|0|調歩同期式(こっちを使う)|Data長8bit|パリティビット無効|偶数パリティ|Stop bit 1|無効|クロックソースの選択, BRRも参照||
|1|クロック同期式|7bit|パリティビット付加|奇数パリティ|Stop bit 2|有効|||
-SCR説明
| | TIE (Transmit Interrupt Enable) | RIE (Receive Interrupt Enable) | TE (Transmit Enable) | RE (Receive Enable) | MPIE (Multi Processor IE) | TEIE (Transmit End IE) | CKE1 | CKE0 |
|0|TXI禁止|RXI禁止|送信禁止|受信禁止| |TEI禁止| | |
|1|TXI許可|RXI許可|送信許可|受信許可| |TEI許可| | |
今回は割り込みを考慮しないのであまりSCRは使わないかも?
-SSR説明(*はクリアしかできない, **は読み込みのみ)
||*TDRE (Transmit Data Register Enable) |*RDRF (Receive Data Register Full) | *ORER (Over Run ERror) | *FER (Framing ERror) | *PER (Parity ERror) | **TEND (Transmit END) | **MPB (Multi Processor Bit) | MPBT (MPB Transfer) |
|0|TDRに送信データがある|RDRに受信データが格納されていない|受信中または正常終了| 受信中または正常終了|受信中または正常終了|送信中| ||
|クリア条件|TDRE=1から読み込んだあと0をWriteしたとき|リセット時, RDRF=1の状態を読み込んだ後、0をWriteしたとき|リセット時, ORER=1の状態を読み込んだ後0をWriteしたとき|リセット時, FER=1の状態を読み込んだ後0をWriteしたとき|リセット時, PER=1の状態を読み込んだ後0をWriteしたとき|TEND=1の状態を読み込んだ後0をWriteしたとき| | |
|1|ない|格納されている|OverRunError|FramingError|ParityError|送信終了| | |
|セット条件|リセット時, SCRのTE==0, TDRからデータが転送されたあと|受信が正常終了したとき|RDRF==1のときに次の受信を完了|Stop bitが0だったとき|パリティチェックに失敗|リセット時, SCRのTE==0, 最後尾ビットの送信時にTDRE=1だったとき| | |
これらすべてを実装するのは無駄が多い。必要な部分だけを抜き出すことにする。
***オリジナルUARTコントローラ [#s47c6631]
**NSL記述 [#k3d13a61]
まずは0 1000001 1 (Start bit, ASCIIの'A', Stop bit)を断続的に送信するモジュールを作り、FPGAからパソコンへ送れるかテストしてみる。
それをNSLで記述し、rtl\DE2_115.nslでmemory-mapped I/Oとして登録してみる。
簡単なsnxc2のコードを書いて送ることが出来ればほぼ完成。
終了行:
[[石黒/日誌]]
*シリアル通信のモジュールを作ろう! [#sb524a8f]
-DE2-115
-NSLにて記述
-準備として以下の知識が必要
--RS232C
--UART
**シリアル通信って? [#dfc18edc]
1ビットの情報を1本の信号線上に逐次送信する通信の方式の総称。モールス信号もシリアル通信と言える。
パラレル通信は信号線が2本以上あるもの。直感的にはパラレルのほうが速そうに思えるが、実はパラレルだとクロックのずれやノイズ耐性などで高速化に限界がある。
**RS232Cって? [#l8dd8bfe]
Recommended Standard 232 version C
シリアル通信の規格のひとつ。25pinのコネクタを使うことになっているが、実際普及しているのは9pinのもの。さらに、最低3pin(送信のTXD, 受信のRXD, GND)あれば通信できる。
今回これを調べているのはH8マイコンとFPGAを接続するためなのだが、配線する際はRXDとTXDをクロスさせることに注意する。
***通信方式 [#c00b5c5a]
[Start bit]->[Data]->[Parity]->[Stop bit]
+[Start bit]信号がないとき、信号線には常にH(1のこと)が流れている。0を一度流すことでデータの始まりを合図する。
+[Data]下位ビットから送る。8bitかもしれないし7bit(ASCIIならこれで足りる)かもしれない。
+[Parity]パリティチェックを行う場合、Data中の1の合計が偶数なら1,奇数なら0を送る。しかし、もしエラーが分かっても修正できず、RS232Cではあまり用いる意味がないので通常はチェックしない。
+[Stop bit]1を流すことでデータの終わりを合図する。Stop bitの長さは設計者に依存する。
さて、2者間で通信をしなければならない場合、お互い同じ方式に統一しなければならない。パラメータは以下のようになる。
- Dataの長さ(8, 7)
- Parityの仕様(odd, even, none)
- Stop bitの長さ(1, 1.5, 2)
- Bit rate(通信速度)
今回はASCII文字の送受信が成功してから、この上に必要になるプロトコルを設計していく。
- http://www.nahitech.com/nahitafu/mame/mame5/rs232c.html
- http://www.fukufukudenshi.com/v2/RS-232C/
**UARTって? [#o16b5153]
Universal Asynchronous Receiver Transmitter
以下の機能を持つ回路のこと
- パラレル信号をシリアル信号に変換して送り出す
- 受け取ったシリアル信号をパラレル信号に変換する
これを今回は設計することになる。送信するビット列はRS232Cの方式に従う。
- http://www.ele-lab.com/tips_uart.html
- http://www.maroon.dti.ne.jp/koten-kairo/works/dsPIC/serial1.html
**仕様 [#ac75b2e2]
***通信方式 [#nb37fb30]
12Step本の初期設定に従う(といっても、実はKOZOSの実装では相手に合わせて設定が変更できるようになっている)。p46, 表1.2にパラメーターが記載されている。コード上ではp.67, リスト2.5である。
:Bit rate|9600bps
:Dataの長さ|8bit
:Stop bitの長さ|1bit
:Parityの仕様|none
:フロー制御|none (RTS, CTSのピンのこと。そもそも今回は3pinしか使えないのでOK)
***モジュールの構成 [#oe3587be]
- http://documentation.renesas.com/doc/products/mpumcu/rjj09b0165_h83069rf.pdf
これも12Step本の構成に従い、ちょうど鏡合わせになるように真似て作ってみる。
コントローラ1個に対して 1バイトのレジスタ * 8個 が存在する。レジスタの意味はp.65, 表2.3とp.66, 表2.4が参考になる。これはUSARTになっていて、設定する情報が少し多い。
レジスタ8byteの内訳
- SMR(1byte) | Clock select, Stop bit長, Parityの仕様(種類, 有効/無効), Data長, 同期モード |
- BRR(1byte) | Bit rate |
- SCR(1byte) | 送受信の有効/無効 |
- TDR(1byte) | Data(Transmitted) |
- SSR(1byte) | 送信完了/受信完了 |
- RDR(1byte) | Data(Received) |
SMR以外のレジスタの使い方については2ndステップのコードと、H8マイコンの仕様書を読むことで覚える。
***H8/3069Fの場合 [#ve5033e3]
|Bit|7|6|5|4|3|2|1|0|
|RDR(Receive Data Register)| | | | | | | | |
|TDR(Transmit Data Register)| | | | | | | | |
|SMR(Serial Mode Register)| C/A | CHR | PE | O/E | STOP | MP | CKS1 | CKS0 |
|SCR(Serial Control Register)| TIE | RIE | TE | RE | MPIE | TEIE | CKE1 | CKE0 |
|SSR(Serial Status Register)| TDRE | RDRF | ORER | FER/ERS | PER | TEND | MPB | MPBT |
|BRR(Bit Rate Register)| | | | | | | | |
-SMR説明
|| C/A | CHR(Character Length) | PE(Parity Enable) | O/E(Odd/Even) | STOP | MP(Multi Processor) | CKS1 | CKS0 |
|0|調歩同期式(こっちを使う)|Data長8bit|パリティビット無効|偶数パリティ|Stop bit 1|無効|クロックソースの選択, BRRも参照||
|1|クロック同期式|7bit|パリティビット付加|奇数パリティ|Stop bit 2|有効|||
-SCR説明
| | TIE (Transmit Interrupt Enable) | RIE (Receive Interrupt Enable) | TE (Transmit Enable) | RE (Receive Enable) | MPIE (Multi Processor IE) | TEIE (Transmit End IE) | CKE1 | CKE0 |
|0|TXI禁止|RXI禁止|送信禁止|受信禁止| |TEI禁止| | |
|1|TXI許可|RXI許可|送信許可|受信許可| |TEI許可| | |
今回は割り込みを考慮しないのであまりSCRは使わないかも?
-SSR説明(*はクリアしかできない, **は読み込みのみ)
||*TDRE (Transmit Data Register Enable) |*RDRF (Receive Data Register Full) | *ORER (Over Run ERror) | *FER (Framing ERror) | *PER (Parity ERror) | **TEND (Transmit END) | **MPB (Multi Processor Bit) | MPBT (MPB Transfer) |
|0|TDRに送信データがある|RDRに受信データが格納されていない|受信中または正常終了| 受信中または正常終了|受信中または正常終了|送信中| ||
|クリア条件|TDRE=1から読み込んだあと0をWriteしたとき|リセット時, RDRF=1の状態を読み込んだ後、0をWriteしたとき|リセット時, ORER=1の状態を読み込んだ後0をWriteしたとき|リセット時, FER=1の状態を読み込んだ後0をWriteしたとき|リセット時, PER=1の状態を読み込んだ後0をWriteしたとき|TEND=1の状態を読み込んだ後0をWriteしたとき| | |
|1|ない|格納されている|OverRunError|FramingError|ParityError|送信終了| | |
|セット条件|リセット時, SCRのTE==0, TDRからデータが転送されたあと|受信が正常終了したとき|RDRF==1のときに次の受信を完了|Stop bitが0だったとき|パリティチェックに失敗|リセット時, SCRのTE==0, 最後尾ビットの送信時にTDRE=1だったとき| | |
これらすべてを実装するのは無駄が多い。必要な部分だけを抜き出すことにする。
***オリジナルUARTコントローラ [#s47c6631]
**NSL記述 [#k3d13a61]
まずは0 1000001 1 (Start bit, ASCIIの'A', Stop bit)を断続的に送信するモジュールを作り、FPGAからパソコンへ送れるかテストしてみる。
それをNSLで記述し、rtl\DE2_115.nslでmemory-mapped I/Oとして登録してみる。
簡単なsnxc2のコードを書いて送ることが出来ればほぼ完成。
ページ名: