📄 sja1000.lst
字号:
218 1 return(setting_success);
219 1 }
220 //------------------------------------------------------------------------------------------------------
221 // 函数类别 SJA1000基本操作
222 // 函数名称 setting_SJA_interrupt
223 // 入口函数 SJA_OIE,SJA_EIE,SJA_TIE,SJA_RIE
224 // 出口函数 setting_success
225 // 操作寄存器 控制寄存器(00)
226 // 函数功能 设置SJA中断类型和中断状态
227 // 特殊要求 只能在复位工作模式下设置
228 //------------------------------------------------------------------------------------------------------
229 bit setting_SJA_interrupt(void)
230 {
231 1 bit setting_success;
232 1 unsigned char CONT_buf,temp=0;
233 1 while(SJA_workmode)
234 1 {
235 2 setting_SJA_resetmode(); //设置SJA工作在复位模式
236 2 }
237 1 CONT_buf=CANREG_read(0x00);
238 1 temp=SJA_OIE;
239 1 temp=temp<<4;
C51 COMPILER V7.06 SJA1000 06/08/2005 22:08:24 PAGE 5
240 1 temp=temp|SJA_EIE;
241 1 temp=temp<<3;
242 1 temp=temp|SJA_TIE;
243 1 temp=temp<<2;
244 1 temp=temp|SJA_RIE;
245 1 temp=temp<<1;
246 1 CONT_buf=(temp&0x1E)|(CONT_buf&0x01);
247 1 CANREG_write(0x00,CONT_buf);
248 1 if(CANREG_read(0x00)==CONT_buf)
249 1 {
250 2 setting_success=1; //滤波器设置成功
251 2 }
252 1 else
253 1 {
254 2 setting_success=0; //滤波器设置失败
255 2 }
256 1 return(setting_success);
257 1 }
258 //------------------------------------------------------------------------------------------------------
259 // 函数类别 SJA1000基本操作
260 // 函数名称 Write_SJAsendBUF
261 // 入口函数 无
262 // 出口函数 setting_success
263 // 操作寄存器 发送缓存器(10-19)状态寄存器02
264 // 函数功能 写发送缓存器
265 // 特殊要求 只能在工作模式下写
266 //------------------------------------------------------------------------------------------------------
267 bit Write_SJAsendBUF(void)
268 {
269 1 bit setting_success=0;
270 1 unsigned char i;
271 1 while(SJA_workmode==0)
272 1 {
273 2 setting_SJA_workingmode(); //设置SJA在工作模式
274 2 }
275 1 if((CANREG_read(0x02)&0x10)==0)
276 1 {
277 2 if((CANREG_read(0x02)&0x04)!=0)
278 2 {
279 3 CANREG_write(0x10,send_BUF.FrameID_H);
280 3 CANREG_write(0x11,(send_BUF.FrameLENTH<<4)||(send_BUF.FrameKIND<<3)||(send_BUF.FrameID_L3));
281 3 if(send_BUF.FrameKIND==0)
282 3 {for(i=0;i<send_BUF.FrameLENTH,i<8;i++)
283 4 CANREG_write(0x12+i,send_BUF.Frame_Data[i]);
284 4 }
285 3 setting_success=1; //发送寄存器写成功
286 3 }
287 2 }
288 1 return(setting_success);
289 1 }
290
291 //------------------------------------------------------------------------------------------------------
292 // 函数类别 SJA1000基本操作
293 // 函数名称 Write_SJAsendBUF
294 // 入口函数 无
295 // 出口函数 setting_success
296 // 操作寄存器 接收缓存器(20-29)状态寄存器02
297 // 函数功能 写发送缓存器
298 // 特殊要求 只能在工作模式下写
299 //------------------------------------------------------------------------------------------------------
300 bit read_SJAreceiveBUF(void)
301 {
C51 COMPILER V7.06 SJA1000 06/08/2005 22:08:24 PAGE 6
302 1 bit setting_success=0;
303 1 unsigned char i;
304 1 while(SJA_workmode==0)
305 1 {
306 2 setting_SJA_workingmode(); //设置SJA在工作模式
307 2 }
308 1 if((CANREG_read(0x02)&0x01)!=0)
309 1 {
310 2 if((CANREG_read(0x02)&0x10)==0)
311 2 {
312 3 receive_BUF.FrameID_H=CANREG_read(0x20);
313 3 receive_BUF.FrameLENTH=((CANREG_read(0x21)&0xF0)>>4);
314 3 receive_BUF.FrameKIND=((CANREG_read(0x21)&0x08)>>3);
315 3 receive_BUF.FrameID_L3=(CANREG_read(0x21)&0x07);
316 3 if(receive_BUF.FrameKIND==0)
317 3 {for(i=0;i<receive_BUF.FrameLENTH,i<8;i++)
318 4 receive_BUF.Frame_Data[i]=CANREG_read(0x22+i);
319 4 }
320 3 setting_success=1; //接收寄存器读成功
321 3 }
322 2 }
323 1 return(setting_success);
324 1 }
325 //------------------------------------------------------------------------------------------------------
326 // 函数类别 供调用子程序
327 // 函数名称 SJA1000_init
328 // 入口函数 无
329 // 出口函数 无
330 // 操作寄存器 1)控制寄存器(地址00)
331 // 2)收代码寄存器ACR(地址04)
332 // 3)验收屏蔽寄存器AMR(地址05)
333 // 4)总线定时寄存器BTR0(地址06)
334 // 5)总线定时寄存器BTR1(地址07)
335 // 6)输出控制寄存器OCR(地址08)
336 // 7)测试寄存器(地址09)
337 // 8)和时钟分频寄存器CDR(地址31)
338 // 函数功能 SJA1000初始化设置
339 // 特殊要求 在复位模式进行,初始化结束进入工作状态
340 //------------------------------------------------------------------------------------------------------
341 void SJA1000_init(void)
342 {
343 1
344 1 while(connect_OK==0)
345 1 {
346 2 SJAconnect_judge(); //检测设备连接
347 2 }
348 1 while(SJA_workmode)
349 1 {
350 2 setting_SJA_resetmode(); //置SJA1000为复位工作模式
351 2 }
352 1 while(setting_SJA_rate()==0)
353 1 {
354 2 setting_SJA_rate(); //设置总线波特率
355 2 }
356 1 while(setting_SJA_dataselect()==0)
357 1 {
358 2 setting_SJA_dataselect(); //设置SJA接收数据的格式(标示位)
359 2 }
360 1 while(setting_SJA_CLK()==0)
361 1 {
362 2 setting_SJA_CLK(); //设置SJA输出始终的形式
363 2 }
C51 COMPILER V7.06 SJA1000 06/08/2005 22:08:24 PAGE 7
364 1 }
365 //------------------------------------------------------------------------------------------------------
366 // 函数类别 中断处理函数
367 // 函数名称 send_interrupt
368 // 入口函数 无
369 // 出口函数 无
370 // 操作寄存器
371 // 函数功能 接收中断处理函数
372 //------------------------------------------------------------------------------------------------------
373 send_interrupt()
374 {
375 1
376 1 }
377 //------------------------------------------------------------------------------------------------------
378 // 函数类别 发送中断处理函数
379 // 函数名称 receive_interrupt
380 // 入口函数
381 // 出口函数
382 // 操作寄存器
383 // 函数功能 发送中断处理函数
384 //------------------------------------------------------------------------------------------------------
385 receive_interrupt()
386 {
387 1
388 1 }
389
390 //------------------------------------------------------------------------------------------------------
391 // 函数类别 中断函数
392 // 函数名称 SJA_INTR
393 // 入口函数 无
394 // 出口函数 无
395 // 操作寄存器 中断寄存器(地址03)
396 // 函数功能 中断分析,判断是什么中断,调用相应的中断处理函数
397 //------------------------------------------------------------------------------------------------------
398 void SJA_INTR() interrupt 0 using 1 //CanBus接口芯片产生中断(INTR0)
399 {
400 1 unsigned char sta;
401 1 unsigned char temp;
402 1 EX0 = 0;
403 1 sta = CANREG_read(3); //读中断寄存器
404 1 temp = sta & 0x20;
405 1 if(temp == 0x20)
406 1 SJA1000_init();
407 1 temp = sta & 0x04;
408 1 if(temp == 0x04)
409 1 SJA1000_init(); //消极错误中断,错误报警中断,均导致重启
410 1 temp = sta & 0x02;
411 1 if(temp == 0x02) //发送中断处理
412 1 {
413 2 send_interrupt();
414 2 }
415 1 temp = sta & 0x01;
416 1 if(temp == 0x01) //接收中断,接收数据
417 1 {
418 2 receive_interrupt();
419 2 }
420 1 EX0 = 1;
421 1 }
422
423
424
425 main()
C51 COMPILER V7.06 SJA1000 06/08/2005 22:08:24 PAGE 8
426 {
427 1 }
428
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 666 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 38 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 6
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -