公式から提供されたSDKを使用してFRDM-KV11Z開発ボードをテストしたところ、CAN通信が割り込みに入ることができないことがわかりました。SDKルーチンはFreeMASTERソフトウェアで使用されます。このデバイスは手元にないので、自分で移植しました。以下は私のコードです:
static void init_CAN(void)
{
status_t status;
flexcan_config_t flexcanConfig;
flexcan_timing_config_t timing_config;
uint32_t canSrcClock = CLOCK_GetFreq(kCLOCK_CoreSysClk);
/* Init FlexCAN module. */
/*
* flexcanConfig.clksrc=kFLEXCAN_ClkSrcOsc;
* flexcanConfig.baudRate = 1000000U;
* flexcanConfig.baudRateFD = 2000000U;
* flexcanConfig.maxMbNum = 16;
* flexcanConfig.enableLoopBack = false;
* flexcanConfig.enableSelfWakeup = false;
* flexcanConfig.enableIndividMask = false;
* flexcanConfig.enableDoze = false;
*/
FLEXCAN_GetDefaultConfig(&flexcanConfig);
flexcanConfig.clksrc=kFLEXCAN_ClkSrcPeri;
flexcanConfig.baudRate = 100000U;
/* 改善されたタイミング設定を更新 */
if (FLEXCAN_CalculateImprovedTimingValues(CAN0, flexcanConfig.baudRate, canSrcClock, &timing_config))
flexcanConfig.timingConfig = timing_config;
FLEXCAN_Init(CAN0, &flexcanConfig, canSrcClock);
/* CAN割り込みを有効にします。*/
EnableIRQ(CAN0_IRQn);
}
ボイドCAN0_IRQHandler(ボイド)
{
uint32_t isrFlags = FLEXCAN_GetStatusFlags(CAN0);
uint32_t isrFlagsMB = FLEXCAN_GetMbStatusFlags(CAN0, 0xFFFFFFFFUL);
カウント++;
if (isrFlags != 0U)
{
FLEXCAN_ClearStatusFlags(CAN0, isrFlags);
}
if (isrFlagsMB != 0U)
{
/* 読み取りまたは書き込み */
if ((isrFlagsMB & (1UL << (FMSTR_FLEXCAN_RXMB))) != 0U)
{
/* データを受信していますか?*/
if (FLEXCAN_GetMbStatusFlags(CAN0, 1UL << (FMSTR_FLEXCAN_RXMB)) == 0U)
{
帰る;
}
/* データの読み取りを試み、成功すると、MB が確認され、次回の受信に設定されます */
status_t s = FLEXCAN_ReadRxMb(CAN0, FMSTR_FLEXCAN_RXMB, &CAN_Rxmsg);
}
if ((isrFlagsMB & (1UL << (FMSTR_FLEXCAN_TXMB))) != 0U)
{
/* フレーム送信の確認 */
CAN_Txmsg.length = 0U;
}
/* すべての割り込みフラグをクリアする */
FLEXCAN_ClearMbStatusFlags(CAN0, isrFlagsMB);
}
}
int main(void)
{
status_t status_can;
/* Init board hardware. */
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
init_CAN();
PRINTF("SPI DAM Init OK.\r\n");
CAN_Txmsg.format = 1; //扩展帧ID
CAN_Txmsg.timestamp = 1000; //超时时间
CAN_Txmsg.type = 0; //数据帧
CAN_Txmsg.length = 8; //数据长度
CAN_Txmsg.id = 0x123; //帧ID
/* 8位数据 */
CAN_Txmsg.dataByte0 = 0x0;
CAN_Txmsg.dataByte1 = 0x1;
CAN_Txmsg.dataByte2 = 0x2;
CAN_Txmsg.dataByte3 = 0x3;
CAN_Txmsg.dataByte4 = 0x4;
CAN_Txmsg.dataByte5 = 0x5;
CAN_Txmsg.dataByte6 = 0x6;
CAN_Txmsg.dataByte7 = 0x7;
/* 发送数据 */
FLEXCAN_WriteTxMb(CAN0, 0, &CAN_Txmsg);
(1)ながら
{
status_can = FLEXCAN_WriteTxMb(CAN0, 0, &CAN_Txmsg);
if(status_can != kStatus_Fail)
PRINTF("CAN 書き込み成功 %d\r\n", カウント);
然も無くば
PRINTF("CAN 書き込み失敗 %d\r\n", カウント);
SDK_DelayAtLeastUs(1000000, BOARD_BOOTCLOCKRUN_CORE_CLOCK);//延时1秒
}
}
これで、データを正常に送信できます。ただし、入力する割り込みはなく、データを受信するための割り込みもありません。
こんにちは、XuZhang
ご支援ありがとうございます。
私はこの問題を解決しました
hi,HL_G
NXPセミコンダクター製品へのご興味と、ご奉仕の機会をお寄せいただき、誠にありがとうございます。
開発ボードがFreemaster-over-canを介してFreeMASTERに接続できるかどうかを確認してください。以下の方法で接続テストを実施してください。
XuZhang_0-1728715517072.png
その後、SDK の frdmkv11z_fmstr_example_can デモで次のプログラムを変更することで、CAN 割り込みを有効にできます。
XuZhang_1-1728715528707.png
その上、あなたはFreeMasterツールを持っていないと言っていますか?以下はダウンロードリンクです。
FreeMASTERツール3.2(Lite 1.3を含む) – Windowsインストーラー(nxp.com.cn)
それがあなたの助けになることを願っています。
それでもご不明な点がございましたら、お気軽にお知らせください。
BR
Xu Zhang