📄 can_adc.c
字号:
#include "register.h" // 引用头部文件
int CAN_FLAG; // 定义标志寄存器
int ADRESULT[16]; //define an array for conserving the result of AD
volatile unsigned int *j; //define a variable pointer
int i=0x00 , cesi , k;
void inline disable() // 中断屏蔽子程序
{
asm(" setc INTM");
}
void inline enable() // 中断使能子程序
{
asm(" clrc INTM");
}
//系统初始化子程序
void sytem_init()
{
asm(" setc INTM");
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
*IMR=0x0011; // 开中断优先级5和中断优先级1
*IFR=0xFFFF; // 清中断标志位
*SCSR1=0x81FE;
*WDCR=0xE8;
}
//CAN初始化子程序
void CAN_INIT()
{
*MCRB=*MCRB|0X0C0; // 设置IOPC6、IOPC7 为 CANRX,CANTX
*CANIFR=0XFFFF; // 清所有CAN中断标志
*CANLAM1H=0X7FFF; // 设置邮箱2、3的屏蔽ID寄存器
*CANLAM1L=0XFFFF; // 0则ID必须匹配
*CANMCR=0X1040; // CCR=1 改变配置请求
while(*CANGSR&0X0010==0)continue; // 当CCE=1 时即可配置 BCR2,BCR1 寄存器
*CANBCR2=0X01; // 波特率预分频寄存器
*CANBCR1=0X033; // 波特率设置为1M
*CANMCR=*CANMCR&0XEFFF; // CCR=0 改变配置结束请求
while(*CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
*CANMDER=0X040; // 不使能邮箱,邮箱2设为接收方式
*CANMCR=0X0143; // CDR=1,数据区改变请求
*CANMSGID2H=0X2447; // 设置邮箱2的控制字及ID
// IDE=0, AME=0, AAM=0
// 标准方式为MSGID2H[12-2]
*CANMSGID2L=0XFFFF;
*CANMSGCTRL2=0X08; // 设置控制域
// 数据长度DCL = 8,RTR=0 数据帧
*CANMBX2A=0X0000; // 邮箱2信息初始化
*CANMBX2B=0X0000;
*CANMBX2C=0X0000;
*CANMBX2D=0X0000;
*CANMSGID3H=0X2447; // 设置邮箱3的标识符
*CANMSGID3L=0XFFFF;
*CANMSGCTRL3=0X08; // RTR=0,DCL=8
*CANMBX3A=0X2211; // 邮箱3信息初始化
*CANMBX3B=0X4433;
*CANMBX3C=0X6655;
*CANMBX3D=0X8877;
*CANMCR=0X04C0; // DBO=1,ABO=1,STM=1设置为自测试模式
*CANMDER=0X4C; // ME3=1,MBX3 发送, ME2=1 接收
*CANIMR=0XF7FF; // 中断MBX3 不使能 ,MBX2使能, 低中断优先级
*CANIFR=0XFFFF; // 清全部中断标志
}
/*initialization A/D subprogram*/
void ADINT()
{
*T4CNT=0X0000;
*T4CON=0X170C;
*T4PR=0X075;
*GPTCONB=0X400;
*EVBIFRB=0X0FFFF;
*ADCTRL1=0X10;
*ADCTRL2=0X8404; /*1000010000000100 */
*MAXCONV=0X0F;
*CHSELSEQ1=0X3210;
*CHSELSEQ2=0X7654;
*CHSELSEQ3=0X0BA98;
*CHSELSEQ4=0X0FEDC;
}
//start a/d transform subprogram
void ADsoc()
{
*T4CON=*T4CON|0X40;
}
//stop a/d transform subprogram
void ADstop()
{
*T4CON=*T4CON&0X0FFBF;
}
void CAN_T()
{
*CANTCR=0X20; // MBX3请求发送
while(*CANTCR&0X2000==0) // 等待发送应答
continue;
*CANTCR=0X2000; // 清 TA3 和MIF3标志位
}
void CAN_R()
{
while(CAN_FLAG==0)
continue; // 等待接收数据
CAN_FLAG=0; // 清接收到标志
}
void CANMBX_ISR() // 邮箱2接收中断服务子程序
{
*CANRCR=0X040; // 复位 RMP2 和 MIF2
CAN_FLAG=1; // 置用户接收标志
}
void data_configure()
{
k=1;
for(i=1;i++;i<=4)
{
*CANMDER=0X0000; // 邮箱不使能
*CANMCR=0X0140; // CDR=1,数据改变请求
*CANMBX3A=ADRESULT[k];
k++;
*CANMBX3B=ADRESULT[k];
j++;
*CANMBX3C=ADRESULT[k];
k++;
*CANMBX3D=ADRESULT[k];
k++;
}
*CANMCR=0X04C0; // DBO=1,CDR=0,ABO=1,STM=1
*CANMDER=0X04C; // ME2=ME3=1,MBX2接收, MBX3发送
}
main()
{
disable();
sytem_init();
CAN_INIT();
ADINT();
enable();
CAN_R();
ADsoc();
while(i==0x10)
continue;
ADstop();
data_configure();
CAN_T();
while(1)
{
;
}
}
void interrupt GRIS5() //CAN邮箱2接收中断入口程序
{
switch(*PIVR)
{
case 64:
*CANRCR=0X040; // 复位 RMP2 和 MIF2
CAN_FLAG=1; // 置用户接收标志
break;
}
enable();
return;
}
/* a/d iterrupt subprogram */
void interrupt adint()
{
asm(" clrc SXM ");
j=RESULT0;
for(i=0;i<=15;i++,j++)
{
ADRESULT[i]=*j&0X03FF;
cesi=ADRESULT[i];
}
*ADCTRL2=*ADCTRL2|0X4200;
enable();
return;
}
void interrupt nothing()
{
enable();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -