📄 sja_interface.lst
字号:
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SJA_INTERFACE
OBJECT MODULE PLACED IN sja_interface.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sja_interface.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************************************/
2 //声明部分
3 #include <REGX51.H>
4 /******************************************************************************************/
5 //声明
6 #define base_adr 0x00 /*对SJA1000寻址的基址*/
7 #define error 0 /*错误标志*/
8 #define right 1 /*正确标志*/
9 #define sja_btr0 0x18
10 #define sja_btr1 0x1c
11 #define sja_acr 0xaa
12 #define sja_amr 0x00
13 #define sja_ocr 0xaa
14 #define sja_cdr 0x48
15 #define sja_oie 0
16 #define sja_eie 0
17 #define sja_tie 1 //发送中断
18 #define sja_rie 1 //接收中断
19 /******************************************************************************************/
20 //函数声明
21 void weakup_sev(void);
22 void data_over_sev(void);
23 void wrong_sev(void);
24 void send_sev(void);
25 void receive_sev(void);
26 /******************************************************************************************/
27 //位定义
28 bit send_bit=0; //发送程序执行标志位,1执行;0不执行
29 bit rece_bit=0; //接收程序执行标志位,1执行;0不执行
30 bit CAN_bit=0; //CAN模块动作,1动作;0不动作
31 /******************************************************************************************/
32 //全局变量的定义
33 unsigned char xdata *sja_base_adr=base_adr; /*定义地址指针,指向基址*/
34 bit bdata sja_mode=1; /*此位是1时SJA工作在工作模式,为0时工作在复位模式*/
35 unsigned char bdata inttemp=0x00;
36 /******************************************************************************************/
37 //端口定义
38 sbit cs=P1^0;
39 sbit inttemp_4=inttemp^4;
40 sbit inttemp_3=inttemp^3;
41 sbit inttemp_2=inttemp^2;
42 sbit inttemp_1=inttemp^1;
43 /******************************************************************************************/
44 //函数名称:write_can
45 //函数功能:向CAN控制器写数据
46 //入口参数:sja_adr,set_num(SJA的地址,向该地址写入的数据值)
47 //出口参数:无
48 //****备注:底层的硬件操作
49 void write_can(unsigned char sja_adr,set_num)
50 {
51 1 cs=0; /*使能SJA1000*/
52 1 *(sja_base_adr+sja_adr)=set_num;
53 1 }
54 /*******************************************************************************************/
55 //函数名称:read_can
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 2
56 //函数功能:从CAN控制器读数据
57 //入口参数:SJA的偏移地址
58 //出口参数:读出的数据
59 //****备注:底层的硬件操作
60 unsigned char read_can(unsigned char sja_adr)
61 {
62 1 unsigned char get_data; /*读出数据的暂存器*/
63 1 cs=0; /*使能SJA1000*/
64 1 get_data=*(sja_base_adr+sja_adr);
65 1 return(get_data);
66 1 }
67 /********************************************************************************************/
68 //函数名称:sja_connect_judge
69 //函数功能:判断单片机与CAN控制器的通讯是否成功
70 //入口参数:无
71 //出口参数:连接是否成功
72 //****备注:SJA1000的基本操作,和硬件有关,操作测试寄存器(地址:9)
73 bit sja_connect_judge(void)
74 {
75 1 write_can(0x09,0xcf);
76 1 if(read_can(0x09)==0xcf)
77 1 {
78 2 return(right);
79 2 }
80 1 else
81 1 {
82 2 return(error);
83 2 }
84 1 }
85 /********************************************************************************************/
86 //函数名称:set_rst_mode
87 //函数功能:设置SJA工作在复位模式
88 //入口参数:无
89 //出口参数:无
90 //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
91 void set_rst_mode(void)
92 {
93 1 unsigned char control_reg_num; /*定义变量,用于存放向控制寄存器写入的数据*/
94 1 control_reg_num=read_can(0x00); /*先读控制寄存器的值*/
95 1 control_reg_num=control_reg_num|0x01; /*将(控制寄存器.0)置1,即设为复位模式*/
96 1 write_can(0x00,control_reg_num); /*写入SJA1000*/
97 1 while(sja_mode)
98 1 {
99 2 if(read_can(0x00)&0x01==1)
100 2 {
101 3 sja_mode=0; /*置复位成功*/
102 3 }
103 2 else
104 2 {
105 3 sja_mode=1; /*置复位失败*/
106 3 }
107 2 }
108 1 }
109 /********************************************************************************************/
110 //函数名称:set_work_mode
111 //函数功能:设置SJA工作在工作模式
112 //入口参数:无
113 //出口参数:无
114 //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
115 void set_work_mode(void)
116 {
117 1 unsigned char control_reg_num;
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 3
118 1 control_reg_num=read_can(0x00);
119 1 control_reg_num=control_reg_num&0xfe; /*设置工作模式的数值,允许各个中断*/
120 1 while(sja_mode==0)
121 1 {
122 2 write_can(0x00,control_reg_num);
123 2 if((read_can(0x00)&0x01)==0)
124 2 {
125 3 sja_mode=1;
126 3 }
127 2 else
128 2 {
129 3 sja_mode=0;
130 3 }
131 2 }
132 1 }
133 /********************************************************************************************/
134 //函数名称:set_tra_rate
135 //函数功能:设置SJA的数据传输速率
136 //入口参数;sja_btr0,sja_btr1
137 //出口参数:设置是否成功
138 //****备注:SJA1000的基本操作,和硬件有关,操作总线定时器0、1(地址:6、7)
139 // *只能在复位模式下设置
140 // BTR0(地址:6)定义了数据传输速率预设值BRP和同步跳变宽度SJW,各位如下:
141 // ---------------------------------------------------------------
142 // 位 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
143 // ---------------------------------------------------------------
144 // 功能 | SJW1 | SJW0 | BRP5 | BRP4 | BRP3 | BRP2 | BRP1 | BRP0 |
145 // ---------------------------------------------------------------
146 // CAN的系统时钟Tscl=2*Tclk*(BRP+1),Tclk是SJA1000外部晶振的周期.同步跳变宽度SJW是为
147 // 补偿其在不同的总线控制的时钟振荡器之间的相位偏移,任何总线控制器必须在当前传送的
148 // 相位信号边沿重新同步。同步跳转宽度定义了每一位周期误差量。Tsjw=Tscl*(SJW+1)
149 // BTR1(地址:7)定义每个位的长度、采样点的位置和采样点的采样数目,各位如下:
150 // ----------------------------------------------------------------------
151 // 位 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
152 // ----------------------------------------------------------------------
153 // 功能 | SAM |TSEG2.2|TSEG2.1|TSEG2.0|TSEG1.3|TSEG1.2|TSEG1.1|TSEG1.0|
154 // ----------------------------------------------------------------------
155 // SAM为1,总线采样3次,用在低/中速总线,起到数字滤波的作用。SAM为0,总线采样1次,在
156 // 高速总线上使用。TSEG1和TSEG2确定每一位占用的时间和具体采样点的位置
157 // Tsyncseg=Tscl;Ttseg1=Tscl*TSEG1;Ttseg2=Tscl*TSEG2;
158 // 位周期: Tbit=(Tsyncseg+Ttseg1+Ttseg2)加减Tsjw
159 // 数据传输速率:f=1/Tbit
160 bit set_tra_rate(void)
161 {
162 1 while(sja_mode)
163 1 {
164 2 set_rst_mode();
165 2 }
166 1 write_can(0x06,sja_btr0);
167 1 write_can(0x07,sja_btr1);
168 1 if((read_can(0x06)==sja_btr0)&(read_can(0x07)==sja_btr1))
169 1 {
170 2 return(right);
171 2 }
172 1 else
173 1 {
174 2 return(error);
175 2 }
176 1 }
177 /********************************************************************************************/
178 //函数名称:set_data_sel
179 //函数功能:设置SJA接受数据类型
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 4
180 //入口参数:sja_acr,sja_amr
181 //出口参数:是否设置成功
182 //****备注:SJA1000的基本操作,和硬件有关,操作验收代码寄存器ACR(地址:4)和验收屏蔽寄存器AMR(地址:5)
183 // *只能在复位模式下设置
184 // CAN总线的数据不带目标地址,以广播的形式在总线上传播.每个设备通过设置验收代码寄存器ACR和
185 // 验收屏蔽寄存器AMR选择来自特定设备的数据.总线上的信息首先进入过滤逻辑,只有当信息的标识
186 // 符位和接收过滤寄存器中的值相同时才送入RXFIFO。接收过滤寄存器的值由验收代码寄存器和验收
187 // 屏蔽寄存器的内容决定。当屏蔽寄存器的某个位为0时,表示接收时对应位接受检测;当屏蔽寄存器
188 // 的某位为1时,表示对应位被屏蔽(不接受检测)。接收信息的标识符必须满足最高8位与屏蔽寄存
189 // 器的8位对应,没有被屏蔽的位必须与接收码寄存器的对应位一致,才被接收并送入RXFIFO,信息才
190 // 被接受。通过过滤的信息被存入RXFIFO中,当整个信息完全被接收后,接收状态标志位被置为1;当
191 // 接收中断请求允许时,置位接收中断请求标志将发送接收中断请求。
192 bit set_data_sel(void)
193 {
194 1 while(sja_mode)
195 1 {
196 2 set_rst_mode();
197 2 }
198 1 write_can(0x04,sja_acr);
199 1 write_can(0x05,sja_amr);
200 1 if((read_can(0x04)==sja_acr)&(read_can(0x05)==sja_amr))
201 1 {
202 2 return(right);
203 2 }
204 1 else
205 1 {
206 2 return(error);
207 2 }
208 1 }
209 /********************************************************************************************/
210 //函数名称:set_clk_mode
211 //函数功能:设置CAN的工作模式,输出信号形式和输出时钟的形式
212 //入口参数:sja_ocr,sja_cdr
213 //出口参数:设置是否成功
214 //****备注:SJA1000的基本操作,和硬件有关,操作输出控制寄存器OCR(地址:8)和时钟分频寄存器CDR(地址:31)
215 // *只能在复位模式下设置
216 // 输出控制寄存器实现由软件控制不同输出驱动配置的建立,各位如下:
217 // ---------------------------------------------------------------------
218 // 位 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
219 // ---------------------------------------------------------------------
220 // 功能| OCTP1 | OCTN1 |OCPOL1 | OCTP0 | OCTN0 |OCPOL0 |OCMODE1|OCMODE0|
221 // ---------------------------------------------------------------------
222 // 当SJA1000在睡眠模式时,TX0和TX1引脚根据输出控制寄存器的内容输出隐性电平.当SJA1000在复位
223 // 状态时,TX0和TX1引脚悬空。发送数据的时候可以有不同的输出方式,列如下:
224 // ---------------------------------------------------------------------
225 // OCMODE1 | OCMODE0 | 说明
226 // ---------------------------------------------------------------------
227 // 0 | 0 | 双向输出模式
228 // ---------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -