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

📄 sja_interface.c

📁 can总线通信程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//                OCMODE1        |      OCMODE0       | 	       说明
//             ---------------------------------------------------------------------
//                   0           |         0          |        双向输出模式
//             ---------------------------------------------------------------------
//                   0           |         1          |        测试输出模式
//             ---------------------------------------------------------------------
//                   1           |         0          |        正常输出模式
//             ---------------------------------------------------------------------
//                   1           |         1          |        时钟输出模式
//             ---------------------------------------------------------------------
//          时钟分频寄存器用于设置CLKOUT输出的频率,时钟控制寄存器每位的定义如下:
//             ----------------------------------------------------------------------
//              位 |  BIT7 | BIT6  | BIT5  | BIT4  | BIT3   | BIT2  | BIT1  | BIT0  |
//             ----------------------------------------------------------------------
//             功能|CAN模式| CBP   |RXINTEN| 0     |关闭时钟| CD2   | CD1   | CD0   |
//             ----------------------------------------------------------------------
//          CD2~CD0可以在复位模式下访问,也可以在工作模式下访问。用来定义输出时钟CLKOUT的频率.如下:
//             ----------------------------------------------------------------------
//                    CD2        |     CD1      |     CD0    |    CLKOUT的频率
//             ----------------------------------------------------------------------
//                     0         |      0       |      0     |       Fosc/2
//             ----------------------------------------------------------------------
//                     0         |      0       |      1     |       Fosc/4
//             ----------------------------------------------------------------------
//                     0         |      1       |      0     |       Fosc/6
//             ----------------------------------------------------------------------
//                     0         |      1       |      1     |       Fosc/8
//             ----------------------------------------------------------------------
//                     1         |      0       |      0     |       Fosc/10
//             ----------------------------------------------------------------------
//                     1         |      0       |      1     |       Fosc/12
//             ----------------------------------------------------------------------
//                     1         |      1       |      0     |       Fosc/14
//             ----------------------------------------------------------------------
//                     1         |      1       |      1     |       Fosc
//             ----------------------------------------------------------------------
//           RXINTEN置1,表示允许TX1输出用来做专用接收中断。当一条接收到的信息成功地通过报文滤波器
//           TX1就会在接收到帧的最后一位期间,输出一位时间长度的脉冲。
//           CBP置1,表示终止CAN输入比较器,只有RX0被激活。此时RX1应该连接到一个固定的电平上。
//           CAN模式用于选择是BasicCAN还是PeilCAN。为0选择BasicCAN;为1选择PeilCAN.
bit set_clk_mode(void)
{
  while(sja_mode)
    {
	  set_rst_mode();
	}
  write_can(0x08,sja_ocr);
  write_can(31,sja_cdr);
  if((read_can(0x08)==sja_ocr)&(read_can(31)==sja_cdr))
   {
     return(right);
   }
  else
   {
     return(error);
   }
}
/********************************************************************************************/
//说明:条件编译,在使用到中断的时候,以下程序参与编译
//#ifdef USE_INT
/********************************************************************************************/
//函数名称:set_int
//函数功能:设置SJA中断类型和中断状态
//入口参数:sja_oie,sja_eie,sja_tie,sja_rie
//出口参数:设置是否成功
//****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
//          *只能在复位模式下设置
//          SJA1000有五种中断类型:唤醒中断、数据超载中断、错误中断、发送中断、接收中断。其中
//          数据超载中断、错误中断、发送中断和接收中断可以通过设置控制寄存器,选择是否允许中断
bit set_int(void)
{
  unsigned char buffer=0x00;
  while(sja_mode)
    {
	  set_rst_mode();
	}
  buffer=read_can(0x00);
  inttemp_4=sja_oie;
  inttemp_3=sja_eie;
  inttemp_2=sja_tie;
  inttemp_1=sja_rie;
  buffer=inttemp&0x1f;
  write_can(0x00,buffer);
  if(read_can(0x00)==(buffer|0x20))
   {
     return(right);
   }
  else
   {
     return(error);
   }
}
/********************************************************************************************/
//函数名称;set_int_sev
//函数功能:中断分析,判断是什么中断,调用相应的中断服务函数
//入口参数:无
//出口参数:无
//****备注:和硬件有关,操作中断寄存器(地址:3)
//          中断寄存器给出中断源信息。当有一个或一个以上中断寄存器的位被置为1时,SJA1000通过
//          INT引脚(低电平有效)向CPU发出中断请求;CPU响应中断请求时,通过读取中断寄存器的内
//          容可获得中断源的状态,判断有哪些中断源发了中断请求。当CPU读取中断寄存器内容时,所
//          有中断寄存器的位被清除,INT处于悬浮状态(逻辑1)。显然,SJA1000的中断机制是一种单
//          线中断,中断优先级和中断查询应由应用软件处理。
//          SJA1000由休眠状态被唤醒时,会产生一个唤醒中断,以提示CPU进行处理。当出现超载时,
//          如果超载中断允许,数据超载中断标志DOI和超载标志位同时被置位。SJA1000接收信息时,
//          接收中断标志位RI和接收缓冲寄存器满标志位同时被置位。
//          中断寄存器的功能定义如下:
//          --------------------------------------------------------------------------------------------
//            位  |  符号  |    名称      |  取值  |             功能
//          --------------------------------------------------------------------------------------------
//           IR.7 |   X    |    保留      |   X    |              X   
//          --------------------------------------------------------------------------------------------
//           IR.6 |   X    |    保留      |   X    |              X
//          --------------------------------------------------------------------------------------------
//           IR.5 |   X    |    保留      |   X    |              X
//          --------------------------------------------------------------------------------------------
//                |        |              |   0    |     CPU的任何读操作将清零
//           IR.4 |  WUI   |  唤醒中断    |-------------------------------------------------------------
//                |        |              |   1    |     当退出休眠状态时置为1
//          --------------------------------------------------------------------------------------------
//                |        |              |   0    |     CPU的任何读操作将清零
//           IR.3 |  DOI   | 数据超载中断 |-------------------------------------------------------------
//                |        |              |   1    |当超载中断允许时,超载标志位的上跳沿置1
//          --------------------------------------------------------------------------------------------
//                |        |              |   0    |     CPU的任何读操作将清零
//           IR.2 |  EI    |  错误中断    |-------------------------------------------------------------
//                |        |              |   1    |当错误中断允许时,错误状态或总线状态位变化将此位置1
//          --------------------------------------------------------------------------------------------
//                |        |              |   0    |     CPU的任何读操作将清零
//           IR.1 |  TI    |  发送中断    |-------------------------------------------------------------
//                |        |              |   1    |当发送中断允许时,发送缓冲寄存器状态的上升沿此位置1
//          --------------------------------------------------------------------------------------------
//                |        |              |   0    |     CPU的任何读操作将清零
//           IR.0 |  RI    |  接收中断    |-------------------------------------------------------------
//                |        |              |   1    |当接收中断允许时,FIFO非空将此位置1
//          --------------------------------------------------------------------------------------------
void set_int_sev(void) interrupt 0 
{
  unsigned char buffer,temp;
  EX0=0;      /*关INT0中断*/
  CAN_bit=1;
  buffer=read_can(0x03);
  temp=buffer&0x10;  /*判断是否是唤醒中断*/
  if(temp==0x20)
   {
     weakup_sev();  /*执行唤醒中断服务程序*/
   }
  temp=buffer&0x08;  /*判断是否是数据超载中断*/
  if(temp==0x08)
   {
     data_over_sev();  /*执行数据超载中断服务程序*/
   }
  temp=buffer&0x04;  /*判断是否是错误中断*/
  if(temp==0x04)
   {
     wrong_sev();   /*执行错误中断服务程序*/
   }
  temp=buffer&0x02;  /*判断是否是发送中断*/
  if(temp==0x02)
   {
     send_sev();   /*执行发送中断服务程序*/
   }
  temp=buffer&0x01;  /*判断是否是接收中断*/
  if(temp==0x01)
   {
     receive_sev();  /*执行接收中断服务程序*/
   }
  EX0=1;   /*开INT0中断*/
}
/********************************************************************************************/
//函数名称:weakup_sev
//函数功能:唤醒中断服务程序
//入口参数:无
//出口参数:无
//****备注:无
void weakup_sev(void)
{
  ;
}
/********************************************************************************************/
//函数名称:data_over_sev
//函数功能:数据超载中断服务程序
//入口参数:无
//出口参数:无
//****备注:无
void data_over_sev(void)
{
  ;
}
/********************************************************************************************/
//函数名称:wrong_sev
//函数功能:错误中断服务程序
//入口参数:无
//出口参数:无
//****备注:无
void wrong_sev(void)
{
  ;
}
/********************************************************************************************/
//函数名称:send_sev
//函数功能:发送中断服务程序
//入口参数:无
//出口参数:无
//****备注:无
void send_sev(void)
{
  ;//send_bit=1;
}
/********************************************************************************************/
//函数名称:receive_sev
//函数功能:接受中断服务程序
//入口参数:无
//出口参数:无
//****备注:无
void receive_sev(void)
{
  rece_bit=1;
}
/********************************************************************************************/
//#endif
/********************************************************************************************/
/*************************************END OF FILE********************************************/
/********************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -