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

📄 sja1000.c

📁 can 控 制 器 初 石 化 程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -