can协议sja1000
原创经典:调试好的can总线程序(c语言)
程序中的两个头文件:
#include //SJA存储器定义头文件
#include //SJA子程序文件
大家需要的话联系我:nnyt@tom.com
同时提供can协议实验开发板给初学者
1CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;
2提供详尽的源程序,可根据用户需求编写程序
联系我:13106551527(短信联系,QQ详谈)
QQ: 531706356
调试好的can总线程序(c语言)
//
void Init_Cpu(void);//初始化单片机
void Sja_1000_Init(void);//初始化SIA
//
void main(void)
{
s=0;//配置sja1000出现错误时,重新初始化
do{
Sja_1000_Init();
}while(s!=0);
Init_Cpu();//initialize mcu
flag_init=0x00;//保存中断寄存器值清零
while(1)
{
if(rcv_flag)//if there is receive interrupt
{
rcv_flag=0;//接收标志位清零
BCAN_DATA_RECEIVE(rcv_data);//接收数据
BCAN_CMD_PRG(RRB_CMD);//释放接收缓冲区
flag_send=1;//发送命令置位
}
if(flag_send)
{
flag_send=0;//发送位清零
send_data[0]=rcv_data[2];//接收到的"发送方ID10~ID3"
send_data[1]=rcv_data[3];//接收到的"发送方ID2~ID0"和要求的数据长度
send_data[2]=0x88;
send_data[3]=0x89;
BCAN_DATA_WRITE(send_data);//发送数据
BCAN_CMD_PRG(TR_CMD);//置位发送请求位
for(count_k=0;count_k<200;count_k++)
display(a);//延时显示"5"
}
if (err_flag)//错误中断
{
for(count_k=0;count_k<280;count_k++)
display(c);//错误显示"1"
err_flag=0;//错误标志位清零
Sja_1000_Init();//初始化SJA
}
display(b);//显示"p"
}
}
void ex0_int(void) interrupt 0 using 1//外部中断0
{
SJA_BCANAdr=REG_INTERRUPT;//指针指向中断寄存器
flag_init=*SJA_BCANAdr;//保持中断寄存器值
}
void Init_Cpu(void)//单片机初始化,开放外部中断0
{
PX0=1;
EX0=1;
EA=1;
}
void Sja_1000_Init(void)
{
s=BCAN_CREATE_COMMUNATION();//SJA自测
s=BCAN_ENTER_RETMODEL();//进入复位
s=BCAN_SET_BANDRATE(0x04);//设置波特率100K/S
s=BCAN_SET_OBJECT(0xaa,0x00); //设置地址ID:550
s=BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
s=BCAN_QUIT_RETMODEL();//退出复位模式
SJA_BCANAdr=REG_CONTROL;//地址指针指向控制寄存器
*SJA_BCANAdr|=0x1e;//开放错误接收发送中断
}