板子用的是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)是有信号的
hi,大家好!我也遇到了同样的问题,目前手上有一块KEAZ1284的demo板子,不过我是用KE06的demo程序在调试,其他的模块差不多都调通了,现在就剩下CAN这一块卡壳了。目前我把SIM->PINSEL1 |= SIM_PINSEL1_MSCANPS_MASK,改成了 SIM->PINSEL1 |= 0<<16,因为KEAZ1284demo原理图是接的。KEAZ1284手册 也是这么规定0: CAN_TX on PTC7, CAN_RX on PTC6,但是USBCAN-2I分析仪一直显示发送失败!!不知道哪里出了问题,请帮忙看一下,如下图
配置也是按照上面的帖子更改过来了的,如下图:
波特率更改拍配置如下:
你参考这个帖子,用我最近修改后的代码吧:
手把手学会官方例程第三十篇:KE06 MSCAN_node1_demo例 ...
另外,你分析仪提示发送失败,是不是你分析仪加分析软件那边有问题呢?
你之前能成功发送吗?
谢谢楼上的分享啊,CAN现在可以的了!!只是能不能把串口部分也加进来啊,目前我也用到这部分!!
里面本身就带有串口打印的功能。
你自行看看代码,代码中的printf就是通过KE06的虚拟串口打印出来的。
您好,谢谢您的回复!!我KE06的程序用在KEAZ1284的demo板子上面跑,KEAZ1284是UART2,所以要改过来。但是我不知道在哪里更改。自己写了几个,也没能实现。所以想问一下,在哪里更改。谢谢啊!!
你参考我给你的例程,在sysinit.c里面有:
void UART_InitPrint(void)
{
UART_ConfigType sConfig;
sConfig.u32SysClkHz = BUS_CLK_HZ;
sConfig.u32Baudrate = UART_PRINT_BITRATE;
UART_Init (TERM_PORT, &sConfig);
}
并且在sysinit函数中调用void UART_InitPrint(void),你可以把你的串口定义为:
#define TERM_PORT UART2
然后UART初始化代码加到uart.c,uart.h中。
谢谢您!我重新定义了UART2,可以收到初始化信息。但是用分析仪发送数据话,串口打印不出来。
按照我的你理解,你是说把 UART_Init()函数放到uart.c,uart.h中?但是uart.c,uart.h中本来就有 UART_Init()呀?
既然这样我也没见你把void UART_InitPrint(void)放到初始化函数 UART_Init()中呀?
我不明白“然后UART初始化代码加到uart.c,uart.h中” 这句话是什么意思,还请楼主明示啊。
谢谢您,我的这个问题解决了!!
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.
你好,最原始的的Demo是无法发送和接受数据的,因为波特率设置不对,这个问题你也知道了,我已经改成了选择 the bus clock,并且波特率设置正确了,之后就可以正常发送数据了,用CAN分析仪可以正常接受数据,但是从CAN分析仪发送数据到MCU,用示波器测试MCU的can_rx引脚是有波形的,但是就无法进入CAN接受中断,所以无法接受数据,用的都是Demo
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.
我的想法是这样的,rx有波形输出,那不管MCU能不能正确的接受到完整的一帧数据,至少是可以进入接受中断的,但是我发现一直进不去接受中断,
No, MCU can only generate interrupt on arriving CAN frame's ID is matching with CAN module's ID filter.
如果我用Demo里面的程序,CAN分析仪发送给MCU的CAN ID 是任意的么?还是只能是其中的莫几个ID呢?
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!
-----------------------------------------------------------------------------------------------------------------------
你好,我今天重新看了一下原始的CAN驱动代码,发现中断配置应该是没问题的,只要我们改到正确的波特率之后,是可以接受到CAN分析仪发送过来的ID数据的,但是只能接受ID:0X00000000,其他ID无法接受,所以我们现在的问题应该是;如何设置成可以接受任意ID数据。
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!
-----------------------------------------------------------------------------------------------------------------------
你好,我最后改成这样的版本:
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);
}
不知道这样改可不可取?或者你有更好的解决方法。
你好!不好意思,回复迟了。
这样定义是可以的。
就是你需要在程序中设置下,接收是扩展ID还是标准ID。
Have a great day,
Jingjing
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------