マイコン初心者です。初めて投稿します。
RX660の調歩同期式シリアル通信を行うためにRTSの Hi/Lo で送信制御をしようとしています。しかし、初期化の際にRTSをLo出力しようと、void R_Config_SCI1_Create_UserInit(void)の関数内にSCI1.SCR.BIT.RE = 1U; を追加したところ、RTSの信号がHi/Loを繰り返すという現象が起きております。Low固定の予想でしたが、繰り替えす原因が不明なため、助けていただけないでしょうか。
環境はCS+(V9.09)とスマート・コンフィグレータ(V1.02)で生成したコードをE2 Liteで書き込んで使っています。
以下初期化部分<Config_SCI1.c>void R_Config_SCI1_Create(void){ /* Cancel SCI stop state */ MSTP(SCI1) = 0U;
/* Set interrupt priority */ IPR(SCI1, RXI1) = _0F_SCI_PRIORITY_LEVEL15; IPR(SCI1, TXI1) = _0F_SCI_PRIORITY_LEVEL15;
/* Clear the control register */ SCI1.SCR.BYTE = 0x00U;
/* Set TXD1 pin */ MPC.P16PFS.BYTE = 0x0AU; PORT1.PODR.BYTE |= 0x40U; PORT1.PDR.BYTE |= 0x40U;
/* Set RXD1 pin */ MPC.P15PFS.BYTE = 0x0AU; PORT1.PMR.BYTE |= 0x20U;
/* Set clock enable */ SCI1.SCR.BYTE = _00_SCI_INTERNAL_SCK_UNUSED;
/* Clear the SIMR1.IICM, SPMR.CKPH, and CKPOL bit, and set SPMR */ SCI1.SIMR1.BIT.IICM = 0U; SCI1.SPMR.BYTE = _00_SCI_RTS | _00_SCI_CLOCK_NOT_INVERTED | _00_SCI_CLOCK_NOT_DELAYED;
/* Set control registers */ SCI1.SMR.BYTE = _00_SCI_CLOCK_PCLK | _00_SCI_MULTI_PROCESSOR_DISABLE | _00_SCI_STOP_1 | _00_SCI_PARITY_DISABLE | _00_SCI_DATA_LENGTH_8 | _00_SCI_ASYNCHRONOUS_OR_I2C_MODE; SCI1.SCMR.BYTE = _00_SCI_SERIAL_MODE | _00_SCI_DATA_INVERT_NONE | _00_SCI_DATA_LSB_FIRST | _10_SCI_DATA_LENGTH_8_OR_7 | _62_SCI_SCMR_DEFAULT; SCI1.SEMR.BYTE = _02_SCI_INSTANT_TRANSMIT_ENABLE | _00_SCI_BIT_MODULATION_DISABLE | _00_SCI_DEPEND_BGDM_ABCS | _00_SCI_16_BASE_CLOCK | _00_SCI_NOISE_FILTER_DISABLE | _00_SCI_BAUDRATE_SINGLE | _00_SCI_LOW_LEVEL_START_BIT; SCI1.SPTR.BYTE = _00_SCI_IN_SIGNAL_NOT_INVERT | _00_SCI_OUT_SIGNAL_NOT_INVERT | _00_SCI_RECEIVE_TIME_NOT_ADJUST | _00_SCI_TRANSMIT_TIME_NOT_ADJUST | _03_SCI_SPTR_DEFAULT;
/* Set bit rate */ SCI1.BRR = 0xC2U;
/* Set RTS1# pin */ MPC.P14PFS.BYTE = 0x0BU; PORT1.PMR.BYTE |= 0x10U;
R_Config_SCI1_Create_UserInit();}
<Config_SCI1_user.c>void R_Config_SCI1_Create_UserInit(void){ /* Start user code for user init. Do not edit comment generated here */ SCI1.SCR.BIT.RE = 1U; /* End user code. Do not edit comment generated here */}
お使いのスマートコンフィギュータのUART設定にはハードウェアフロー制御設定項目があると思いますが(私のe2studio環境ではコンポーネントSCI(SCIF)調歩同期モードV1.12.0にはあります)それを使ってRTSn#を有効化して試されてはどうでしょうか?
わわいです
> RTSの信号がHi/Loを繰り返すという現象が起きております。
そもそも、RTSという信号は、受信可能になるとLowになる信号ってことですんで、それで正常な動作なんではないでしょうか。
Highになって困るということならば、受信可能にした後に、RTSを有効にするとかする必要があるのでは。
Yamamoto様
回答ありがとうございます。
スマートコンフィグレータにて RTSn#を有効にして、再測定してみたのですが
変わらずRTS信号が Hi/Loを繰り返している状況です。
データ送信時の Hi固定は上手くいっているのですが、Lo固定が思うようにいっておりません。
以下波形画像
黄色:RTS
緑色:Tx
画像上半分:全体波形
画像下半分:送信前、拡大波形
何をしたいのかよくわかりませんが、そもそもRTSは受信バッファに連動してRTS出力を変化させます。わわいさんも書いてあるとおり。UART受信側(RTS出力) ==> (CTS入力)UART送信側こういう接続が本来想定されていて、受信側が受付可能という通知としてLowになったらUART送信側がデータを送り出します。(SCIは理由は分かりませんが、RTSかCTSのどちらかだけ有効になるようですね。全二重で使う時でも片方だけなのはなんかしっくりしない。)もしかしてTXDピンがビット列を送信しているフレームの間にLowになる信号を作成したいのでしょうか?その場合はGPIOでやらないとできないはず。
RTS(P14)がH/L繰り返している時、RXD(P15)に何か信号が入っていないでしょうか。(有効な通信ではなく、偽パルスの様な信号。)
可能であれば、P15の波形を見てみてください。外部から信号を入れなければ、Hをキープしているはずです。(通信相手のTXD以外で)回路的に、P15につながっている信号はないか。(P14の立ち下がりエッジ→P15に信号が回り込む様な回路上のパスが存在しないでしょうか。)
Yamamoto様、わわい様、tf様
私自身が RTSの使い方等を勘違いしていた部分もあったので、
もう一度マニュアル、コード等見直してみます。
ご教授頂きありがとうございます!!