今回は“シリアル通信”をテーマに、データシートを読みながらプログラムを開発する。マイコン開発の流れが何となくつかめるはずだ。
前回「レジスタへのアクセスが基本! SHマイコンで遊ぼう」では、SHマイコンに慣れてもらうことを目的に、簡単なI/O操作について解説しました。C言語がある程度分かっていれば、難なく理解できたと思います。しかし、I/O操作はマイコンの基本中の基本です。マイコンにはまだまだたくさんの機能があり、それらを利用するためには、レジスタ操作の手順やその意味を正しく理解する必要があります。
今回のテーマは、「シリアル通信」です。これができるようになると、PCとマイコンとで通信して、PC側のプログラムからLEDを光らせたり、スイッチの状態をPC側のプログラムで取得したりできます。より組み込み開発の幅が広がりますね。
今回も“基本はレジスタ操作”なのですが、若干難易度が上がります。そこで今回は「データシートに書いてある内容をプログラムとして“形”にする」ことを意識してみましょう。本稿を参考に、データシートを読みながら、一緒にプログラムを作ってみてください。マイコン開発の流れが何となくつかめると思います。
シリアル通信とは、1本の信号線に全てのデータを乗せて通信する方法です(図1左)。データは1ビットずつ時間をずらして送信されます。現在、主に利用されているUSBなどはシリアル通信の一種です。今回は「RS-232C」と呼ばれるシリアル通信の方式を利用します。
一方で、「パラレル通信」と呼ばれる方法があります。パラレル通信は通信するビットの数だけ信号線を利用し、一度に送信する方式です(図1右)。一見するとパラレル通信の方が効率が良さそうですが、パラレル通信は各ビットを送信・受信するタイミングを同期させるなどの手間が掛かります。その上、シリアル通信よりも信号線の数が増えて、物理的なスペースが必要になります。そのような事情から、近年はシリアル通信が盛んに利用されています。
シリアル通信を利用する場合、送られてくるどの部分がデータの先頭なのか、データの末尾はどこなのかを識別する必要があります。この方法には、「調歩同期式(非同期式)」と「クロック同期式」の2つがあります。
調歩同期式は、送信する文字(データ)の先頭と末尾にそれぞれスタートビットとストップビットを加えて送信する方法です。多くの場合、スタートビットは「0」、ストップビットは「1」であり、受信側は信号の立ち下り(1から0になる瞬間)を合図にデータ受信を開始します。この方法は、8ビットのデータ1つを送るのに10ビット必要となるため、効率は悪いのですが通信相手と同期を取る必要がないため実装が簡単です。なお、この手法はRS-232C規格で利用されていて、本稿でもこの方式を採用しています。
一方、クロック同期式は送信用・受信用の信号線の他に、もう1本クロック用の信号線を利用して同期を取る方法です。具体的には、クロックパルスと同時にデータを1ビット送信し、受信側はクロックパルスと同時に来たデータを受け取ります。調歩同期式と比較して通信の効率は良いのですが、信号線が1本多く必要になります。
前回の入出力機能と同様に、シリアル通信にもレジスタの設定が必要です。入出力と比較して機能が多いので、レジスタ操作は少し複雑になります。
今回必要とするレジスタ操作を完璧に理解するためには、マイコンについて相当な量の勉強が必要です。ですので、今回のレジスタ設定については分からないところがあっても結構です。余力があれば、ぜひご自身で勉強してみてください。
それでは早速、シリアル通信の初期化の関数から作ってみましょう。初期化の手順は、ルネサス エレクトロニクスの「SH7125」マイコンのデータシートに書いてあります。基本的には、その手順通りにレジスタを操作するだけです。
関連リンク: | |
---|---|
⇒ | SH7124、SH7125グループのドキュメント類 |
シリアル通信の通信速度は、周辺クロックPΦという値に依存しています。周辺クロックはマイコンボード上のPLL回路から出力されるクロックを分周したものです。この分周率の設定は、周波数制御レジスタのPFC2〜0ビット(CPG. FRQCR.PFC)に対して行いますが、今回はデフォルト値の4分の1倍を利用しますので、特に変更の必要はありません。秋月電子通商の「SH7125Fベースボードキット」を利用する場合、PΦ=25MHzとなります。この値は、後ほどシリアル通信の通信速度の設定をするときに利用しますので、覚えておいてください。
関連リンク: | |
---|---|
⇒ | SH7125ベースボードキット(秋月電子通商) |
シリアル通信の設定をする前に、1つ注意があります。最近のマイコンは消費電力を極力抑えるため、マイコンのほとんどの機能は、デフォルトではクロックが供給されません(使える状態になっていない)。そのため、ユーザーはあらかじめ利用する機能に対してクロックを供給する設定をしなければなりません。そしてやはり、クロックの供給設定もレジスタ操作で行います。具体的には、スタンバイコントロールレジスタ(STB.CR)の_SCI1ビットを「0」にクリアします(デフォルトでは「1」にセットされている)。これは、データシートのシリアル通信の部分には書かれていませんので、忘れずに設定しましょう。
STB.CR3.BIT._SCI1 = 0; // SCI1にクロックを供給
シリアル通信の設定変更中に通信を行わないよう、送信/受信を禁止します。今回は利用しませんが、割り込みを利用した通信もここで禁止します。これらの設定は、シリアルコントロールレジスタ(SCSCR)に対して行います。TEビットとREビットにそれぞれ「0」をセットすると送信/受信を禁止します(「1」をセットすると許可します)。TIE、RIE、MPIE、TEIEは割り込みやマルチプロセッサを利用する場合の設定ですが、今回は利用しませんので、「0」をセットして禁止しておきます。
SCI1.SCSCR.BIT.TE = 0; // 送信動作を禁止 SCI1.SCSCR.BIT.RE = 0; // 受信動作を禁止 SCI1.SCSCR.BIT.TIE = 0; // 送信データエンプティ割り込み要求を禁止 SCI1.SCSCR.BIT.RIE = 0; // 受信データフル割り込み要求、および受信エラー割り込み要求を禁止 SCI1.SCSCR.BIT.MPIE = 0; // マルチプロセッサインタラプトを禁止 SCI1.SCSCR.BIT.TEIE = 0; // トランスミットエンドインタラプトを禁止
また、CKEビットはシリアル通信のクロックソースを選択します。今回は調歩同期式モードで内部クロックを利用し、SCK端子からクロック出力する必要もないので、「0」をセットします。
SCI1.SCSCR.BIT.CKE = 0; // SCK端子は入力端子
Copyright © ITmedia, Inc. All Rights Reserved.