📄 task_can.lst
字号:
C51 COMPILER V7.50 TASK_CAN 05/24/2007 16:12:26 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TASK_CAN
OBJECT MODULE PLACED IN task_can.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE task_can.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************************************************/
2 #include <REGX51.H>
3 #include <sja_interface.h>
4 /****************************************************************************************************/
5 //端口定义
6 sbit led0=P2^0;
7 /****************************************************************************************************/
8 //位定义
9 bit CAN_write_bit=0; //向CAN总线写数据标志位,1向CAN总线写数据
10 /****************************************************************************************************/
11 //外部,全局变量定义
12 unsigned char sen_buf[12]={0x00}; //发送缓存
13 unsigned char rec_buf[12]={0x00}; //接收缓存
14 /****************************************************************************************************/
15 //函数声明
16 bit write_SJAsendBUF(void);
17 bit read_SJAsendBUF(void);
18 /****************************************************************************************************/
19 //结构定义
20 //****备注:定义SJA1000读写缓冲区的数据结构
21 struct BASIC_CAN_buf_struct{
22 unsigned char FrameID_H; /*8bit*/
23 unsigned char Frame_LENTH; /*4bit*/
24 unsigned char Frame_KIND; /*1bit*/
25 unsigned char FrameID_L3; /*3bit*/
26 unsigned char Frame_Data[8]; /*8bit*/
27 }receive_buf,send_buf;
28 /****************************************************************************************************/
29 //函数名称:task_can
30 //函数功能:CAN总线操作
31 //入口参数:无
32 //出口参数:无
33 //****备注:无
34 void task_can(void)
35 {
36 1 unsigned char i=0x00;
37 1 if(CAN_bit)
38 1 {
39 2 CAN_bit=0; //CAN动作标志位清零
40 2 // led0=!led0;
41 2 if(rece_bit)
42 2 {
43 3 rece_bit=0; //接收中断清零
44 3 read_SJAsendBUF();
45 3 for(i=0;i<8;i++)
46 3 {
47 4 rec_buf[i+4]=receive_buf.Frame_Data[i]; //将接收到的数据放在单片机的缓存内,供使用
48 4 }
49 3 }
50 2 // if(send_bit)
51 2 // {
52 2 // send_bit=0; //发送中断清零
53 2 // }
54 2 }
55 1 //if(CAN_write_bit) //本机需要在CAN上发送数据时,执行此段程序
C51 COMPILER V7.50 TASK_CAN 05/24/2007 16:12:26 PAGE 2
56 1 //{
57 1 // CAN_write_bit=0; //清零
58 1 // write_SJAsendBUF(); //向CAN总线写入数据
59 1 //}
60 1 }
61 /****************************************************************************************************/
62 //函数名称:write_SJAsendBUF
63 //函数功能:写发送缓冲器
64 //入口参数:无
65 //出口参数:是否写成功,setting_success
66 //****备注:SJA1000的基本操作,和硬件相关,操作发送缓存器(地址:10~19)和状态寄存器(地址:2)
67 // *只能在工作模式下写
68 bit write_SJAsendBUF(void)
69 {
70 1 bit setting_success=0;
71 1 unsigned char i;
72 1 unsigned char buf=0x00;
73 1 send_buf.FrameID_H =sen_buf[0];
74 1 send_buf.Frame_LENTH =sen_buf[1];
75 1 send_buf.Frame_KIND =sen_buf[2];
76 1 send_buf.FrameID_L3 =sen_buf[3];
77 1 send_buf.Frame_Data[0]=sen_buf[4];
78 1 send_buf.Frame_Data[1]=sen_buf[5];
79 1 send_buf.Frame_Data[2]=sen_buf[6];
80 1 send_buf.Frame_Data[3]=sen_buf[7];
81 1 send_buf.Frame_Data[4]=sen_buf[8];
82 1 send_buf.Frame_Data[5]=sen_buf[9];
83 1 send_buf.Frame_Data[6]=sen_buf[10];
84 1 send_buf.Frame_Data[7]=sen_buf[11];
85 1 while(sja_mode==0)
86 1 {
87 2 set_work_mode(); //设置进入工作模式
88 2 }
89 1 if((read_can(0x02)&0x08)==0x08) //发送完毕
90 1 {
91 2 if((read_can(0x02)&0x04)==0x04) //发送缓冲器释放
92 2 {
93 3 write_can(10,send_buf.FrameID_H);
94 3 buf=((send_buf.FrameID_L3&0x07)<<5)|((send_buf.Frame_KIND&0x01)<<4)|(send_buf.Frame_LENTH&0x0f);
95 3 write_can(11,buf);
96 3 if((send_buf.Frame_KIND&0x01)==0)
97 3 {
98 4 for(i=0;i<send_buf.Frame_LENTH,i<8;i++)
99 4 {
100 5 write_can(12+i,send_buf.Frame_Data[i]);
101 5 }
102 4 write_can(0x01,0x01); //启动CAN总线发送数据
103 4 setting_success=1;
104 4 }
105 3 }
106 2 }
107 1 return(setting_success);
108 1 }
109 /****************************************************************************************************/
110 //函数名称:read_SJAsendBUF
111 //函数功能;从接收缓冲器接收数据
112 //入口参数;无
113 //出口参数:读取是否成功,setting_success
114 //****备注:SJA1000的基本操作,和硬件相关,操作接收缓存器(地址:20~29)和状态寄存器(地址:2)
115 // *只能在工作模式下读
116 bit read_SJAsendBUF(void)
117 {
C51 COMPILER V7.50 TASK_CAN 05/24/2007 16:12:26 PAGE 3
118 1 bit setting_success=0;
119 1 unsigned char i;
120 1 while(sja_mode==0)
121 1 {
122 2 set_work_mode();
123 2 }
124 1 receive_buf.FrameID_H=read_can(20);
125 1 receive_buf.FrameID_L3= ((read_can(21)&0xe0)>>5);
126 1 receive_buf.Frame_KIND= ((read_can(21)&0x10)>>4);
127 1 receive_buf.Frame_LENTH= (read_can(21)&0x0f);
128 1 if((receive_buf.Frame_KIND&0x01)==0)
129 1 {
130 2 for(i=0;i<receive_buf.Frame_LENTH,i<8;i++)
131 2 {
132 3 receive_buf.Frame_Data[i]=read_can(22+i);
133 3 }
134 2 write_can(0x01,0x04); //接收缓存器(RXFIFO)中存放报文的存储空间被释放
135 2 setting_success=1;
136 2 }
137 1 return(setting_success);
138 1 }
139 /******************************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 315 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 48 3
IDATA SIZE = ---- ----
BIT SIZE = 1 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -