📄 can_test.c
字号:
#include "DSP28_Device.h"
#define LED1_ON GpioDataRegs.GPFDAT.bit.GPIOF14=1
#define LED1_OFF GpioDataRegs.GPFDAT.bit.GPIOF14=0
void delay();
//Global variable for this example
unsigned int Led_Flag;
Uint32 ErrorCount;
Uint32 MessageReceiveCount;
void main(void)
{
Uint16 i;
struct ECAN_REGS ECanaShadow;
// 1:初始化系统时钟
EALLOW;
// On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
// control registers bit have to be enabled. The bits are in Device emulation registers.
DevEmuRegs.M0RAMDFT = 0x0300;
DevEmuRegs.M1RAMDFT = 0x0300;
DevEmuRegs.L0RAMDFT = 0x0300;
DevEmuRegs.L1RAMDFT = 0x0300;
DevEmuRegs.H0RAMDFT = 0x0300;
// Disable watchdog module
SysCtrlRegs.WDCR= 0x0068;
// Initalize PLL
SysCtrlRegs.PLLCR = 0xA;
// Wait for PLL to lock
for(i= 0; i< 5000; i++){}
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001;
SysCtrlRegs.LOSPCP.all = 0x0002;
// Peripheral clock enables set for the selected peripherals.
SysCtrlRegs.PCLKCR.bit.ECANENCLK = 1;
EDIS;
//2:为CAN配置使能CANTA,CANRX引脚
/*eCAN I/O控制寄存器*/
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
EALLOW;
/*邮箱屏蔽使能*/
ECanaRegs.CANMIM.all = 0x00000000;//邮箱中断屏蔽寄存器
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1;//主控寄存器
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
delay();
//3:等待复位完成
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 1);
//4:配置通信波特率
/*CAN位时间配置和通信波特率计算*/
EALLOW;
/*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
ECanaShadow.CANBTC.bit.BRP = 9; //?
/*150/10=15*/
ECanaShadow.CANBTC.bit.TSEG2 = 5;
ECanaShadow.CANBTC.bit.TSEG1 = 7;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
//5:对于标准模式在这一步设置写入接收屏蔽值
//6:设置主控制寄存器
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0;////////////////
ECanaShadow.CANMC.bit.SCM = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
//7:初试化MSGCTRL寄存器
EALLOW;
ECanaMboxes.MBOX5.MCF.all=8;
EDIS;
//8:检验CCE,完成初试化
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 0);
EALLOW;
GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;
GpioMuxRegs.GPFDIR.bit.GPIOF14=1;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;
EDIS;
/////////////////////////////////////////////////////////////////////////
//中断配制
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
#if CAN_INT
EALLOW;
ECanaRegs.CANMIM.all = 0xFFFFFFFF;//邮箱中断屏蔽寄存器
ECanaRegs.CANMIL.all = 0; //中断级别寄存器,邮箱中断应用全局中断应用ECAN0INT
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;//中断标志寄存器//?
ECanaRegs.CANGIM.bit.I0EN = 1;
ECanaRegs.CANGIM.bit.I1EN = 1;
ECanaRegs.CANGIM.all = 0x07; //禁止了全局中断,全局中断应用ECAN1INT
EDIS;
PieCtrl.PIEIER9.bit.INTx6 = 1;
PieCtrl.PIEIER9.bit.INTx5 = 1;
#endif
#if CAN_INT
/*设置中断服务程序入口地址*/
// This is needed to write to EALLOW protected registers
/*EALLOW;
PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
EDIS;*/
// This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//已经完成邮箱的初试化,以下应该根据具体情况配置接受邮箱和
// 发送油箱
////////////////////////////////////////////////////////////
/*初始化SCIA寄存器*/
//InitECan();
////////////////////////////////////////////////////////////
// 配置发送邮箱
////////////////////////////////////////////////////////////
MessageReceiveCount = 0;
ErrorCount = 0;
EALLOW;
//1:清除相应的TRS
ECanaRegs.CANTRS.all = 0;
//2: 禁止邮箱
ECanaRegs.CANME.bit.ME5=0;
//3:对邮箱的标示赋值
ECanaMboxes.MBOX5.MID.all = 0x9555AAA5; //ID
ECanaMboxes.MBOX5.MCF.bit.DLC = 8; //数据长度
ECanaRegs.CANMD.bit.MD5 = 0; //设置成发送邮箱
//4:使能油箱
ECanaRegs.CANME.bit.ME5 = 1;
EDIS;
//发送邮箱配置完成
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//发送数据
//1:把数据写入RAM
ECanaMboxes.MBOX5.MDRL.all = 0x00008888;
ECanaMboxes.MBOX5.MDRH.all = 0x0000000F;
//2: 设置TRS
while(1)
{
for(i=0;i<0x0FF;i++)
{
ECanaRegs.CANTRS.all = 0;
ECanaMboxes.MBOX5.MDRL.all = i;
ECanaMboxes.MBOX5.MDRH.all = i;
//启动发送
ECanaRegs.CANTRS.bit.TRS5=1;
//while(ECanaRegs.CANTA.bit.TA5==0);//等待发送中断
//ECanaRegs.CANTA.bit.TA5=1;//复位,清除中断
LED1_ON;
delay();
LED1_OFF;
delay();
MessageReceiveCount++;
}
}
}
void delay()
{
int m,n;
for(m=0;m<500;m++)
{for(n=0;n<5000;n++);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -