公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

TC275开发板学习心得(一)

TC275开发板学习心得(一)

Kay
Level 0
Level 0

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实物如下:


0 点赞
9169 次查看
22 评论