📄 can.c
字号:
#ifndef _CAN_C
#define _CAN_C
#include <user.h>
#include <can.h>
byte data count_testRX;
byte data count_testTX;
CanBuffer xdata canbuffer;
byte buf [8],rbuf [13],bbuf[8];
unsigned char code R_FRAME[]={0XF0,0X1F,0Xaa,0Xaa,0Xaa}; //远程帧信息
//*****************SJA1000初始化程序*****************
void init_can(void) //SJA1000进入复位模式并初始化寄存器
{
byte sta;
byte xdata *nm_poin;
sta=0;
nm_poin=MODE; //选中SJA1000
*nm_poin=0x09; //模式寄存器设置
sta=0;
while((sta&0x01)!=0x01) //必须确认SJA进入了复位模式
{
sta=*nm_poin;
}
nm_poin=BTR0;
*nm_poin=0xc9; //总线定时寄存器0-系统时钟,同步跳转宽度
nm_poin=BTR1;
*nm_poin=0xA3; //总线定时寄存器1-波特率100K,采样次数3
nm_poin=CDR;
*nm_poin=0xc0; //时钟分频寄存器,PeliCAN,RX1不允许,CLKOUT不允许
nm_poin=OCR;
*nm_poin=0xaa; //输出控制寄存器,正常输出模式
nm_poin=IER;
*nm_poin=0x0d; //输入,总线出错,数据溢出中断允许
nm_poin=ACR0;
*nm_poin=0x00; //验收代码ff 7f 00 08
nm_poin=ACR1;
*nm_poin=0x81;
nm_poin=ACR2;
*nm_poin=0x00;
nm_poin=ACR3;
*nm_poin=0x00;
nm_poin=AMR0; //验收屏蔽06 00 00 00
*nm_poin=0Xff;
nm_poin=AMR1;
*nm_poin=0xff;
nm_poin=AMR2;
*nm_poin=0xff;
nm_poin=AMR3;
*nm_poin=0xff;
nm_poin=RBSA; //接收缓冲区首址
*nm_poin=0;
nm_poin=TXERR; //错误计数
*nm_poin=0;
nm_poin=ECC; //错误代码值
*nm_poin=0;
nm_poin=MODE;
*nm_poin=0x08; //单滤波设置,返回到工作状态
sta=0x01;
while((sta&0x01)==0x01) //必须确认SJA进入了工作模式
{
sta=*nm_poin;
}
}
//*****************发送一帧数据子程序*****************
void send_Fframe()
{
byte state;
byte xdata *nm_poin;
nm_poin=SR;
state=0;
while(state!=0x0c) //检查各状态位
{
state=*nm_poin;
state=state&0x1c;
}
nm_poin=CANTX;
*nm_poin=0xc0; //远程帧
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
nm_poin=CMR;
*nm_poin=0X01; //启动发送
}
//*****************发送数据帧*****************
void send_dframe(void)
{
byte s_state;
byte xdata *nm_poin;
nm_poin=SR;
s_state=0;
while(s_state!=0x0c) //检查各状态位
{
s_state=*nm_poin;
s_state=s_state&0x1c;
}
nm_poin=CANTX;
*nm_poin=0x88; //数据帧,8个字节
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
nm_poin++;
*nm_poin=0xaa;
//从数据区顶端去数据送入发送缓冲区
for(s_state=0;s_state<8;s_state++) //将数据送至发送缓冲区
{
nm_poin++;
*nm_poin=bbuf[s_state];
}
bbuf[7]++;
nm_poin=CMR;
*nm_poin=0X01; //启动发送
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -