2366087_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2366087_ja-JP

2366087_ja-JP

FLEXCANビットレート

こんにちは。このMCUはS32K144を使用しており、5Vの電源で動作します。現在CAN通信を設定中で、CAN0とCAN2が有効になっています。

CAN0は高速CAN(TJA1050、500K)、CAN2は低速CAN(TJA1055T/3)です。CAN0は問題なく500Kに設定されています。CAN0->CTRL1 = 0x00DB0006は500Kです。

CAN2を100Kに設定し、CAN2->CTRL1 = 0x00CF0033としたいのですが、他のCANデバイスがデータを受信できません。

CANビットレートが100Kに設定されている場合、CAN2->CTRL1の値はどうなりますか?

あるいは、TJA1050を100Kに設定することは可能でしょうか?CAN0を100Kに設定してみましたが、うまくいきませんでした。

void FLEXCAN2_init(void)
ヤージュ
#define MSG_BUF_SIZE 4 /* メッセージバッファサイズ。(CAN 2.0AB: 2ヘッダー + 2データ = 4ワード) */
uint32_t i=0;

PCC->PCCn[PCC_FlexCAN2_INDEX] |= PCC_PCCn_CGC_MASK; /* CGC=1: FlexCAN2へのクロックを有効にする */
CAN2->MCR |= CAN_MCR_MDIS_MASK; /* MDIS=1: クロックを選択する前にモジュールを無効にする */
CAN2->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK; /* CLKsrc=0: クロックソース = オシレーター (8 MHz) */
CAN2->MCR &= ~CAN_MCR_MDIS_MASK; /* MDIS=0; モジュール設定を有効にします。(FRZ、HALTを設定します)*/
while (!((CAN2->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT))
ヤージュ
/*コード*/
}
/* 推奨される方法: フリーズモードの開始/終了時に FRZACK=1 になるまで待機する */
CAN2->CTRL1 = 0x00CF0033; /* 0x00DB0006 500 KHzビットタイムに設定 0x00DF000F 125Kbps */
/* 時間量子周波数 = 16 時間量子 x 500 KHz ビット時間 = 8MHz */
/* PRESDIV+1 = Fclksrc/Ftq = 8 MHz/8 MHz = 1 */
/* したがって PRESDIV = 0 */
/* PSEG2 = Phase_Seg2 - 1 = 4 - 1 = 3 */
/* PSEG1 = PSEG2 = 3 */
/* PROPSEG= Prop_Seg - 1 = 7 - 1 = 6 */
/* RJW: Phase_Seg2 >=4 なので、RJW+1=4 なので RJW=3。*/
/* SMP = 1: CANサンプルごとに3ビットを使用する */
/* CLKsrc=0 (変更なし): Fcanclk= Fosc= 8 MHz */

for(i=0; i<64; i++ ) /* CAN2: 16個のメッセージバッファをクリア x 4ワード/メッセージバッファ = 64ワード */
ヤージュ
CAN2->RAMn[i] = 0; /* メッセージバッファワードをクリア */
}
for(i=0; i<16; i++ ) /* FRZモードでは、CAN2 16個のメッセージバッファフィルタを初期化します */
ヤージュ
CAN2->RXIMR[i] = 0xFFFFFFFF; /* 受信メッセージのすべてのIDビットをチェックします */
}
CAN2->RXMGMASK = 0x1FFFFFFF; /* グローバル受容マスク: すべてのIDビットをチェック */
CAN2->RAMn[ 4*MSG_BUF_SIZE + 0] = 0x04000000; /* メッセージバッファ 4、ワード 0: 受信を有効にする */
/* EDL、BRS、ESI=0: CANFDは使用されません */
/* CODE=4: MBがRX非アクティブに設定されました */
/* IDE=0: 標準ID */
/* SRR、RTR、TIME STAMP = 0: 該当なし */
#ifdef NODE_A /* ノード A は標準 ID 0x511 のメッセージを受信する */
CAN2->RAMn[ 4*MSG_BUF_SIZE + 1] = 0x14440000; /* メッセージバッファ 4、ワード 1: 標準 ID = 0x111 */
#else /* ノード B は標準 ID 0x555 のメッセージを受信する */
CAN2->RAMn[ 4*MSG_BUF_SIZE + 1] = 0x15540000; /* メッセージバッファ 4、ワード 1: 標準 ID = 0x555 */
#endif
/* PRIO = 0: CANFD は使用されません */
CAN2->MCR = 0x0000000F; /* FlexCAN2 の停止状態を 16 MB の間無効化する */
while ((CAN2->MCR && CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) {}
/* 推奨される方法:FRZACKがクリアされるまで待つ(フリーズモードではない) */
while ((CAN2->MCR && CAN_MCR_NOTRDY_MASK) >> CAN_MCR_NOTRDY_SHIFT) {}
/* 推奨される手順: NOTRDY がクリアされるまで待機します (モジュール準備完了) */
}

Re: FLEXCAN bitrate

こんにちは、 @MrShen さん

MPC5xxx/S32Kxx/LPCxxxx: CAN / CAN FDビットタイミング計算に関するドキュメントを参照してください。設定に合わせてパラメータを変更するだけです(例:S32K1xx、TJA1050、ビットレート+サンプリングポイントなど)、ツールはそれぞれのビットレートの設定とCAN_CTRL1の値を提供します。

Julin_AragnM_0-1778863628803.png

TJA1055は最大125kbpsまでサポートしているので、両方のトランシーバを100kbpsに設定することは可能だと考えています。

よろしくお願いします、
ジュリアン

タグ(1)
評価なし
バージョン履歴
最終更新日:
1週間前
更新者: