こんにちは、
RL78 F13 48ピンコントローラーのLINを使用しています。
使用している LIN IC は TJA1021 - マスターです。
2 つのスレーブがマスターに接続されており、50 ミリ秒のタイマー間隔で while ループが発生し、両方のスレーブにヘッダーを 1 つずつ送信してデータを受信しようとしています。
両方の送信間に約 2.5 ミリ秒のディレイを追加すると、LIN 通信は正常に機能しています。
そうしないと、LIN からデータを取得できません。
-------------------------------------------------- -----------------
例:
2回の送信の間に遅延がある場合問題なく動作します。
LIN_Master_HeaderTransmit(0x81); //LIN スレーブ 1for(int i =ZERO; i<=2500; i++){ Wait1us();}LIN_Master_HeaderTransmit(0x82); //LIN スレーブ 2
-------------------------------------------------- --------------------
以下のコードは機能しません。
LIN_Master_HeaderTransmit(0x81); //LIN スレーブ 1
LIN_Master_HeaderTransmit(0x82); //LIN スレーブ 2
このディレイは予期されたものですか、それともディレイなく動作するはずですか?教えてください。
ありがとうございます。
Vishさん、こんにちは。NoMaYです。> 両方の送信間に約 2.5 ミリ秒のディレイを追加すると、LIN 通信は正常に機能しています。> そうしないと、LIN からデータを取得できません。> このディレイは予期されたものですか、それともディレイなく動作するはずですか?LIN_Master_HeaderTransmit()というのは、ルネサスさんのアプリケーションノートか何かでソース全体が公開されているものでしょうか?あるいは、CS+のコード生成機能やAppliletで生成されたものであって、ソースを私が見ることが出来るものでしょうか?
NoMay さん、
LIN_Master_HeaderTransmit()というのは、ルネサスさんのアプリケーションノートか何かでソース全体が公開されているものでしょうか?>> はい。そうです。www.renesas.com/.../search(IARのサンプル)
Vishさん、こんにちは。NoMaYです。ドキュメントを見ると、preparationという記載があります。実際、ソースを見ても、送信受信を起動するところまでしかしていないようです。なので、連続して呼び出してはいけません。つまり、ディレイは予期されたもの、です。正直には、LINの通信プロトコルおよび内蔵周辺レジスタ仕様に無知ですので以下の追加コードが正しいのか不明ですが、スーパーループで運用するのであれば、以下のように送信完了フラグや受信完了フラグを立てるコードを追加することが前提、であり、そのあたりのことは自分ですることが前提、である、そういうサンプルプログラムだろうなぁ、と私は思いました。
3.2 FunctionsFunction Name Outline Code size (bytes)RLIN_Master_Init Initial setting 98RLIN_Master_HeaderTransmit Header Transmit preparation 78RLIN_Master_Transmit Data transmission preparation 53RLIN_Master_Receive Data reception preparation 18RLIN_Master_GetData Get data from data buffer 18Clear_DataBuffer Setting all data buffer to 0 26Get_response_RxData Store data to variables array from Data buffer 41
bool g_RLIN0_tx_ready_flag = true;bool RLIN0_Is_Transmit_Busy(void){ return !g_RLIN0_tx_ready_flag;}#pragma vector = INTLIN0TRM_vect__interrupt static void RLIN0_Transmission_interrupt(void){ uint8_t transmit_header_flag; uint8_t transmit_response_flag; transmit_header_flag=LST0 & 0x80; transmit_response_flag=LST0 & 0x01; if(transmit_header_flag) { /*LIE0&=0xF7;*/ /*Disable header transmit interrupt*//*revision 1.01*/ LST0&=0x7F; /*clear successful header reception flag */ /*LIE0|=0x80;*/ /*enable header transmit interrupt*//*revision 1.01*/ } if(transmit_response_flag) { LST0&=0xFE; } s_RLIN0_tx_ready_flag = true; /*should be set to false before starting transmission*/}
bool g_RLIN0_rx_ready_flag = false;bool RLIN0_Is_Receive_Ready(void){ return g_RLIN0_rx_ready_flag;}#pragma vector = INTLIN0RVC_vect__interrupt static void RLIN0_Reception_interrupt(void){ LST0&=0xFD; /*clear response reception successful flag*/ RLIN_Master_GetData(); /*get the reception data*/ g_RLIN0_rx_ready_flag = true; /*should be set to false before starting reception*/}
送信受信起動側コードの改造案に関しては省略