📄 can2.c
字号:
/*Main.c*/
/*CAN发送与接收程序,波特率设置为125kbps,标准帧,ID=0x024*/
#include "LF2407regs.h"
void SystemInit();
void Timer1Init();
void KickDog();
void Can_Init();
void Can_Send();
void Can_Send1();
int numled0=200;
unsigned char SendData[8]={0x03,0x00,0x04,0x03,0x01,0x02,0x01,0x02};
unsigned int t0=0,count=0,gen_vol=380;
unsigned char ReceiveData,ReceiveData1;
unsigned char gen_cur=1,gen_fre=50,gen_power=120,alarm_flag=0,state_flag=1,gen_switch=1, gen_power1=100;
main()
{
SystemInit(); //系统初始化
*MCRA=*MCRA & 0x00FF; //IOPB0-7设为IO口模式
*PBDATDIR=0x0FF0; //所有LED=0
*PBDATDIR=*PBDATDIR |0x000F; //所有LED=1
Can_Init(); //CAN模块初始化
Timer1Init(); //定时器初始化
Can_Send1();
asm(" CLRC INTM ");
while(1);
}
void SystemInit()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
*SCSR1=0x83FE; /* 系统时钟CLKOUT=20*2=40M */
/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
*WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */
KickDog(); /* 初始化看门狗 */
*PBDATDIR=0x8E00; /* output PB7 PB3 PB2 PB1*/
*PCDATDIR=0x3800; /* output PC5 PC4 PC3 */
*PEDATDIR=0x6F00; /* output PE6 PE5 PE3 PE2 PE1 PE0 */
*PFDATDIR=0x6000; /* output PF6 4052A PF5 4052B */
*IFR=0xFFFF; /* 清除中断标志 */
*IMR=0x0003; /* 打开中断1,2*/
}
void Timer1Init()
{
*EVAIMRA=0x0080; //定时器1周期中断使能
*EVAIFRA=0xFFFF; //清除中断标志
*GPTCONA=0x0000;
*T1PER=2500; //定时器1初值,定时0.4us*2500=1ms
*T1CNT=0;
*T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能
}
void Can_Init()
{
*MCRB|=0x00C0; /*IOPC6,IOPC7???????*/
*CANIFR=0xFFFF; /* ????CAN???? */
*CANLAM0H=0x9FFF; /* ??LAM0 */
*CANLAM0L=0xFFFF; /* */
*CANLAM1H=0x9000; /* ??LAM1 */
*CANLAM1L=0x0000; /* */
*CANMCR=0x1000; /* ????????? */
while((*CANGSR & 0x0010)!=0x0010); /* CCE=1? */
*CANBCR2=0x0013; /* ???????:125Kbps,40M */
*CANBCR1=0x0061;
*CANMCR=0x0000; /* CPU?????? */
while((*CANGSR & 0x0010)!=0x0000); /* CCE=0? */
*CANMDER=0x0000; /* ???? */
*CANMCR=0x0100; /* ??????? */
*CANMSGCTRL0=0x18;
*CANMSGCTRL1=0x18;
*CANMSGCTRL2=0x18;
*CANMSGID0H=0x20A0; /*???,??ID=024-0x40a0,????0????*/
*CANMSGID1H=0x0070;
*CANMSGID2H=0x0060;
*CANMCR=0x0480; /* ??????0x0480,???0x04c0 */
*CANMDER=0x0045; /* ?MessageBox0?? */
*CANIMR=0x0100; /* ??????,????,??MessageBox0???? */
*CANIFR=0xFFFF; /* ????CAN???? */
}
void Can_Send()
{
*CANMCR=0x0100;
*CANMSGID4H=0x2080;
*CANMSGCTRL4=0x0008;
*CANMBX4A=gen_vol;
*CANMBX4B=(gen_power<<8) | gen_cur;
*CANMBX4C=(gen_switch<<8) | gen_fre;
*CANMBX4D=(state_flag<<8) | alarm_flag;
*CANMCR=0x0480;
*CANMDER=*CANMDER | 0x0010;
asm(" SETC INTM ");
*CANTCR=0x0040;
while((*CANTCR & 0x4000)!=0x4000);
asm(" CLRC INTM ");
*CANIFR=0xFFFF;
*CANTCR=0x4000;
gen_vol++;
gen_cur++;
gen_power++;
state_flag++;
alarm_flag++;
if(alarm_flag==4) alarm_flag=0;
if(gen_cur>5) gen_cur=1;
if(gen_vol>399) gen_vol=380;
if(gen_power>200)gen_power=120;
if(state_flag>5) state_flag=1;
*PEDATDIR&=0xFFDF;
*PBDATDIR&=0xFFFD;
}
void Can_Send1()
{
*CANMCR=0x0100;
*CANMSGID5H=0x0090;
*CANMSGCTRL5=0x0008;
*CANMBX5A=gen_power1;
*CANMBX5B=(SendData[3]<<8) | SendData[2];
*CANMBX5C=(SendData[5]<<8) | SendData[4];
*CANMBX5D=(SendData[7]<<8) | SendData[6];
*CANMCR=0x0480;
*CANMDER=*CANMDER | 0x0010;
asm(" SETC INTM ");
*CANTCR=0x0040;
while((*CANTCR & 0x4000)!=0x4000);
asm(" CLRC INTM ");
*CANIFR=0xFFFF;
*CANTCR=0x4000;
gen_power1++;
if(gen_power1>200)gen_power=100;
*PEDATDIR&=0xFFDF;
*PBDATDIR&=0xFFFD;
}
void c_int1()
{
if(*PVIR!=0x40)
{ asm(" CLRC INTM ");
return;
}
if((*CANRCR&0x1000)>>12==1) Can_Send();
if((*CANRCR&0x0020)>>5==1)
{
ReceiveData1=*CANMBX1A & 0x00FF;
}
if((*CANRCR&0x0040)>>6==1)
{
ReceiveData=*CANMBX2A & 0x00FF;
switch(ReceiveData)
{
case 1:*PEDATDIR|=0x0020;break; /* ACB_open IOPE5 */
case 5:*PBDATDIR|=0x0002;break; /* ACB_close IOPB1 */
case 2:*PEDATDIR|=0x0004;break; /* open accelerate IOPE2 */
case 3:*PEDATDIR|=0x0002;break; /* open decelerate IOPE1 */
case 4:*PEDATDIR&=0xFFFD; /* close decelerate IOPE1 */
*PEDATDIR&=0xFFFB;break; /* close accelerate IOPE2 */
}
}
*CANRCR=0xFFF0;
*CANIFR=0xFFFF;
*IFR=0xFFFF;
asm(" CLRC INTM ");
}
void c_int2() /*定时器1中断服务程序*/
{
if(*PVIR!=0x27)
{ asm(" CLRC INTM ");
return;
}
*T1CNT=0;
t0++;
numled0--;
if(numled0==0)
{
numled0=200;
if((*PBDATDIR & 0x0001)==0x0001)
*PBDATDIR=*PBDATDIR & 0xFFFE; //IOPB0=0;LED灭
else
*PBDATDIR=*PBDATDIR |0x0101; //IOPB0=1;LED亮
}
if((t0%100)==0) //定时循环SCI发送
{
//Can_Send1();
}
*EVAIFRA=0x80;
asm(" CLRC INTM ");
}
void KickDog() /*踢除看门狗 */
{
*WDKEY=0x5555;
*WDKEY=0xAAAA;
}
void interrupt nothing()
{
asm(" clrc INTM");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -