P6248915


UARTについてを知る1の記事で、BBC Micro:bit(以後、microbit)のMicroPythonの仕様を参考にUARTというデータのやりとりの方法を見始めた。


rpi2bit


HIGH(1)とLOW(0)のみの信号を送ることしかできない配線で、文字列をバイト型の値に変換し、更に2進法の形にすることで、データを送信できる兆しが見えてきた。

※a → 01100001(16進法で0x61と表現する)

今回もMicroPythonのコードを参考にしてUARTの理解を深めていくことにする。


ちなみに今回の話は、CQ出版社から出版されている中森章 桑野雅彦共著 ARMマイコンCortex-M教科書の内容を参考にした。




microbit.uart.init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None)

UART — BBC micro:bit MicroPython 1.0.1 ドキュメント


baudrate=9600は重要なのだけれども、一旦置いといて、parity(パリティ・ビット)とstop(ストップ・ビット)の値からUARTの基礎となるシリアル通信の構造を見ていく事にする。

UARTでは、データ送信が行われていないアイドル状態の時は常に 1 になっており、データ送信を開始する時はスタート・ビットと呼ばれる 0 のの値にする。

ひとまとまりのデータ(今回であれば8ビット)の終了にストップ・ビットと呼ばれる 1 の値を付与する。


図にすると、


uart_serial_basic_structure


このようになる。

注意として、上の図は受信側になるので値の並び方が逆順になるらしい。


アイドル状態の 1 が続き、0 を受け取ったら、その後は値が続き、値の最後だと予想される場所の 1 を確認すると、値の取り込みを終了する。


上の図ではストップ・ビットの左側に 0 の値が一つある。


uart_serial_basic_structure2


これをパリティ・ビットと呼び、データ送信時の誤り検出符号となる。

microbitのUARTのパリティの設定にはNone(なし)、microbit.uart.ODD(奇パリティ)とmicrobit.uart.EVEN(偶パリティ)があり、奇パリティで話を進めると、送信したデータのHIGHが奇数であれば 0 、偶数であれば 1 となる。

※偶パリティであれば、値は逆になる


今回の01100001はHIGH(1)が 3 の奇数であるため、パリティ・ビットは 0 となる。

パリティビット - Wikipedia


最後にbaudrate(ボーレート)について触れたいが、長くなるので次の記事で触れる事にする。