初と申します。
現在RX64Mを使用して機器とのシリアル通信(RS232C)を行っているのですが、ボーレートについて質問があります。
スマートコンフィグレータを使用してPCLKBを30MHzとし、ボーレート9600で機器①と接続しています。
新たにタッチパネル(機器②)を購入し、同じくRS232C通信で接続したいのですが、相手側が通信仕様としてボーレート115200です。
同時にPCLKBを利用して、ボーレート115200に対応させたいのですが、データシートを見てもこの数字がありません。
勝手に設定しても問題無いのでしょうか。その理由を教えてください。
また、同じクロックを使用して別々のボーレートを設定し通信することは可能なのでしょうか。
端子は別にしてあります。
分かりづらいところがあるかもしれませんが、よろしくお願い致します。
こんにちは、NAKAといいます。PCLKが30MHzだと
で計算すると
BRR = (30MHz/(****2*115200))-1 = 1.0345
誤差 = (30MHz/(115200*****2*2))-1 = 0.017 = 17%
BRR を ”1” に設定することになりますが誤差が17%になっちゃいます。
せいぜい5%程度にしないと、うまく通信ができないと思います。1byteくらいならいけるのかな?
PCLKBをもっと早くあるいは分周したときに丁度よさげな値に変更しないと厳しそうです。P.S.
なんか*****に文字化けしちゃうので、絵で貼り付けます。
NAKA様
詳しい回答ありがとうございます。計算についてよくわかりました。
タッチパネル製造先に確認したところ、ボーレート9600でも大丈夫なようなので、そのままPCLKBが使用できそうです。
もう一つ質問があるのですが。
機器①とタッチパネルを同じRS232CのRXDとTXDの端子を使用して通信しても大丈夫なのでしょうか。
RX64Mの100ピンを使用しており、27、28番ピンを機器①のRS232C通信に使用しているのですが、
そのままタッチパネルとの通信にも使えないかなと考えております。
RS232C通信の経験が乏しいため、このあたりのことがいまいちわからず…。
同時に接続するならダメです。信号線は必ず駆動信号を1つとしないと、駆動回路が双方で違うロジック信号を出力した時に最悪回路基板を壊します。この場合ですと、マイコン側からは1つの出力信号を装置2つが受ける場合はおそらく大丈夫です。しかし、機器側の送信、2つの装置で信号を出力するのでどちらかの装置、もしくは両方の装置を壊します。同時使用しないという条件なら工夫することで解決するかもしれませんが。直列に抵抗を入れると電流制限で故障は避けられるかもしれないですが、どちらにしても信号が正しく伝わらず実用できないです。
Yamamoto様
ご回答ありがとうございます。
危険なことをするところでした。ありがとうございます。
通信ライブラリが既にあって、それはSCI0~6に対応しているのですが、
今は、SCI0とSCI9が使える状態で、SCI9の方は「FIFO付き」というものらしく、上記の通信ライブラリが使用できないため、SCI0だけでなんとかできないかなと思い、上記の質問をさせていただきました。SCI9の方のサンプルプログラムなどあればなと思ったのですが、何かご存じでしょうか。一般の方のブログなども探してみましたが、めぼしいものは見つけられませんでした。
FIFO付きの方が高尚なペリフェラルですが、ライブラリがないのでというのならおそらくFIFO無効にできるんじゃないかなと思います。FIFO絡みでエラッタみたいなの出ていますがこれを見るとFIFO対応のものを無しで使うような説明になっているのでそういう風に初期化すればいいように思います。www.renesas.com/.../notes-transmit-data-empty-interrupt-when-fifo-use-serial-communications-interface-sci
非FIFOモードでTIEビット=1にしている状態で、TEビットを0→1にすれば割込み要求が行えるみたいですね。スマートコンフィグレータで出力したソースファイル上にある、
void R_Config_SCIF9_Stop(void){
/* Disable serial transmit */ SCIFA9.SCR.BIT.TE = 0U; ←
/* Disable serial receive */ SCIFA9.SCR.BIT.RE = 0U;
/* Disable TXI interrupt */ SCIFA9.SCR.BIT.TIE = 0U; ←
/* Disable RXI, ERI, BRI and DRI interrupt */ SCIFA9.SCR.BIT.RIE = 0U; IR(SCIFA9,TXIF9) = 0U; IEN(SCIFA9,TXIF9) = 0U; ICU.GENAL0.BIT.EN4 = 0U; IR(SCIFA9,RXIF9) = 0U; IEN(SCIFA9,RXIF9) = 0U; ICU.GENAL0.BIT.EN5 = 0U; ICU.GENAL0.BIT.EN6 = 0U; ICU.GENAL0.BIT.EN7 = 0U;}
矢印を付けた部分を上記のビットにすればよいという感じでしょうか。
突っ込んだ実装に関する話、私はフェードアウトさせて頂きます。自力で解決されるべきポイントだと思います。もしかしたら他の方が協力してくれるかもしせません。
色々教えていただきありがとうございました。
NAKAさま
横からすみません、PCLKB=30MHzでクロック分周なし(SMR.CKS=0)の場合
2^(2n-1)のn=0となり、2^(2n-1)の部分が0.5になるので、
BRR=7で、115,200bps 誤差1.73%になる気がします。
初さま
スマート・コンフィグレータで設定すると、BGDM(倍クロック)=1, ABCS(8サンプルモード)=1
, BRR=32 の設定で、誤差-1.36%の設定が選ばれるようです。BGDM=1は問題ない(と思ってます)、ABCS=1は1ビットのサンプル数を減らす設定なので微妙といえば微妙です。(8サンプルで-1.36%なら、16サンプルで1.73%の方を選べる様にして欲しい…)
さらにビットモジュレーションを有効にすれば、(見た目上の速度的には)誤差はなくなります。
(上記はSCI0側でPCLKB=30MHzの場合、SCI9側はPCLKAベースになるのでPCLKAの設定に依存)
(SCI-ch毎に、クロック分周比、ビットレートレジスタは別なので、同じクロック源で別なビットレートに設定する事は何ら問題ありません。)
ちなみに、PCLKB=30MHzで使用するのは消費電力を抑えたい等の理由があるのでしょうか。普通、RX64Mを使う場合、(何も考えなければ)ICLK=120MHz, PCLKB=60MHzで使いたくなります。
SCIFA9.SCR.BIT.TE =0/1(送信禁止/許可)※SCI0もSCI9も同じ働き
SCIFA9.SCR.BIT.TIE =0/1(送信エンプティ割り込み禁止/許可)
※SCI0はTDRが空になったら送信エンプティ、SCI9は送信FIFOがしきい値以下になったらエンプティという動作で、TEとTIEはSCI0でもSCI9でも同じようなものかと思うのですが
tf様
詳しいご回答ありがとうございます。
>>SCI-ch毎に、クロック分周比、ビットレートレジスタは別なので、同じクロック源で別なビットレートに設定する事は何ら問題ありません。)
ありがとうございます。この部分について自信がなかったので助かりました。
>>ちなみに、PCLKB=30MHzで使用するのは消費電力を抑えたい等の理由があるのでしょうか。普通、RX64Mを使う場合、(何も考えなければ)ICLK=120MHz, PCLKB=60MHzで使いたくなります。
通史ライブラリを作成していただいたところに聞いたのですが、ボーレート9600の時n=0としたかったという事です。0で揃えたかったようです。
>>SCIFA9.SCR.BIT.TE =0/1(送信禁止/許可)※SCI0もSCI9も同じ働き
>>SCIFA9.SCR.BIT.TIE =0/1(送信エンプティ割り込み禁止/許可)
通信ライブラリ内で同様の箇所探しましたが有りました。
TEとTIEを同様に利用していました。