#include "register.h"
//Main.c
////////////////////////////////////////////
void SystemInit();
void KickDog();
void Can_Init();
void Can_Send();
int CAN_FLAG;
unsigned int ReceiveData[8];
///////////////////////////////////////////////////////////
void inline disable()
{
asm(" setc INTM");
}
// 开总中断程序
void inline enable()
{
asm(" clrc INTM");
}
/////////////////////////////////////////////////////////
main()
{
disable();
SystemInit(); //系统初始化
CAN_FLAG=0x00; //CAN接收标志位
Can_Init(); //CAN模块初始化
enable();
for(;;)
{
while(CAN_FLAG==0x00);
CAN_FLAG=0x00;
Can_Send();
MDER=0x0000; //邮箱不使能
}
}
////////////////////////////////////////////////////
void SystemInit()
{
asm(" SETC INTM "); // 关闭总中断
asm(" CLRC SXM "); // 禁止符号位扩展
asm(" CLRC CNF "); // B0块映射为 on-chip DARAM
asm(" CLRC OVM "); // 累加器结果正常溢出*/
SCSR1=0x87FE; // 系统时钟CLKOUT=20*1=20M
// 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
WDCR=0x006F; // 禁止看门狗,看门狗时钟64分频
KickDog(); // 初始化看门狗
IMR=0x0010; //开中断优先级5
IFR=0xFFFF; // 清除中断标志
}
/////////////////////////////////////////////////////
void Can_Init()
{
MCRB|=0x00C0; //IOPC6,IOPC7配置为特殊功能
CAN_IFR=0xFFFF; // 清除全部CAN中断标志
LAM1_H=0xFFFF; // 使用LAM1
LAM1_L=0xFFFF; // 接收任何信息
MCR=0x1000; // 配置寄存器改变请求,正常模式
while((GSR & 0x0010)!=0x0010); // CCE=1?
BCR2=0x0003; // 设置数据传输率:500Kbps,20M *
BCR1=0x0023;
MCR=MCR&0xEFFF; // CPU正常工作请求
while((GSR & 0x0010)!=0x0000); // CCE=0?
MDER=0x040; /* 配置邮箱2为接收邮箱,且不使能 */
MCR=MCR|0x0100; /* 数据场改变请求 */
MSGID2H=0x8000; /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/
MSGID2L=0x1314;
MSGCTRL2=0x08; /* 数据帧,发送8个字节 */
MBX2A=0x0000;
MBX2B=0x0000;
MBX2C=0x0000;
MBX2D=0x0000;
MCR=0x0480; /* CPU正常工作请求0x0480 ,自测试为0x04C0*/
MDER=0x0044; /* MessageBox2使能 */
CAN_IMR=0xFFFF; //中断屏蔽寄存器
CAN_IFR=0xFFFF; // 清除全部CAN中断标志
}
///////////////////////////////////////////////////////
void Can_Send()
{
MCR=MCR|0x0100; /* 数据场改变请求 */
MSGID4H=0x8000; /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/
MSGID4L=0x1314;
MSGCTRL4=0x0008; /* 数据帧,发送8个字节 */
MBX4A=(ReceiveData[1]<<8) | ReceiveData[0];
MBX4B=(ReceiveData[3]<<8) | ReceiveData[2];
MBX4C=(ReceiveData[5]<<8) | ReceiveData[4];
MBX4D=(ReceiveData[7]<<8) | ReceiveData[6];
MCR=0x0480; /* CPU正常工作请求0x0480 ,自测试为0x04C0*/
MDER=MDER | 0x0010;/* MessageBox4使能 */
asm(" SETC INTM ");
TCR=0x0040; /* MessageBox4, 发送请求 */
while((TCR & 0x4000)!=0x4000);
asm(" CLRC INTM ");
CAN_IFR=0xFFFF;
TCR=0x4040;
}
////////////////////////////////////////////////////
void interrupt CANINT()
{
if(PIVR!=0x40) //高优先级的CAN接收中断
{ asm(" CLRC INTM ");
return;
}
ReceiveData[0]=MBX2A & 0x00FF;
ReceiveData[1]=MBX2A>>8;
ReceiveData[2]=MBX2B & 0x00FF;
ReceiveData[3]=MBX2B>>8;
ReceiveData[4]=MBX2C & 0x00FF;
ReceiveData[5]=MBX2C>>8;
ReceiveData[6]=MBX2D & 0x00FF;
ReceiveData[7]=MBX2D>>8;
CAN_FLAG=0x01; //收到标志位置1
RCR=0x0040; //复位RMP2和MIF2
CAN_IFR=0xFFFF; //清除CAN中断
IFR=0xFFFF; //清除所有中断
asm(" CLRC INTM ");
}
////////////////////////////////////////////////////
void interrupt nothing()
{
enable( ); // 允许总中断,因一进中断服务程序后总中断就自动关闭了
return; // 中断返回
}
///////////////////////////////////////////////////////////////////////////////
void KickDog() //踢除看门狗
{
WDKEY=0x5555;
WDKEY=0xAAAA;
} |