FRDM-KE06Z 无法接受CAN数据

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FRDM-KE06Z 无法接受CAN数据

11,912 Views
明强林
Contributor II

板子用的是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)是有信号的

Labels (1)
Tags (2)
23 Replies

9,564 Views
tianshenglin
Contributor II

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分析仪一直显示发送失败!!不知道哪里出了问题,请帮忙看一下,如下图

pastedImage_2.png

配置也是按照上面的帖子更改过来了的,如下图:

pastedImage_3.png

波特率更改拍配置如下:

pastedImage_4.png

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你参考这个帖子,用我最近修改后的代码吧:

手把手学会官方例程第三十篇:KE06 MSCAN_node1_demo例 ...

另外,你分析仪提示发送失败,是不是你分析仪加分析软件那边有问题呢?

你之前能成功发送吗?

9,564 Views
tianshenglin
Contributor II

谢谢楼上的分享啊,CAN现在可以的了!!只是能不能把串口部分也加进来啊,目前我也用到这部分!!

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

里面本身就带有串口打印的功能。

你自行看看代码,代码中的printf就是通过KE06的虚拟串口打印出来的。

9,564 Views
tianshenglin
Contributor II

您好,谢谢您的回复!!我KE06的程序用在KEAZ1284的demo板子上面跑,KEAZ1284是UART2,所以要改过来。但是我不知道在哪里更改。自己写了几个,也没能实现。所以想问一下,在哪里更改。谢谢啊!!

0 Kudos

9,565 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你参考我给你的例程,在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中。

9,564 Views
tianshenglin
Contributor II

谢谢您!我重新定义了UART2,可以收到初始化信息。但是用分析仪发送数据话,串口打印不出来。

按照我的你理解,你是说把 UART_Init()函数放到uart.c,uart.h中?但是uart.c,uart.h中本来就有 UART_Init()呀?

既然这样我也没见你把void UART_InitPrint(void)放到初始化函数 UART_Init()中呀?

我不明白“然后UART初始化代码加到uart.c,uart.h中” 这句话是什么意思,还请楼主明示啊。

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你到与非网发个帖子吧:飞思卡尔FAE线上技术支持 - 飞思卡尔技术社区 - 手机版 - Powered by Discuz!

,我们在你新的帖子中讨论。

尽量不要跟在别人已结贴后面。

0 Kudos

9,564 Views
tianshenglin
Contributor II

谢谢您,我的这个问题解决了!!

0 Kudos

9,565 Views
alex_yang
NXP Employee
NXP Employee

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:

  1. #define BAUD_RATE_CLOCK in mscan.h should be BUS_CLK_HZ.
  2. #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.

0 Kudos

9,564 Views
明强林
Contributor II

你好,最原始的的Demo是无法发送和接受数据的,因为波特率设置不对,这个问题你也知道了,我已经改成了选择 the bus clock,并且波特率设置正确了,之后就可以正常发送数据了,用CAN分析仪可以正常接受数据,但是从CAN分析仪发送数据到MCU,用示波器测试MCU的can_rx引脚是有波形的,但是就无法进入CAN接受中断,所以无法接受数据,用的都是Demo

0 Kudos

9,565 Views
alex_yang
NXP Employee
NXP Employee

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.

0 Kudos

9,564 Views
明强林
Contributor II

我的想法是这样的,rx有波形输出,那不管MCU能不能正确的接受到完整的一帧数据,至少是可以进入接受中断的,但是我发现一直进不去接受中断,

0 Kudos

9,564 Views
alex_yang
NXP Employee
NXP Employee

No, MCU can only generate interrupt on arriving CAN frame's ID is matching with CAN module's ID filter.

0 Kudos

9,564 Views
明强林
Contributor II

如果我用Demo里面的程序,CAN分析仪发送给MCU的CAN ID 是任意的么?还是只能是其中的莫几个ID呢?

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi 明强林,

    关于KE06的KEIL CAN中断代码,我已经修改了下,现在能够正确中断发送接收,波特率修改为100kbps,代码工程请查看附件。

    关于CAN分析仪发给KE06,ID要求默认设置为0x00000000.

pastedImage_0.png

    如果还有问题,欢迎继续交流。


Have a great day,
Jingjing

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

9,564 Views
明强林
Contributor II

你好,我今天重新看了一下原始的CAN驱动代码,发现中断配置应该是没问题的,只要我们改到正确的波特率之后,是可以接受到CAN分析仪发送过来的ID数据的,但是只能接受ID:0X00000000,其他ID无法接受,所以我们现在的问题应该是;如何设置成可以接受任意ID数据。

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

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!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

9,564 Views
明强林
Contributor II

你好,我最后改成这样的版本:

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);

}‍

不知道这样改可不可取?或者你有更好的解决方法。

0 Kudos

9,564 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你好!不好意思,回复迟了。

这样定义是可以的。

就是你需要在程序中设置下,接收是扩展ID还是标准ID。


Have a great day,
Jingjing

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos