📄 sja_interface.lst
字号:
229 // 0 | 1 | 测试输出模式
230 // ---------------------------------------------------------------------
231 // 1 | 0 | 正常输出模式
232 // ---------------------------------------------------------------------
233 // 1 | 1 | 时钟输出模式
234 // ---------------------------------------------------------------------
235 // 时钟分频寄存器用于设置CLKOUT输出的频率,时钟控制寄存器每位的定义如下:
236 // ----------------------------------------------------------------------
237 // 位 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
238 // ----------------------------------------------------------------------
239 // 功能|CAN模式| CBP |RXINTEN| 0 |关闭时钟| CD2 | CD1 | CD0 |
240 // ----------------------------------------------------------------------
241 // CD2~CD0可以在复位模式下访问,也可以在工作模式下访问。用来定义输出时钟CLKOUT的频率.如下:
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 5
242 // ----------------------------------------------------------------------
243 // CD2 | CD1 | CD0 | CLKOUT的频率
244 // ----------------------------------------------------------------------
245 // 0 | 0 | 0 | Fosc/2
246 // ----------------------------------------------------------------------
247 // 0 | 0 | 1 | Fosc/4
248 // ----------------------------------------------------------------------
249 // 0 | 1 | 0 | Fosc/6
250 // ----------------------------------------------------------------------
251 // 0 | 1 | 1 | Fosc/8
252 // ----------------------------------------------------------------------
253 // 1 | 0 | 0 | Fosc/10
254 // ----------------------------------------------------------------------
255 // 1 | 0 | 1 | Fosc/12
256 // ----------------------------------------------------------------------
257 // 1 | 1 | 0 | Fosc/14
258 // ----------------------------------------------------------------------
259 // 1 | 1 | 1 | Fosc
260 // ----------------------------------------------------------------------
261 // RXINTEN置1,表示允许TX1输出用来做专用接收中断。当一条接收到的信息成功地通过报文滤波器
262 // TX1就会在接收到帧的最后一位期间,输出一位时间长度的脉冲。
263 // CBP置1,表示终止CAN输入比较器,只有RX0被激活。此时RX1应该连接到一个固定的电平上。
264 // CAN模式用于选择是BasicCAN还是PeilCAN。为0选择BasicCAN;为1选择PeilCAN.
265 bit set_clk_mode(void)
266 {
267 1 while(sja_mode)
268 1 {
269 2 set_rst_mode();
270 2 }
271 1 write_can(0x08,sja_ocr);
272 1 write_can(31,sja_cdr);
273 1 if((read_can(0x08)==sja_ocr)&(read_can(31)==sja_cdr))
274 1 {
275 2 return(right);
276 2 }
277 1 else
278 1 {
279 2 return(error);
280 2 }
281 1 }
282 /********************************************************************************************/
283 //说明:条件编译,在使用到中断的时候,以下程序参与编译
284 //#ifdef USE_INT
285 /********************************************************************************************/
286 //函数名称:set_int
287 //函数功能:设置SJA中断类型和中断状态
288 //入口参数:sja_oie,sja_eie,sja_tie,sja_rie
289 //出口参数:设置是否成功
290 //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
291 // *只能在复位模式下设置
292 // SJA1000有五种中断类型:唤醒中断、数据超载中断、错误中断、发送中断、接收中断。其中
293 // 数据超载中断、错误中断、发送中断和接收中断可以通过设置控制寄存器,选择是否允许中断
294 bit set_int(void)
295 {
296 1 unsigned char buffer=0x00;
297 1 while(sja_mode)
298 1 {
299 2 set_rst_mode();
300 2 }
301 1 buffer=read_can(0x00);
302 1 inttemp_4=sja_oie;
303 1 inttemp_3=sja_eie;
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 6
304 1 inttemp_2=sja_tie;
305 1 inttemp_1=sja_rie;
306 1 buffer=inttemp&0x1f;
307 1 write_can(0x00,buffer);
308 1 if(read_can(0x00)==(buffer|0x20))
309 1 {
310 2 return(right);
311 2 }
312 1 else
313 1 {
314 2 return(error);
315 2 }
316 1 }
317 /********************************************************************************************/
318 //函数名称;set_int_sev
319 //函数功能:中断分析,判断是什么中断,调用相应的中断服务函数
320 //入口参数:无
321 //出口参数:无
322 //****备注:和硬件有关,操作中断寄存器(地址:3)
323 // 中断寄存器给出中断源信息。当有一个或一个以上中断寄存器的位被置为1时,SJA1000通过
324 // INT引脚(低电平有效)向CPU发出中断请求;CPU响应中断请求时,通过读取中断寄存器的内
325 // 容可获得中断源的状态,判断有哪些中断源发了中断请求。当CPU读取中断寄存器内容时,所
326 // 有中断寄存器的位被清除,INT处于悬浮状态(逻辑1)。显然,SJA1000的中断机制是一种单
327 // 线中断,中断优先级和中断查询应由应用软件处理。
328 // SJA1000由休眠状态被唤醒时,会产生一个唤醒中断,以提示CPU进行处理。当出现超载时,
329 // 如果超载中断允许,数据超载中断标志DOI和超载标志位同时被置位。SJA1000接收信息时,
330 // 接收中断标志位RI和接收缓冲寄存器满标志位同时被置位。
331 // 中断寄存器的功能定义如下:
332 // --------------------------------------------------------------------------------------------
333 // 位 | 符号 | 名称 | 取值 | 功能
334 // --------------------------------------------------------------------------------------------
335 // IR.7 | X | 保留 | X | X
336 // --------------------------------------------------------------------------------------------
337 // IR.6 | X | 保留 | X | X
338 // --------------------------------------------------------------------------------------------
339 // IR.5 | X | 保留 | X | X
340 // --------------------------------------------------------------------------------------------
341 // | | | 0 | CPU的任何读操作将清零
342 // IR.4 | WUI | 唤醒中断 |-------------------------------------------------------------
343 // | | | 1 | 当退出休眠状态时置为1
344 // --------------------------------------------------------------------------------------------
345 // | | | 0 | CPU的任何读操作将清零
346 // IR.3 | DOI | 数据超载中断 |-------------------------------------------------------------
347 // | | | 1 |当超载中断允许时,超载标志位的上跳沿置1
348 // --------------------------------------------------------------------------------------------
349 // | | | 0 | CPU的任何读操作将清零
350 // IR.2 | EI | 错误中断 |-------------------------------------------------------------
351 // | | | 1 |当错误中断允许时,错误状态或总线状态位变化将此位置1
352 // --------------------------------------------------------------------------------------------
353 // | | | 0 | CPU的任何读操作将清零
354 // IR.1 | TI | 发送中断 |-------------------------------------------------------------
355 // | | | 1 |当发送中断允许时,发送缓冲寄存器状态的上升沿此位置1
356 // --------------------------------------------------------------------------------------------
357 // | | | 0 | CPU的任何读操作将清零
358 // IR.0 | RI | 接收中断 |-------------------------------------------------------------
359 // | | | 1 |当接收中断允许时,FIFO非空将此位置1
360 // --------------------------------------------------------------------------------------------
361 void set_int_sev(void) interrupt 0
362 {
363 1 unsigned char buffer,temp;
364 1 EX0=0; /*关INT0中断*/
365 1 CAN_bit=1;
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 7
366 1 buffer=read_can(0x03);
367 1 temp=buffer&0x10; /*判断是否是唤醒中断*/
368 1 if(temp==0x20)
369 1 {
370 2 weakup_sev(); /*执行唤醒中断服务程序*/
371 2 }
372 1 temp=buffer&0x08; /*判断是否是数据超载中断*/
373 1 if(temp==0x08)
374 1 {
375 2 data_over_sev(); /*执行数据超载中断服务程序*/
376 2 }
377 1 temp=buffer&0x04; /*判断是否是错误中断*/
378 1 if(temp==0x04)
379 1 {
380 2 wrong_sev(); /*执行错误中断服务程序*/
381 2 }
382 1 temp=buffer&0x02; /*判断是否是发送中断*/
383 1 if(temp==0x02)
384 1 {
385 2 send_sev(); /*执行发送中断服务程序*/
386 2 }
387 1 temp=buffer&0x01; /*判断是否是接收中断*/
388 1 if(temp==0x01)
389 1 {
390 2 receive_sev(); /*执行接收中断服务程序*/
391 2 }
392 1 EX0=1; /*开INT0中断*/
393 1 }
394 /********************************************************************************************/
395 //函数名称:weakup_sev
396 //函数功能:唤醒中断服务程序
397 //入口参数:无
398 //出口参数:无
399 //****备注:无
400 void weakup_sev(void)
401 {
402 1 ;
403 1 }
404 /********************************************************************************************/
405 //函数名称:data_over_sev
406 //函数功能:数据超载中断服务程序
407 //入口参数:无
408 //出口参数:无
409 //****备注:无
410 void data_over_sev(void)
411 {
412 1 ;
413 1 }
414 /********************************************************************************************/
415 //函数名称:wrong_sev
416 //函数功能:错误中断服务程序
417 //入口参数:无
418 //出口参数:无
419 //****备注:无
420 void wrong_sev(void)
421 {
422 1 ;
423 1 }
424 /********************************************************************************************/
425 //函数名称:send_sev
426 //函数功能:发送中断服务程序
427 //入口参数:无
C51 COMPILER V7.50 SJA_INTERFACE 05/24/2007 16:12:27 PAGE 8
428 //出口参数:无
429 //****备注:无
430 void send_sev(void)
431 {
432 1 ;//send_bit=1;
433 1 }
434 /********************************************************************************************/
435 //函数名称:receive_sev
436 //函数功能:接受中断服务程序
437 //入口参数:无
438 //出口参数:无
439 //****备注:无
440 void receive_sev(void)
441 {
442 1 rece_bit=1;
443 1 }
444 /********************************************************************************************/
445 //#endif
446 /********************************************************************************************/
447 /*************************************END OF FILE********************************************/
448 /********************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 474 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 2
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -