在线时间65 小时
UID3121733
注册时间2015-5-14
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 418
- 最后登录
- 2024-3-22
|
请教一下使用过can的朋友,最近在折腾k66芯片的can通讯,利用官方ksdk2.5.0中的flexbus驱动例程改写,can接口外无任何芯片,采用回环模式测试,收发正常,接受模块可以准确测量到发送模块的数据; 但把例程中的回环模式关闭之后(该false),发送模块会堵塞在发送过程中,无法跳出发送完成标志判断循环,用示波器看发送引脚,引脚一直有波形输出,不知为什么发送模块收不到完成标志从而跳出发送,从回环模式改会普通模式除了设置“enableLoopBack”外,还需要设置什么?
此外,我还试了一下把cantx和canrx短接,虽然一直有波形,发送无法跳出,接收模块也收不到数据,直接这样做普通模式测试可以么?
以下是我的代码(完全按照官方回环测试例程进行编写的):
//can接收中断
void CAN1_ORed_Message_buffer_IRQHandler(void)
{
/* If new data arrived. */
if (FLEXCAN_GetMbStatusFlags(CAN1, 1 << 10))
{
FLEXCAN_ClearMbStatusFlags(CAN1, 1 << 10);
FLEXCAN_ReadRxMb(CAN1, 10, &rxFrame);
//rxComplete = true;
}
}
//can通讯线程
static void can_thread(void *arg)
{
SIM->SCGC3 |= SIM_SCGC3_FLEXCAN1_MASK;
// PORTE24 配置为CAN1_TX
PORT_SetPinMux(PORTE, 24U, kPORT_MuxAlt2);
// PORTE25 配置为 CAN1_RX
PORT_SetPinMux(PORTE, 25U, kPORT_MuxAlt2);
//获取can默认配置
FLEXCAN_GetDefaultConfig(&flexcanConfig);
//设置can参数
flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc;
flexcanConfig.baudRate = 1000000U;
flexcanConfig.maxMbNum = 16;
flexcanConfig.enableLoopBack = false; //必须设置为true,否则发送不清零
flexcanConfig.enableSelfWakeup = false;
flexcanConfig.enableIndividMask = false;
//初始化can模块
FLEXCAN_Init(CAN1, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk));
// 设置 Rx Message Buffer.
mbConfig.format = kFLEXCAN_FrameFormatStandard;
mbConfig.type = kFLEXCAN_FrameTypeData;
mbConfig.id = FLEXCAN_ID_STD(0x124);
//设置can接收配置
FLEXCAN_SetRxMbConfig(CAN1, 10, &mbConfig, true);
//设置can发送配置
FLEXCAN_SetTxMbConfig(CAN1, 9, true);
// 使能 Rx Message Buffer 中断
FLEXCAN_EnableMbInterrupts(CAN1, 1 << 10);
EnableIRQ(CAN1_ORed_Message_buffer_IRQn);
//FLEXCAN_DisableMbInterrupts(CAN1, 1 << 10);
// 准备发送帧
txFrame.format = kFLEXCAN_FrameFormatStandard;
txFrame.type = kFLEXCAN_FrameTypeData;
txFrame.id = FLEXCAN_ID_STD(0x123);
txFrame.length = 8;
txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) |
CAN_WORD0_DATA_BYTE_3(0x44);
txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) |
CAN_WORD1_DATA_BYTE_7(0x88);
while (1)
{
//can发送
FLEXCAN_TransferSendBlocking(CAN1, 9, &txFrame);
//延时
vTaskDelay(10);
}
}
最佳答案
你不用回环模式要接can分析仪之类的can设备,否则就是一直不停发送
|
|