📄 can.c
字号:
#include "2407c.h"
volatile ioport unsigned int port8008;
#define IOWR port8008
int uWork;
void watchdog(void);
void delay_nus(long int n);
void delay_ns(long int n);
void Max_CS(int ab,int val);
void Max_CLK(int ab,int val);
void Max_DIN(int ab,int val);
void Max_SEND(unsigned int val);
void dly_nus(long int n) ;
void LED_init(void);
void CANMBX_ISR();
void interrupt GRIS5(void);
void CAN_INIT();
int CAN_FLAG;
void main(void)
{
*WDCR=0X6F;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗 */
*SCSR1=0x83fe; /* DSP运行频率30m */
uWork=(*MCRC);
uWork&=0x0ff03;
(*MCRC)=uWork;
asm(" setc INTM");
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
*IMR=0X0010;
*IFR=0XFFFF;
CAN_FLAG=0X00; /*清用户标志,CAN_FLAG=0X01表示接收到数据*/
CAN_INIT();
asm(" clrc INTM");
LED_init() ;
for(;;)
{
*CANTCR=0X20; //MBX3请求发送
while(*CANTCR&0X2000==0) //等待发送应答
continue;
*CANTCR=0X2000;//清TA3和MIF3标志位
while(CAN_FLAG==0)
continue;
CAN_FLAG=0; //清接收标志
*CANMDER=0X0000; //邮箱不使能
*CANMCR=0X0140; //CDR=1,数据改变请求
Max_SEND(0x100+(*CANMBX2A&0X00FF));
delay_nus(50000);
*CANMBX3A=*CANMBX2A+1; //邮箱2中底数据加1用来更新邮箱3中底数据
*CANMBX3B=*CANMBX2B+1;
*CANMBX3C=*CANMBX2C+1;
*CANMBX3D=*CANMBX2D+1;
*CANMCR=0X04C0; //DBO=1,CDR=0,ABO=1,STM=1
*CANMDER=0X04C; //ME2=ME3=1,MBX2接收,MBX3发送
}
}
void CAN_INIT(void)
{
*MCRB=*MCRB|0X0C0; //设置IOPC6,IOPC7为CANRX,CANTX
*CANIFR=0XFFFF; //清所有CAN中断标志
*CANLAM1H=0X7FFF; //设置邮箱2、3的屏蔽ID寄存器
*CANLAM1L=0XFFFF;
*CANMCR=0X1040; //CCR=1改变配置请求
while (*CANGSR&0X0010==0)
continue;
*CANBCR2=0X01; //波特率预分频寄存器
*CANBCR1=0X033; //波特率设置为1M
*CANMCR=*CANMCR&0XEFFF; //CCR=0,改变配置结束请求
while(*CANGSR&0X0010!=0)
continue; //只有CEE=0时,BCR2和BCR1配置成功
*CANMDER=0X040; //CDR=1 数据区改变请求
*CANMCR=0X0143; //设置邮箱2的控制字及ID
*CANMSGID2H=0X2447;
*CANMSGID2L=0XFFFF;
*CANMSGCTRL2=0X08;
*CANMBX2A=0X0000;
*CANMBX2B=0X0000;
*CANMBX2C=0X0000;
*CANMBX2D=0X0000;
*CANMSGID3H=0X2447;
*CANMSGID3L=0XFFFF;
*CANMSGCTRL3=0X08;
*CANMBX3A=0X2211;
*CANMBX3B=0X2211;
*CANMBX3C=0X2211;
*CANMBX3D=0X2211;
*CANMCR=0X04C0;
*CANMDER=0X04C;
*CANIMR=0XF7FF;
*CANIFR=0XFFFF;
}
void interrupt GRIS5(void)
{
switch(*PIVR)
{
case 64:
CANMBX_ISR();
break;
}
}
void CANMBX_ISR(void)
{
*CANRCR=0X040;
CAN_FLAG=1;
}
void watchdog(void)
{
return;
}
void delay_nus(long int n)
{
long int j;
for (j=1;j<=n;j++)
{
{
watchdog();
}
}
}
void delay_ns(long int n)
{
long int j;
for (j=1;j<=n;j++)
{
{
watchdog();
}
}
}
void Max_CS(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X1010;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X1000;
uWork&=0XFFEF;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_CLK(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X0808;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X0800;
uWork&=0XFFF7;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_DIN(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X0404;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X0400;
uWork&=0XFFFB;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_SEND(unsigned int val)
{
int i;
unsigned int tmp;
Max_CS(0,1);
Max_CLK(0,0);
Max_CS(0,1);
Max_CS(0,0);
for (i=0;i<16;i++)
{
Max_CLK(0,0);
tmp= 0x8000>>i;
Max_DIN(0,val&tmp);
Max_CLK(0,0);
Max_CLK(0,1);
}
Max_CS(0,1);
}
void dly_nus(long int n)
{
int i;
long int j;
for (j=1;j<=n;j++)
{
for (i=0;i<3;i++)
{
watchdog();
}
}
}
void LED_init(void)
{
int j;
Max_SEND(0x0F00);
Max_SEND(0x0C01);
Max_SEND(0x0A04);
Max_SEND(0x0B07);
Max_SEND(0x09FF);
Max_SEND(0x0F01);
delay_nus(10000);
Max_SEND(0x0F00);
for (j=1;j<9;j++)
{
Max_SEND(j*0x100+0x000F);
}
}
void LED_test (void)
{
int i,j;
LED_init();
while (1)
{
for (i=0;i<10;i++)
{
for (j=1;j<9;j++)
{
Max_SEND(j*0x100+i+0x0080);
delay_nus(50000);
Max_SEND(j*0x100+0x000F);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -