dsp28_ecan.c

来自「TMS320F2812 的 CAN 总线程序 变速箱电液换档程序的一个实例 」· C语言 代码 · 共 171 行

C
171
字号
//
//      TMDX ALPHA RELEASE
//      Intended for product evaluation purposes
//
//###########################################################################
//
// FILE:	DSP28_ECan.c
//
// TITLE:	DSP28 Enhanced CAN Initialization & Support Functions.
//
//###########################################################################
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  0.55| 06 May 2002 | L.H. | EzDSP Alpha Release
//  0.56| 20 May 2002 | L.H. | No change
//  0.57| 27 May 2002 | L.H. | No change
//###########################################################################

#include "DSP28_Device.h"


//---------------------------------------------------------------------------
// InitECan: 
//---------------------------------------------------------------------------
// This function initializes to a known state.
//
void InitECan(void)
{
	struct ECAN_REGS ECanaShadow;
  	int32 mid;
  	
	/*注:EALLOW保护的寄存器如下CANTIOC; CANRIOC; CANMC[15..9] & MCR[7..6]; 
	CANBTC; CANGIM; MIM[31..0]; TSC[31..0]; IOCONT1[3]; IOCONT2[3]。*/
	
	EALLOW;
	ECanaRegs.CANTIOC.all = 0x08;
	ECanaRegs.CANRIOC.all = 0x08;
	
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 1;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	do
	{
		ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 1);
	EDIS;
	
	EALLOW;
	/*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
	ECanaShadow.CANBTC.bit.BRP = 39;
	/*150/10=15*/
	ECanaShadow.CANBTC.bit.TSEG2 = 2;
	ECanaShadow.CANBTC.bit.TSEG1 = 10;
	ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
	
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 0;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	do
	{
		ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 0);
	EDIS;
	
	EALLOW;
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.SUSP = 1;
	ECanaShadow.CANMC.bit.MBNR = 0;
	//ECanaShadow.CANMC.bit.PDR = 0;
	//ECanaShadow.CANMC.bit.DBO = 0;
	ECanaShadow.CANMC.bit.WUBA = 0;
	ECanaShadow.CANMC.bit.CDR = 0;
	ECanaShadow.CANMC.bit.ABO = 0;
	ECanaShadow.CANMC.bit.SRES = 0;
	ECanaShadow.CANMC.bit.STM = 0;//NORMAL MODE
	ECanaShadow.CANMC.bit.SCM = 1;//SCM IS SCB
	ECanaShadow.CANMC.bit.DBO = 1;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
	ECanaRegs.CANRMP.all = 0xFFFFFFFF;
	
	EALLOW;
	ECanaRegs.CANMIM.all = 0xFFFFFFFF;
	ECanaRegs.CANMIL.all = 0;
	ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
	ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
	ECanaRegs.CANGIM.bit.I0EN = 1;
	ECanaRegs.CANGIM.bit.I1EN = 1;
	ECanaRegs.CANGIM.all = 0x3ff07;
	EDIS;
	
	
	/*发送邮箱的ID号*/
	ECanaRegs.CANME.all = 0;
	
	ECanaRegs.CANGAM.bit.AMI = 0;
	mid = 0x181;
	mid = mid<<18;
	ECanaMboxes.MBOX0.MID.all = mid;//0x80000181;
	mid = 0x281;
	mid = mid<<18;
	ECanaMboxes.MBOX1.MID.all = mid;
	mid = 0x381;
	mid = mid<<18;
	ECanaMboxes.MBOX2.MID.all = mid;
	mid = 0x481;
	mid = mid<<18;
	ECanaMboxes.MBOX3.MID.all = mid;

	/*接收邮箱的ID号*/
	ECanaMboxes.MBOX31.MID.all = 0x8CF00400;  //0x0CF00400 发动机转速
    ECanaMboxes.MBOX31.MDRL.all = 0; 
    ECanaMboxes.MBOX31.MDRH.all = 0;
	ECanaMboxes.MBOX30.MID.all = 0x8CF00300;  //0CF00300 发动机负载率,油门位置 
    ECanaMboxes.MBOX30.MDRL.all = 0;
    ECanaMboxes.MBOX30.MDRH.all = 0;
	ECanaMboxes.MBOX29.MID.all = 0x98FEEE00;  //18FEEE00 冷却水温   
    ECanaMboxes.MBOX29.MDRL.all = 0;
    ECanaMboxes.MBOX29.MDRH.all = 0;
	ECanaMboxes.MBOX28.MID.all = 0x98FEEF00;  //18FEEF00 机油压力 
	ECanaMboxes.MBOX28.MDRL.all = 0;
	ECanaMboxes.MBOX28.MDRH.all = 0;
	ECanaMboxes.MBOX27.MID.all = 0x98FEF700;  //18FEF700 电池电压 
	ECanaMboxes.MBOX27.MDRL.all = 0;
	ECanaMboxes.MBOX27.MDRH.all = 0;
	//mid = 0x184;
	//mid = mid<<18;
	//ECanaMboxes.MBOX31.MID.all = mid;
	                                    
	/*0~15 is TX,16~31 is RX*/
	ECanaRegs.CANMD.all = 0xFFFF0000;    
	
	/*数据长度 8个BYTE*/
	ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX1.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX2.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX3.MCF.bit.DLC = 8;
	
	ECanaMboxes.MBOX31.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX30.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX29.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX28.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX27.MCF.bit.DLC = 8;
	
	/*没有远方应答帧被请求*/
	ECanaMboxes.MBOX0.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX1.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX2.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX3.MCF.bit.RTR = 0;
	
	ECanaMboxes.MBOX31.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX30.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX29.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX28.MCF.bit.RTR = 0;  
	ECanaMboxes.MBOX27.MCF.bit.RTR = 0;
	/*邮箱使能*/
	ECanaRegs.CANME.all = 0xF800000F;  
	
	//中断方式时以下4行放开
	/*ECanaRegs.CANTRS.bit.TRS0 = 1;
	ECanaRegs.CANTRS.bit.TRS1 = 1;
	ECanaRegs.CANTRS.bit.TRS2 = 1;
	ECanaRegs.CANTRS.bit.TRS3 = 1;*/
}	

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?