📄 sja1000.c
字号:
if(run_lamp)
{ run_lamp = 0; run_lamp_flush_time = 0; }
else
{ run_lamp = 1; run_lamp_flush_time = 40; }
run_lamp_flush_count = 0;
}
else
run_lamp_flush_count++;
// 重载数据
TL0 = timer0_dl; //装载定时器0数据
TH0 = timer0_dh;
TR0=1;
}
/*****************************************************************************************
函数名称: void Main_Init_Self()
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: 单片机自身初始化
输入参数:
输出参数:
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
void Main_Init_Self()
{
TMOD=0x11; // 定时器1工作在模式2,自动再装入的8位计数器
// 定时器0工作在模式1,16位计数器
TL0=timer0_dl; // 装载定时器0数据
TH0=timer0_dh;
ET0=1; // 开定时器0中断
TR0=1; // 启动定时器0
EA=1;
}
/*****************************************************************************************
函数名称: void SJA1000_WRITE(unsigned char ADDRESS,unsigned char A_DATA)
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: 该函数用于CAN控制器写入一个数据
输入参数: unsigned char ADDRESS: 地址
unsigned char A_DATA: 数据
输出参数:
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
void SJA1000_WRITE(unsigned char ADDRESS,unsigned char A_DATA)
{
SJA1000_CS_PIN = 0; // 开片选-SJA1000的CS信号线(低电平有效)
SJA1000_DATE_PORT = ADDRESS; // 地址到SJA1000口
SJA1000_ALE_PIN = 1; // 开锁地址-SJA1000的ALE信号线(高电平有效)
SJA1000_ALE_PIN = 0; // 关锁地址-SJA1000的ALE信号线(高电平有效)
SJA1000_DATE_PORT = A_DATA; // 数据到SJA1000口
SJA1000_WR_PIN = 0; // 开写信号-SJA1000的WR信号线(低电平有效)
SJA1000_WR_PIN = 1; // 关写信号-SJA1000的WR信号线(低电平有效)
SJA1000_CS_PIN = 1; // 关片选-SJA1000的CS信号线(低电平有效)
}
/*****************************************************************************************
函数名称: unsigned char SJA1000_READ(unsigned char ADDRESS)
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: 该函数用于CAN控制器读出一个数据
输入参数: unsigned char ADDRESS: 地址
输出参数: 读出的数据
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
unsigned char SJA1000_READ(unsigned char ADDRESS)
{
unsigned char SJA1000_PORT = 0;
SJA1000_CS_PIN = 0; // 开片选-SJA1000的CS信号线(低电平有效)
SJA1000_DATE_PORT = ADDRESS; // 地址到SJA1000口
SJA1000_ALE_PIN = 1; // 开锁地址-SJA1000的ALE信号线(高电平有效)
SJA1000_ALE_PIN = 0; // 关锁地址-SJA1000的ALE信号线(高电平有效)
SJA1000_DATE_PORT = 0xFF; // 准备读入数据
SJA1000_RD_PIN = 0; // 开读信号-SJA1000的RD信号线(低电平有效)
SJA1000_PORT = SJA1000_DATE_PORT; // 读SJA1000口的数据
SJA1000_RD_PIN = 1; // 关读信号-SJA1000的RD信号线(低电平有效)
SJA1000_CS_PIN = 1; // 关片选-SJA1000的CS信号线(低电平有效)
return SJA1000_PORT; // 返回读出的数据
}
/*****************************************************************************************
函数名称: void Init_SJA1000_HardWare(void)
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: SJA1000硬件初始化系统
输入参数:
输出参数:
函数扇出清单:
函数扇入清单:
其它说明:
sbit SJA1000_ALE_PIN = P1^0; // SJA1000的ALE信号线
sbit SJA1000_CS_PIN = P1^4; // SJA1000的CS信号线
sbit SJA1000_RD_PIN = P1^5; // SJA1000的RD信号线
sbit SJA1000_WR_PIN = P1^6; // SJA1000的WR信号线
sbit SJA1000_RST_PIN = P1^2; // SJA1000的RST信号线
sbit SJA1000_INT_PIN = P1^3; // SJA1000的INT信号线
#define SJA1000_DATE_PORT P3 // SJA1000的地址、数据线
*****************************************************************************************/
void Init_SJA1000_HardWare(void)
{
unsigned int delay;
for(delay=0;delay<30000;delay++); // 复位延时
SJA1000_RST_PIN = 0; // SJA1000的RST信号线(低电平有效)
for(delay=0;delay<30000;delay++); // 复位延时
SJA1000_RST_PIN = 1; // SJA1000的RST信号线(低电平有效)
for(delay=0;delay<30000;delay++); // 复位延时
SJA1000_ALE_PIN = 0; // SJA1000的ALE信号线(高电平有效)
SJA1000_CS_PIN = 1; // SJA1000的CS信号线(低电平有效)
SJA1000_RD_PIN = 1; // SJA1000的RD信号线(低电平有效)
SJA1000_WR_PIN = 1; // SJA1000的WR信号线(低电平有效)
SJA1000_INT_PIN = 1; // SJA1000的INT信号线(低电平有效)
}
/*****************************************************************************************
函数名称: void Init_SJA1000_Soft(void)
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: SJA1000软件初始化系统
输入参数:
输出参数: 0: 初始化系统成功
>=1: 初始化系统错误
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
unsigned char Init_SJA1000_Soft(void)
{
unsigned char TempData;
unsigned char RSTCOUNT = 0;
while(1)
{
// SJA1000控制: 复位模式
SJA1000_WRITE(REG_MODE,0x01);
TempData = SJA1000_READ(REG_MODE);
if(TempData&0x01 == 0x01) break;
RSTCOUNT++;
if(RSTCOUNT >= 10) return 1;
}
// 测试SJA1000的通信状态
SJA1000_WRITE(REG_TEST,REG_TEST_DATA); //访问测试寄存器写入测试值
TempData = SJA1000_READ(REG_TEST);
if(TempData != REG_TEST_DATA) return 2;
// 初始化时分控制器: PeilCAN模式、CLOCKOFF禁止
SJA1000_WRITE(REG_CDR,REG_CDR_DATA); // 时分控制寄存器
TempData = SJA1000_READ(REG_CDR);
if(TempData != REG_CDR_DATA) return 3;
// 设置输出控制器
SJA1000_WRITE(REG_OCR,REG_OCR_DATA); // 访问地址指向输出控制寄存器
TempData = SJA1000_READ(REG_OCR);
if(TempData != REG_OCR_DATA) return 4;
// 波特率: bps = 100K
SJA1000_WRITE(REG_BTR0,BTR0_Rate_100k); // 访问地址指向总线定时寄存器0
TempData = SJA1000_READ(REG_BTR0);
if(TempData != BTR0_Rate_100k) return 5;
SJA1000_WRITE(REG_BTR1,BTR1_Rate_100k); // 访问地址指向总线定时寄存器1
TempData = SJA1000_READ(REG_BTR1);
if(TempData != BTR1_Rate_100k) return 6;
// 中断控制: 总线错误中断、发送中断、接收中断
SJA1000_WRITE(REG_INTENABLE,REG_INTENABLE_DATA); // 访问中断使能控制
TempData = SJA1000_READ(REG_INTENABLE);
if(TempData != REG_INTENABLE_DATA) return 7;
// 设置滤波器,地址为本地的IP前29位,全匹配
SJA1000_WRITE(REG_ACR1,REG_ACR1_FID); // 验收代码寄存器(ACR1)--IP地址最低位
TempData = SJA1000_READ(REG_ACR1);
if(TempData != REG_ACR1_FID) return 8;
SJA1000_WRITE(REG_ACR2,REG_ACR2_FID); // 验收代码寄存器(ACR2)
TempData = SJA1000_READ(REG_ACR2);
if(TempData != REG_ACR2_FID) return 9;
SJA1000_WRITE(REG_ACR3,REG_ACR3_FID); // 验收代码寄存器(ACR3)
TempData = SJA1000_READ(REG_ACR3);
if(TempData != REG_ACR3_FID) return 10;
SJA1000_WRITE(REG_ACR4,REG_ACR4_FID); // 验收代码寄存器(ACR4)--IP地址最高位
TempData = SJA1000_READ(REG_ACR4);
if(TempData != REG_ACR4_FID) return 11;
SJA1000_WRITE(REG_AMR1,REG_AMR1_FID); // 验收屏蔽寄存器(1屏,0有效)
TempData = SJA1000_READ(REG_AMR1);
if(TempData != REG_AMR1_FID) return 12;
SJA1000_WRITE(REG_AMR2,REG_AMR2_FID); // 验收屏蔽寄存器(1屏,0有效)
TempData = SJA1000_READ(REG_AMR2);
if(TempData != REG_AMR2_FID) return 13;
SJA1000_WRITE(REG_AMR3,REG_AMR3_FID); // 验收屏蔽寄存器(1屏,0有效)
TempData = SJA1000_READ(REG_AMR3);
if(TempData != REG_AMR3_FID) return 14;
SJA1000_WRITE(REG_AMR4,REG_AMR4_FID); // 验收屏蔽寄存器(1屏,0有效)--最低二位不匹配
TempData = SJA1000_READ(REG_AMR4);
if(TempData != REG_AMR4_FID) return 15;
// SJA1000控制
SJA1000_WRITE(REG_MODE,REG_MODE_DATA);
TempData = SJA1000_READ(REG_MODE);
if(TempData != REG_MODE_DATA) return 16;
for(RSTCOUNT=0;RSTCOUNT<200;RSTCOUNT++); // 复位延时
return 0;
}
/*****************************************************************************************
函数名称: unsigned char SJA1000_CMD_PRG(unsigned char cmd)
版本号: 2.52
生成日期: 1900.1.1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -