TC275 Multican代码示例

注:此代码可以直接使用
core0_main文件

int core0_main(void)
{
    /*
     * !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdog in the demo if it is required and also service the watchdog periodically
     * */


    /* Initialise the application state */
    

    /* Enable the global interrupts of this CPU */
    IfxCpu_enableInterrupts();
     GPIO_init();
    /* Demo init */
    //IfxStmDemo_init();
    CAN_int();
    /* background endless loop */
    while (TRUE)
    {

  // 	IfxStm_waitTicks(&MODULE_STM0, 20000000);
	//  IfxPort_togglePin(&MODULE_P33,0);

    	CAN_TEST();



		// IfxPort_setGroupState(&MODULE_P33, 0, 0xff,  rec.Data[0]);//读出送到8位LED显示


    }

    return 0;
}
``

can.c文件

 * can.c文件
 *
 *  Created on: 2020年6月9日
 *      Author: 在路上
 */


//注意:需要配置启动时钟为ILLD包自带时钟,不能使用hightec自带启动文件!!!否则波特率可能配置有问题!!!


#include "can.h"

IfxMultican_Can  can;
IfxMultican_Can_Node   can0NODE;
IfxMultican_Can_MsgObjConfig canMsgObjConfig;

IfxMultican_Can_MsgObj can0TxMsgObj0_EXT;                    //扩展发送
IfxMultican_Can_MsgObj can0TxMsgObj0_STD ;                   //标准发送
IfxMultican_Can_MsgObj can0RxMsgObj0;                             //接收

//CanRxMsg  rec;


volatile    CanRxMsg  rec;                          //需要加关键词volatile防止编译器优化,调试很久,找出原因!!!

int a[8]={0,0x1,0x2,0x3,0x4,0x5,0x6,0x07};

IFX_INTERRUPT(Can0RxISR, 0, IFX_INTPRIO_CAN0_RX )
{

	IfxMultican_Message  receive  ;


	//接收IDE位
    IfxMultican_MsgObjId objId;

    if (can0RxMsgObj0.msgObjCount > 1)
    {

        objId =can0RxMsgObj0.fifoPointer;
    }
    else
    {

        objId = can0RxMsgObj0.msgObjId;
    }
	Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(can0RxMsgObj0.node->mcan, objId);

	rec.IDE=hwObj->AR.B.IDE;


	//接收data
	IfxMultican_Can_MsgObj_readMessage(&can0RxMsgObj0,&receive);

    int m,n;
     for(m=0;m<2;m++)
     {
    	 for(n=0;n<4;n++)
    	 {
    		 rec.Data[n+m*4]=(receive.data[m]>>(8*n))&(0xFF);
    	 }
     }

     rec.DLC=receive.lengthCode;
     rec.ID=receive.id;

}


void CAN_int(void)
{
	 IfxMultican_Can_Config  canConfig;
	 IfxMultican_Can_NodeConfig canNodeConfig;

	 IfxMultican_Can_initModuleConfig(&canConfig, &MODULE_CAN);

	 canConfig.nodePointer[1].priority=IFX_INTPRIO_CAN0_RX;                       //需要配置接收中断服务请求节点
	 canConfig.nodePointer[1].typeOfService=IfxSrc_Tos_cpu0;

	 IfxMultican_Can_initModule(&can, &canConfig);                  //模块全局初始化     时钟来源spb,100MHZ


	 {
		IfxMultican_Can_Node_initConfig(&canNodeConfig, &can);
		canNodeConfig.baudrate=500000;                    //500 kBaud
		canNodeConfig.nodeId=IfxMultican_NodeId_0;         //节点0

		canNodeConfig.rxPin = &IfxMultican_RXD0B_P20_7_IN;                             //配置P20_7和P20_8为can节点0引脚
		canNodeConfig.rxPinMode = IfxPort_InputMode_pullUp;
		canNodeConfig.txPin = &IfxMultican_TXD0_P20_8_OUT;
		canNodeConfig.txPinMode = IfxPort_OutputMode_pushPull;

		IfxMultican_Can_Node_init  (&can0NODE, &canNodeConfig);                                     //CAN节点配置
	 }


	{             //标准帧消息对象配置
		IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &can0NODE);

		 canMsgObjConfig.messageId = 0x100;             //可忽略
		 canMsgObjConfig.acceptanceMask = 0x7FFFFFFFUL;
		 canMsgObjConfig.frame = IfxMultican_Frame_transmit;
		 canMsgObjConfig.control.messageLen = IfxMultican_DataLengthCode_8;
		 canMsgObjConfig.control.extendedFrame = FALSE;
		 canMsgObjConfig.control.matchingId = TRUE;

		canMsgObjConfig.msgObjId                         = TRANSMIT_OBJID;
		canMsgObjConfig.msgObjCount                      = TRANSMIT_FIFO_SIZE;

		IfxMultican_Can_MsgObj_init(&can0TxMsgObj0_STD,&canMsgObjConfig);                     //消息对象发送配置

	}



	{          //扩展帧消息对象配置
		IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &can0NODE);

		 canMsgObjConfig.messageId = 0x100;                                //可忽略
		 canMsgObjConfig.acceptanceMask = 0x7FFFFFFFUL;
		 canMsgObjConfig.frame = IfxMultican_Frame_transmit;
		 canMsgObjConfig.control.messageLen = IfxMultican_DataLengthCode_8;
		 canMsgObjConfig.control.extendedFrame = TRUE;
		 canMsgObjConfig.control.matchingId = TRUE;

		canMsgObjConfig.msgObjId                         = TRANSMIT_OBJID+TRANSMIT_FIFO_SIZE+1;
		canMsgObjConfig.msgObjCount                      = TRANSMIT_FIFO_SIZE;

		IfxMultican_Can_MsgObj_init(&can0TxMsgObj0_EXT,&canMsgObjConfig);                     //消息对象发送配置

	}


	{                   //消息对象接收配置
		 IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &can0NODE);


		 canMsgObjConfig.messageId = 0X09;
		 canMsgObjConfig.acceptanceMask = 0;
		 canMsgObjConfig.frame = IfxMultican_Frame_receive;
		 canMsgObjConfig.control.messageLen = IfxMultican_DataLengthCode_8;
		 canMsgObjConfig.control.extendedFrame = TRUE;
		 canMsgObjConfig.control.matchingId = FALSE;

		 canMsgObjConfig.msgObjId                         = RECEIVE_OBJID;
		 canMsgObjConfig.msgObjCount                      = RECEIVE_FIFO_SIZE;

