控诉Infineon歧视XMC1402!!
XMC1402有两路MultiCAN+,然而DAVE4.4.2的XMC1402预设中,CAN_NODE App并没有对1402支持。这好吗?这不好。能用软件解决的问题绝不改硬件,这是半桶水工程师的倔强!
硬件是XMC1402T038X0128,DAVE版本4.4.2,CAN_NODE App版本4.1.20。下面开始操作
====================================
1、新建1402的DAVE CE工程A,再新建一个1404的DAVE CE工程B。在A中添加一个Clock_XMC App,生成代码。在B中添加CAN_NODE App,配置一下参数也可以之后手动配。默认情况下CAN_NODE App是自带的,如果没有可以在下图处安装或者更新到最新版本。
添加App后自动生成代码,接着将B中工程文件夹下的DAVE-Generated-CAN_NODE和GLOBAL_CAN复制到A的相同位置。可在DAVE中直接进行复制粘贴操作。
注:这里如果只添加一个CAN_NODE,DAVE会自动选择到CAN1下的RXDH组合,即P1.3接收,P1.2发送的模式,这是由NPCRx寄存器的RXSEL位决定的,具体的写入位置在can_node_conf.c中,CAN_NODE0结构体下的rx_signal属性,它为7,即111B。
====================================
2、现在表面上看,两个工程都一样了,但还需要一些代码的改动。首先是DAVE.h中加入can相关头文件
#include "GLOBAL_CAN/global_can.h"
#include "CAN_NODE/can_node.h"
接着DAVE.c中加入can初始化代码段
if (init_status == DAVE_STATUS_SUCCESS)
{
/** Initialization of CAN_NODE APP instance CAN_NODE_0 */
init_status = (DAVE_STATUS_t)CAN_NODE_Init(&CAN_NODE_0);
}
这时编译,global_can.h中会报错,来源是在xmc_can.h中声明的各种变量和结构体都未定义,说明xmc_can.h并没有被编译,但这个头文件是被包含在工程路径中的,所以这种情况大概率是#if相关的原因。打开xmc_can.h,注意105行的#if defined(CAN),这个CAN在工程A中是无法跳转的。转到工程B,发现在XMC1400.h的8832行:
#if (UC_DEVICE == XMC1403) || (UC_DEVICE == XMC1404)
#define CAN ((CAN_GLOBAL_TypeDef *) CAN_BASE)
1402气抖冷。从A工程中打开XMC1400.h(位置是\Libraries\CMSIS\Infineon\XMC1400_series\Include),给他加入1402成为:
#if (UC_DEVICE == XMC1403) || (UC_DEVICE == XMC1404) || (UC_DEVICE == XMC1402)
#define CAN ((CAN_GLOBAL_TypeDef *) CAN_BASE)
文件比较大,搜索一下“1403”就能直接跳到8832行。
这时编译,xmc_can.h中的变量不再未定义了,但在354行还有个错误是#if !defined(MULTICAN_PLUS)相关的。故技重施,发现xmc_device.h中,XMC1402全系设备都没有#define MULTICAN_PLUS的定义,1402再次受到迫害。这个头文件位置在\Libraries\XMCLib\inc。在A工程对应设备中加入这一句。
做完以上改动之后,就能编译成功了!还没有进行实验,若有问题再更新。