⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task_can.c

📁 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 + -