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

📄 sja1000.c

📁 sja1000配置文件
💻 C
📖 第 1 页 / 共 3 页
字号:
    // 运行闪烁
    if(run_lamp_flush_count >= run_lamp_flush_time)
    {
        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
作者:          影舞者
功能说明:      执行sja1000命令
输入参数:      cmd:sja1000运行的命令字

⌨️ 快捷键说明

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