#if CAN1_RX0_INT_ENABLE
		 canMsgObjConfig.rxInterrupt.enabled =TRUE ;                                                             //接收中断是否使能
		 canMsgObjConfig.rxInterrupt.srcId = IfxMultican_SrcId_1;                                          //选择中断输出线INT_O0


#endif
		 IfxMultican_Can_MsgObj_init(&can0RxMsgObj0,&canMsgObjConfig);                      //消息对象接收配置

#if CAN1_RX0_INT_ENABLE
		 int i=0;
		 for(i=0;i<RECEIVE_FIFO_SIZE;i++)
		 {
		       IfxMultican_MsgObj_setReceiveInterrupt(&MODULE_CAN.MO[RECEIVE_OBJID+i+1], TRUE);
		       IfxMultican_MsgObj_setReceiveInterruptNodePointer(&MODULE_CAN.MO[RECEIVE_OBJID+i+1],  canMsgObjConfig.rxInterrupt.srcId);

		 }
#endif

	}
}



void  can_send(CanRxMsg *message)
{

IfxMultican_Message msg;

 const unsigned dataLow = message->Data[0]|(message->Data[1]<<8)|(message->Data[2]<<16)|(message->Data[3]<<24);
 const unsigned dataHigh = message->Data[4]|(message->Data[5]<<8)|(message->Data[6]<<16)|(message->Data[7]<<24);

IfxMultican_Message_init(&msg,message->ID,  dataLow, dataHigh, message->DLC);
// Transmit Data
if(message->IDE)     //扩展为1 ;标准0
{
	while (IfxMultican_Can_MsgObj_sendMessage(&can0TxMsgObj0_EXT, &msg) == IfxMultican_Status_notSentBusy);
}
else
{
	while (IfxMultican_Can_MsgObj_sendMessage(&can0TxMsgObj0_STD, &msg) == IfxMultican_Status_notSentBusy);
}


}




void  CAN_TEST(void)
{
	CanRxMsg MES;
	int i=0;
	MES.ID=0x890;
	MES.IDE=1;
	MES.DLC=8;
   for( i=0;i<8;i++)
   {
	   MES.Data[i]=a[i];
   }
	can_send(&MES);

}



``

can.h 文件

 * can.h  文件
 *
 *  Created on: 2020年6月9日
 *      Author: 在路上
 */#ifndef CAN_H
#define CAN_H


#include "Multican/Can/IfxMultican_Can.h"
#include  "_Reg/IfxCan_regdef.h"
 #define IFX_INTPRIO_CAN0_RX  2
#define CAN1_RX0_INT_ENABLE 	1	       //1 启动接收中断        0 关闭接收中断

#define  TRANSMIT_OBJID      0                                     //发送标准对象  or  FIFO(基对象)

#define  TRANSMIT_FIFO_SIZE    3                      //fifo大小

#define  RECEIVE_FIFO_SIZE    3                      //fifo大小

#define  RECEIVE_OBJID      ( TRANSMIT_FIFO_SIZE+1)*2                                 //接收标准对象  or  FIFO(基对象)

typedef struct
{
	unsigned  long  ID;

	unsigned          char IDE;

	unsigned          char DLC;

	unsigned          char Data[8];

} CanRxMsg;

IFX_EXTERN volatile   CanRxMsg  rec;     //需要加关键词volatile防止编译器优化,调试很久,找出原因!!!

void CAN_int(void);

void  CAN_TEST(void);

void  can_send(CanRxMsg *message);


void test(void);

#endif /* 0_APPSW_TRICORE_DEMO_ILLD_CAN_H_ */
  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值