1、刚拿到TC27T开发板时,是比较兴奋的,开发板是一块红色的正方形板卡,板子布局简洁干净。感觉板卡上遗憾的地方,按键和指示灯放在了板卡背面,给操作和指示带来些不便,还有板卡上封装丝印没有明显印在板卡上,在扩展外部接口连接时要特别小心,不然很容易弄错脚位,给调试带来麻烦,甚至把板卡弄坏,所以接下来要先认真仔细地看开发板的介绍资料。
接着简单熟悉开发板使用说明文档,开发板上的资源,包括各个器件资料,特别是主芯片TC275相关。TC27T开发板主要包括以下功能:
1)英飞凌TC275T 32位多核控制器,包含三个核,其中两个TriCore 1.6P核(一个带锁步核)和一个TriCore1.6E 核(带锁步核),三核主频200Mhz,编程FLASH 4MB,内嵌HSM,芯片功能安全可以达到ASIL-D;
2)电源模块。包括主电源芯片TLE7368-3E及组件,给系统和其他模块提供5V和3.3V电压,另MCU内部电源转换产生1.3V核电压;
3)USB MiniWiggler JDS 调试接口;
4)CAN通信模块,包括CAN收发器和扩展连接器;
5)LIN通信模块,包括LIN收发器和宽展连接器;
6)蜂鸣器及驱动电路;
7)GPIO和ADC扩展接口;
8)按键输入模块;
9)LED指示模块;
10)JTAG扩展接口;
11)DAP调试扩展接口;
12)普通以太网接口,包含千兆PHY芯片和RJ45连接器。
这次申请的DEMO学习演示主要会用到TC275的USB MiniWiggler JDS调试模块,GPIO和ADC,CAN通信,按键,LED和蜂鸣器等,实现了环境温湿度信息采集,状态监控,报警及信息上报等功能。
2、部分代码简单介绍如下:
基于英飞凌iLLD库进行集成,主要用到的模块和函数介绍如下。
1) GPIO模块
//存储引脚电平状态
boolean IfxPort_getPinStateDio[5];
void Dio_init_input(void)
{
// 配置热释电1信号采集引脚P2.6为输入,上拉
IfxPort_setPinMode(&MODULE_P02,6,IfxPort_Mode_inputPullUp); //X103连接器 PIN_19
}
void Dio_init_output(void)
{
// 配置蜂鸣器驱动引脚P33.0为输出,上拉
IfxPort_setPinMode(&MODULE_P33,0, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinHigh(&MODULE_P33,0); //默认禁能
// 配置监控主机驱动控制引脚P14.9为输出,上拉
IfxPort_setPinMode(&MODULE_P14,9, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinLow(&MODULE_P14,9);//默认禁能
}
void DIO_State_Read(void)
{
//读取热释电1信号
IfxPort_getPinStateDio[0] = IfxPort_getPinState(&MODULE_P02, 6);
}
2) LED模块介绍
void GPIO_Led_init(void)
{
// configure P33.8 as general output
IfxPort_setPinMode(&MODULE_P33,8, IfxPort_Mode_outputPushPullGeneral);
// configure P33.9 as general output
IfxPort_setPinMode(&MODULE_P33,9, IfxPort_Mode_outputPushPullGeneral);
// configure P33.10 as general output
IfxPort_setPinMode(&MODULE_P33,10, IfxPort_Mode_outputPushPullGeneral);
// configure P33.11 as general output
IfxPort_setPinMode(&MODULE_P33, 11, IfxPort_Mode_outputPushPullGeneral);
}
void GPIO_Led(void)
{
IfxPort_togglePin(&MODULE_P33, 8);
IfxStm_waitTicks(&MODULE_STM0, 5000000);
IfxPort_togglePin(&MODULE_P33, 9);
IfxStm_waitTicks(&MODULE_STM0, 5000000);
IfxPort_togglePin(&MODULE_P33, 10);
IfxStm_waitTicks(&MODULE_STM0, 5000000);
IfxPort_togglePin(&MODULE_P33, 11);
IfxStm_waitTicks(&MODULE_STM0, 5000000);
}
3) 蜂鸣器模块
//蜂鸣器报警
void Beep_On(void)
{
int i;
for(i=0;i<10000;i++)
{
IfxPort_setPinLow(&MODULE_P33,0);
IfxStm_waitTicks(&MODULE_STM0, 50000);
IfxPort_setPinHigh(&MODULE_P33,0);
IfxStm_waitTicks(&MODULE_STM0, 50000);
IfxPort_setPinLow(&MODULE_P33,0);
IfxStm_waitTicks(&MODULE_STM0, 50000);
IfxPort_setPinHigh(&MODULE_P33,0);
IfxStm_waitTicks(&MODULE_STM0, 50000);
}
}
//蜂鸣器报警禁能
void Beep_Off(void)
{
IfxPort_setPinHigh(&MODULE_P33,0);
}
4) CAN通信模块
//定义全局变量
IfxMultican_Message txMsg;
uint32 dataLow = 0x03020100;
uint32 dataHigh = 0x07060504;
const unsigned id=0xcf00203;//定义扩展ID
extern uint32 dataLow;
extern uint32 dataHigh;
extern IfxMultican_Message txMsg;
//CAN handle
IfxMultican_Can can;//指向全CAN的模块地址
//Nodes handles
IfxMultican_Can_Node canSrcNode;//指向节点寄存器地址
//Message Object handles
IfxMultican_Can_MsgObj canSrcMsgObj;//指向消息体寄存器地址
//通道、节点、报文的初始化
void CAN_Init(void)
{
//CAN模块初始化 //CAN配置结构体
IfxMultican_Can_Config canConfig;
IfxMultican_Can_initModuleConfig(&canConfig, &MODULE_CAN);
IfxMultican_Can_initModule(&can, &canConfig);
//CAN节点初始化//CAN节点配置结构体
IfxMultican_Can_NodeConfig canNodeConfig;
IfxMultican_Can_Node_initConfig(&canNodeConfig, &can);
canNodeConfig.baudrate = 1000000;//波特率设为1M
//CAN源节点
{
canNodeConfig.nodeId = IfxMultican_NodeId_0;
canNodeConfig.rxPin =&IfxMultican_RXD0B_P20_7_IN;//P20.7作为输入引脚
canNodeConfig.rxPinMode = IfxPort_InputMode_pullUp;
canNodeConfig.txPin = &IfxMultican_TXD0_P20_8_OUT;//P20.8作为输出引脚
canNodeConfig.txPinMode = IfxPort_OutputMode_pushPull;
// 源节点初始化
IfxMultican_Can_Node_init(&canSrcNode,&canNodeConfig);
}
//Message Object Initialisation
{
// 创建报文对象配置
IfxMultican_Can_MsgObjConfig canMsgObjConfig;
IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &canSrcNode);
// 分配报文对象
canMsgObjConfig.msgObjId = 0;
canMsgObjConfig.messageId = id;//消息ID
canMsgObjConfig.acceptanceMask =0x7FFFFFFFUL;
canMsgObjConfig.frame = IfxMultican_Frame_transmit;
canMsgObjConfig.control.messageLen=IfxMultican_DataLengthCode_8;//数据长度
canMsgObjConfig.control.extendedFrame = TRUE;//扩展帧帧格式
canMsgObjConfig.control.matchingId = TRUE;//匹配ID
// 初始化报文对象
IfxMultican_Can_MsgObj_init(&canSrcMsgObj, &canMsgObjConfig);
}
}
//上面已经把通道 、节点、报文配置好了,下面开始收发
void CAN_Trannsfer(void)
{
//全CAN报文初始化
IfxMultican_Message_init(&txMsg,id,dataLow,dataHigh, IfxMultican_DataLengthCode_8);//数据的高低位,低位在前,高位在后
//发送数据
while(IfxMultican_Can_MsgObj_sendMessage(&canSrcMsgObj, &txMsg)==IfxMultican_Status_notSentBusy);
}
5) ADC采集模块
// VADC模块
IfxVadc_Adc vadc;
// VDC 组//选择ADC0转换器
IfxVadc_Adc_Group adcGroup[1];
// VDC 通道//选择AN0和AN1分别作为温度和湿度传感器输入通道
IfxVadc_Adc_Channel adcChannel[1][2];
// 存储转换结果
uint16 ADC_result[1][2];
void ADC_init(void)
{
int chnIx;
// 创建配置变量
IfxVadc_Adc_Config adcConfig;
IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);
//初始化ADC模块全局参数,采样周期和结果精度
IfxVadc_Adc_initModule(&vadc, &adcConfig);
// 创建组配置变量
IfxVadc_Adc_GroupConfig adcGroupConfig;
IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &vadc);
//初始化Convertor0的 AN0和AN1通道
int group_i = 0;
for(group_i = 0; group_i<1;group_i++)
{
// 定义组ID
adcGroupConfig.groupId = group_i;
// 设置Master ID为自己的ID,即自己作为Master
adcGroupConfig.master = adcGroupConfig.groupId;
// 使能队列中断源
adcGroupConfig.arbiter.requestSlotQueueEnabled = TRUE;
// 使能扫描中断源
adcGroupConfig.arbiter.requestSlotScanEnabled = TRUE;
// 使能后台中断源
adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;
//使能所有源的门
adcGroupConfig.queueRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
adcGroupConfig.scanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
// 初始化组配置
IfxVadc_Adc_initGroup(&adcGroup[group_i], &adcGroupConfig);
// 创建通道配置变量
IfxVadc_Adc_ChannelConfig adcChannelConfig[2];
for(chnIx=0; chnIx<2; ++chnIx)
{
IfxVadc_Adc_initChannelConfig(&adcChannelConfig[chnIx], &adcGroup[group_i]);
//配置通道ID
adcChannelConfig[chnIx].channelId = (IfxVadc_ChannelId)(chnIx);
//配置通道结果寄存器,采用专用结果寄存器
adcChannelConfig[chnIx].resultRegister = (IfxVadc_ChannelResult)(chnIx);
// 初始化通道
IfxVadc_Adc_initChannel(&adcChannel[group_i][chnIx], &adcChannelConfig[chnIx]);
//添加到扫描源
unsigned channels = (1 << adcChannelConfig[chnIx].channelId);
unsigned mask = channels;
boolean continuous = TRUE;
IfxVadc_Adc_setScan(&adcGroup[group_i],channels,mask, continuous);
}
}
}
void ADC_Scan(void)
{
int group_m;
unsigned char chnIx;
Ifx_VADC_RES conversionResult;
for (group_m = 0; group_m < 1; group_m++)
{
// 开启自动扫描
IfxVadc_Adc_startScan(&adcGroup[group_m]);
// 判断转换结果是否 有效,然后读取转换结果
for (chnIx = 0; chnIx < 2; ++chnIx)
{
// wait for valid result
//Ifx_VADC_RES conversionResult;
do {
conversionResult = IfxVadc_Adc_getResult(
&adcChannel[group_m][chnIx]);
} while (!conversionResult.B.VF);
ADC_result[group_m][chnIx] = conversionResult.B.RESULT;
}
}
}
6) MAIN主程序
int core0_main (void)
{
//使能中断
__enable ();
//看门狗禁能
/*
* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
* Enable the watchdog in the demo if it is required and also service the watchdog periodically
* */
IfxScuWdt_disableCpuWatchdog (IfxScuWdt_getCpuWatchdogPassword ());
IfxScuWdt_disableSafetyWatchdog (IfxScuWdt_getSafetyWatchdogPassword ());
//变量初始化
dataLow = 0x0;
dataHigh = 0x0;
//模块初始化
GPIO_Led_init();
CAN_Init();
ADC_init();
Dio_init_input();
Dio_init_output();
while (1)
{
//LED点亮
GPIO_Led();
//ADC模块扫描
ADC_Scan();
//查询读取IO状态
DIO_State_Read();
//热释电传感器模块采集到人红外信号有效
if(IfxPort_getPinStateDio[0]==0)
{
//打开摄像头主机开始录像
Camera_On();
dataLow = 0xeeeeeeee;
dataHigh = 0xeeeeeeee;
//上报有人异常信息
CAN_Trannsfer();
//蜂鸣器报警
Beep_On();
}
//热释电传感器模块没采集到人红外信号
else
{
//关闭摄像头主机
Camera_Off();
//蜂鸣器不报警
Beep_Off();
//上报温湿度信息
dataLow = (uint32)ADC_result[0][0];
dataHigh = (uint32)ADC_result[0][1];
CAN_Trannsfer();
}
}
return (1);
}
3、遇到的问题与对策
开发集成工具Hightec安装,工程项目搭建和调试中遇到的问题。
AURIX开发集成环境熟悉,包括Framework基本软件架构,开发工具使用,调试仿真环境熟悉。首先完成点灯例程的实现工程编辑,编译,调试配置,下载,运行等基本开发步骤,如果顺利运行,会看到板卡背面的四颗LED交替闪烁,初步验证了板卡是完好的。因为英飞凌这套新的环境,之前没有接触过,所以这期间工具安装,环境参数设置及后续工程中编译排查报错等问题折腾了一阵子。如Hightec编译器工具链配置编译CfgCompiler_xxx.MK文件路径和实际安装路径不一致,就得去修改为实际的安装路径;如编译器默认的没有选择GNUC,就要去工具链编译配置ConfigPrjMK文件中去选择GNUC;如编译过程中出现无法找到文件的错误,就得去设置窗口菜单Include Paths中去设置添加需要增加的相关文件包含路径。
在调试GPIO采集热释电信号时发现采集不到正确的信号,经过排查P2.6引脚,测量热释电模块输出有效信号引脚电压高电平时为3.3V电平,这个电平给到P2.6端口,因为TC275开发板上默认的为5V电平,所以TC275不能正确采集信号输入,经过3.3V和5V电平转换电路后就可以正确采集输入。
在调试ADC模块采集温湿度外界变化信息时,经过单步跟踪仿真运行发现采集到的结果值没有变化,经过排查温湿度模块输出连接TC275板卡时,连接AN0,AN1引脚有误,
板卡丝印没标很容易把X103和X102整错,经重新连接到正确的AN0和AN1引脚,采集后的数据经过计算其结果和实际比较符合。当然还有其它调试中遇到的问题就不一一列举了。
4、DEMO简单介绍
本DEMO以TC275T开发板为控制核心,扩展输入采集板部分包括:热释电红外传感器模块SR602及其电平转换电路,温湿度传感器模块AM1011及其采集辅助电路。输出部分一是可以通过CAN 分析仪CANalyst-II将采集处理后的信息数据上报到PC端。二是可以控制视频主机系统完成监控记录功能,主机系统包括:视频监控控制板及电路、视频监控主机和多路摄像头,三是控制蜂鸣器报警。
整个DEMO实物如下: