📄 task_can.c
字号:
/****************************************************************************************************/
#include <REGX51.H>
#include <sja_interface.h>
/****************************************************************************************************/
//端口定义
sbit led0=P2^0;
/****************************************************************************************************/
//位定义
bit CAN_write_bit=0; //向CAN总线写数据标志位,1向CAN总线写数据
/****************************************************************************************************/
//外部,全局变量定义
unsigned char sen_buf[12]={0x00}; //发送缓存
unsigned char rec_buf[12]={0x00}; //接收缓存
/****************************************************************************************************/
//函数声明
bit write_SJAsendBUF(void);
bit read_SJAsendBUF(void);
/****************************************************************************************************/
//结构定义
//****备注:定义SJA1000读写缓冲区的数据结构
struct BASIC_CAN_buf_struct{
unsigned char FrameID_H; /*8bit*/
unsigned char Frame_LENTH; /*4bit*/
unsigned char Frame_KIND; /*1bit*/
unsigned char FrameID_L3; /*3bit*/
unsigned char Frame_Data[8]; /*8bit*/
}receive_buf,send_buf;
/****************************************************************************************************/
//函数名称:task_can
//函数功能:CAN总线操作
//入口参数:无
//出口参数:无
//****备注:无
void task_can(void)
{
unsigned char i=0x00;
if(CAN_bit)
{
CAN_bit=0; //CAN动作标志位清零
// led0=!led0;
if(rece_bit)
{
rece_bit=0; //接收中断清零
read_SJAsendBUF();
for(i=0;i<8;i++)
{
rec_buf[i+4]=receive_buf.Frame_Data[i]; //将接收到的数据放在单片机的缓存内,供使用
}
}
// if(send_bit)
// {
// send_bit=0; //发送中断清零
// }
}
//if(CAN_write_bit) //本机需要在CAN上发送数据时,执行此段程序
//{
// CAN_write_bit=0; //清零
// write_SJAsendBUF(); //向CAN总线写入数据
//}
}
/****************************************************************************************************/
//函数名称:write_SJAsendBUF
//函数功能:写发送缓冲器
//入口参数:无
//出口参数:是否写成功,setting_success
//****备注:SJA1000的基本操作,和硬件相关,操作发送缓存器(地址:10~19)和状态寄存器(地址:2)
// *只能在工作模式下写
bit write_SJAsendBUF(void)
{
bit setting_success=0;
unsigned char i;
unsigned char buf=0x00;
send_buf.FrameID_H =sen_buf[0];
send_buf.Frame_LENTH =sen_buf[1];
send_buf.Frame_KIND =sen_buf[2];
send_buf.FrameID_L3 =sen_buf[3];
send_buf.Frame_Data[0]=sen_buf[4];
send_buf.Frame_Data[1]=sen_buf[5];
send_buf.Frame_Data[2]=sen_buf[6];
send_buf.Frame_Data[3]=sen_buf[7];
send_buf.Frame_Data[4]=sen_buf[8];
send_buf.Frame_Data[5]=sen_buf[9];
send_buf.Frame_Data[6]=sen_buf[10];
send_buf.Frame_Data[7]=sen_buf[11];
while(sja_mode==0)
{
set_work_mode(); //设置进入工作模式
}
if((read_can(0x02)&0x08)==0x08) //发送完毕
{
if((read_can(0x02)&0x04)==0x04) //发送缓冲器释放
{
write_can(10,send_buf.FrameID_H);
buf=((send_buf.FrameID_L3&0x07)<<5)|((send_buf.Frame_KIND&0x01)<<4)|(send_buf.Frame_LENTH&0x0f);
write_can(11,buf);
if((send_buf.Frame_KIND&0x01)==0)
{
for(i=0;i<send_buf.Frame_LENTH,i<8;i++)
{
write_can(12+i,send_buf.Frame_Data[i]);
}
write_can(0x01,0x01); //启动CAN总线发送数据
setting_success=1;
}
}
}
return(setting_success);
}
/****************************************************************************************************/
//函数名称:read_SJAsendBUF
//函数功能;从接收缓冲器接收数据
//入口参数;无
//出口参数:读取是否成功,setting_success
//****备注:SJA1000的基本操作,和硬件相关,操作接收缓存器(地址:20~29)和状态寄存器(地址:2)
// *只能在工作模式下读
bit read_SJAsendBUF(void)
{
bit setting_success=0;
unsigned char i;
while(sja_mode==0)
{
set_work_mode();
}
receive_buf.FrameID_H=read_can(20);
receive_buf.FrameID_L3= ((read_can(21)&0xe0)>>5);
receive_buf.Frame_KIND= ((read_can(21)&0x10)>>4);
receive_buf.Frame_LENTH= (read_can(21)&0x0f);
if((receive_buf.Frame_KIND&0x01)==0)
{
for(i=0;i<receive_buf.Frame_LENTH,i<8;i++)
{
receive_buf.Frame_Data[i]=read_can(22+i);
}
write_can(0x01,0x04); //接收缓存器(RXFIFO)中存放报文的存储空间被释放
setting_success=1;
}
return(setting_success);
}
/******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -