明强 林 2014-11-27 上午12:40
板子用的是FRDM-KE06Z,
用
KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\keil\ke06\CA
N_Node1WithInt_demo,
KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\keil\ke06\CA
N_Node2_demo,
KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\keil\ke06\CA
N_Node1_demo,
这三个例程都无法接受到CAN数据,无法进入接受中断函数,但是可以发送CAN数据,用示波器看MCU的
can_rx(PTH2)是有信号的
平均用户评级: 无评分 (0 评级)平均用户评级
无评分
0
(0 评级)
此内容已被标记为最终。 显示 14 条回复
Re: FRDM-KE06Z 无法接受CAN数据
Xi Yang 2014-11-27 下午8:18 (回复 明强 林) Hi,
1, Please confirm CAN connection and baudrate is correct. I suggested to use a USB-CAN and logic analyzer as debugger for your problem killer.
2. KEXX_DRIVERS_V1.2.1_DEVD's baudrate define is wrong. please see following:
I found two issues on KE06_drv_lib CAN demo:
- #define BAUD_RATE_CLOCK in mscan.h should be BUS_CLK_HZ.
- #define Baud_RATE in mscan.h should be (BAUD_RATE_CLOCK/(BAUD_RATE_BRP + 1) / (3 + BAUD_RATE_TSEG1 + BAUD_RATE_TSEG2))
3. I am verified CAN demos on KEXX_DRIVERS_V1.2.1_DEVD, It all works OK.
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-11-27 下午8:28 (回复 Xi Yang) 你好,最原始的的Demo是无法发送和接受数据的,因为波特率设置不对,这个问题你也知道了,我已经改成了选择 the bus clock,并且波特率设置正确了,之后就可以正常发送数据了,用CAN分析仪可以正常接受数据,但是从CAN分析仪发送数据到MCU,用示波器测试MCU的can_rx引脚是有波形的,但是就无法进入CAN接受中断,所以无法接受数据,用的都是Demo
- Re: FRDM-KE06Z 无法接受CAN数据
Xi Yang 2014-11-27 下午8:33 (回复 明强 林) Hi,
1. Can you verify CAN RX frame's baud rate, type ID and data is all OK by CAN analyzer?
2. If so, I think it's frame ID matching issue. please check Rx accept ID in code.
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-11-27 下午8:39 (回复 Xi Yang) 我的想法是这样的,rx有波形输出,那不管MCU能不能正确的接受到完整的一帧数据,至少是可以进入接受中断的,但是我发现一直进不去接受中断,
- Re: FRDM-KE06Z 无法接受CAN数据
Xi Yang 2014-11-27 下午8:43 (回复 明强 林) No, MCU can only generate interrupt on arriving CAN frame's ID is matching with CAN module's ID filter.
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-11-27 下午8:54 (回复 Xi Yang) 如果我用Demo里面的程序,CAN分析仪发送给MCU的CAN ID 是任意的么?还是只能是其中的莫几个ID呢?
- Re: Re: FRDM-KE06Z 无法接受CAN数据
Jingjing Zhou 2014-12-2 上午1:58 (回复 明强 林) Hi 明强林,
关于KE06的KEIL CAN中断代码,我已经修改了下,现在能够正确中断发送接收,波特率修改为100kbps,代码工程请查看附件。
关于CAN分析仪发给KE06,ID要求默认设置为0x00000000.

如果还有问题,欢迎继续交流。
Have a great day,
Jingjing
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-12-2 下午7:37 (回复 Jingjing Zhou) 你好,我今天重新看了一下原始的CAN驱动代码,发现中断配置应该是没问题的,只要我们改到正确的波特率之后,是可以接受到CAN分析仪发送过来的ID数据的,但是只能接受ID:0X00000000,其他ID无法接受,所以我们现在的问题应该是;如何设置成可以接受任意ID数据。
- Re: Re: FRDM-KE06Z 无法接受CAN数据
Jingjing Zhou 2014-12-2 下午11:00 (回复 明强 林) Hi 明强 林,
其实代码还可以接受0x802以及0x803的扩展帧ID。
如果你要接收任意ID数据,就设置屏蔽寄存器为接收任意ID,被代码中:
| sMSCANConfig.u32IDMR0 = (CAN_IDMR0); | sMSCANConfig.u32IDMR1 = (CAN_IDMR1);
这两行给替换为如下两行:
| sMSCANConfig.u32IDMR0 = 0xffffffff; | sMSCANConfig.u32IDMR1 = 0xffffffff;
这样所有的ID都可以接受。
Have a great day,
Jingjing
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-12-2 下午11:45 (回复 Jingjing Zhou) 你好,我按照你说的那样把这四个寄存器改成了这样:
sMSCANConfig.u32IDAR0 = (0xffffffff);
sMSCANConfig.u32IDAR1 = (0xffffffff);
sMSCANConfig.u32IDMR0 = (0xffffffff);
sMSCANConfig.u32IDMR1 = (0xffffffff);
发现是可以接受任意ID,但是发现只有接受到扩展帧的时候才可以完整的接受到ID,接受标准帧是无法完整接受ID,我是按照这样来打印接受到的ID的
printf("ID is 0x%x!\r\n",sRxFrameInfo.ID_Type);
printf("ID1 is 0x%x!\r\n",sRxFrameInfo.ID_Type.ID);
printf("ID2 is 0x%x!\r\n",sRxFrameInfo.ID_Type.StandID);
printf("ID3 is 0x%x!\r\n",sRxFrameInfo.ID_Type.ExtID);
- Re: FRDM-KE06Z 无法接受CAN数据
明强 林 2014-12-3 上午12:39 (回复 Jingjing Zhou) 你好,我最后改成这样的版本:
sMSCANConfig.u32IDAR0 = (0xffffffff);
sMSCANConfig.u32IDAR1 = (0xffffffff);
sMSCANConfig.u32IDMR0 = (0xffffffff);
sMSCANConfig.u32IDMR1 = (0xffffffff);
关于接受扩展帧和标准帧的改成这样:
(在函数uint8_t CAN_ReadOneFrameFromBuff(MSCAN_Type *pCANx,MSCAN_FramePtr pRxFrame)里面)
if(pRxFrame->bIsExtOrStand)//扩展帧
{
pRxFrame->ID_Type.ExtID.EID28_21 = CAN_ReadIDR0Reg(pCANx);
pRxFrame->ID_Type.ExtID.EID20_18 = sIDR1.IDR1.EID20_18_OR_SID2_0;
pRxFrame->ID_Type.ExtID.EID17_15 = sIDR1.IDR1.EID17_15;
pRxFrame->ID_Type.ExtID.EID14_7 = CAN_ReadIDR2Reg(pCANx);
pRxFrame->ID_Type.ExtID.EID6_0 = sIDR3.IDR3.EID6_0;
}
else//标准帧
{
pRxFrame->ID_Type.StandID.EID2_0 = sIDR1.IDR1.EID20_18_OR_SID2_0;
pRxFrame->ID_Type.StandID.EID10_3 = CAN_ReadIDR0Reg(pCANx);
}
不知道这样改可不可取?或者你有更好的解决方法。
- Re: Re: FRDM-KE06Z 无法接受CAN数据
Jingjing Zhou 2014-12-8 上午6:11 (回复 明强 林) 你好!不好意思,回复迟了。
这样定义是可以的。
就是你需要在程序中设置下,接收是扩展ID还是标准ID。
Have a great day,
Jingjing
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
|