📄 sja_interface.c
字号:
// 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 + -