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

📄 sja1000.c

📁 can 控 制 器 初 石 化 程序
💻 C
📖 第 1 页 / 共 3 页
字号:
作者:          影舞者
功能说明:      执行sja1000命令
输入参数:      cmd:sja1000运行的命令字
              01:发送请求
              02:中止发送
              04:释放接收缓冲区
              08:清除超载状态
              0x10:进入睡眠状态
输出参数:      0 : 表示命令执行成功
              >=1 : 表示命令执行失败
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
unsigned char  SJA1000_CMD_PRG(unsigned char cmd)
{
    switch(cmd)
    {
        case  TXD_ONE_CMD:                        // 产生一次报文发送,当错误时不再生发(单次发送)
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        case  TXD_CMD:                            // 发送请求命令,当错误时可重发
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        case  T_R_CMD:                            // 产生一次自接收性质的报文发送,发送错误时不会重发
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        case  AT_CMD:                             // 中止发送命令
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        case  RRB_CMD:                            // 释放接收缓冲区
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        case  COS_CMD:                            // 数据溢出清除命令
                SJA1000_WRITE(REG_COMMAND,cmd);   //访问地址指向命令寄存器
                return    0;

        default:
                return    1;
    }

    return 2;
}





/*****************************************************************************************
函数名称:      unsigned char  SJA1000_DATA_SEND(unsigned char *SendDataBuf)
版本号:        2.52
生成日期:      1900.1.1
作者:          影舞者
功能说明:      本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否
输入参数:      unsigned char * SendDataBuf:  报文
              unsigned int Message_Longth:  报文长度
              unsigned char CH_RTR:         0-数据帧、1-远程帧

输出参数:      0  表示将数据成功的送至发送缓冲区
              >=1  表示上一次的数据正在发送,
函数扇出清单:
函数扇入清单:
其它说明:      unsigned char *SendDataBuf:  为一帧完整的报文
发送报文:
    同步头      4字节   A5h,5Ah,A5h,5Ah
    帧长度      2字节   N+9 + 8 (高位在前,低位在后)
    目标IP      4字节   范围为  Device_IP_1.Device_IP_2.Device_IP_3.Device_IP_4
    源IP      4字节   范围为  Device_IP_1.Device_IP_2.Device_IP_3.Device_IP_4
    命令码      1字节   0--255
    数据区      N字节
    校验码      2字节   校验数据(高位在前,低位在后,从同步头到数据区的累加和)
*****************************************************************************************/
unsigned char  SJA1000_DATA_SEND(unsigned char * SendDataBuf,unsigned int Message_Longth,unsigned char CH_RTR)
{
    unsigned char TempData;

    TempData = SJA1000_READ(REG_STATUS);   //访问地址指向状态寄存器

      if((TempData&0x10) == 1)               //判断是否正在接收
        return    1;
    else if((TempData&0x08) == 0)          //判断上次发送是否完成
        return    2;
    else if((TempData&0x04)==0)            //判断发送缓冲区是否锁定
        return    3;


    // CAN发送的帧报文信息: 扩展数据帧,6个数据
    SJA1000_WRITE(REG_TXD_FID,0x88);

    // CAN发送的标识
    SJA1000_WRITE(REG_TXD_ID1,SEND_ACR1_FID);
    SJA1000_WRITE(REG_TXD_ID2,SEND_ACR2_FID);
    SJA1000_WRITE(REG_TXD_ID3,SEND_ACR3_FID);
    SJA1000_WRITE(REG_TXD_ID3,SEND_ACR4_FID);

    // CAN发送的数据
    SJA1000_WRITE(REG_TXBuffer1,SendDataBuf[0]);
    SJA1000_WRITE(REG_TXBuffer2,SendDataBuf[1]);
    SJA1000_WRITE(REG_TXBuffer3,SendDataBuf[2]);
    SJA1000_WRITE(REG_TXBuffer4,SendDataBuf[3]);
    SJA1000_WRITE(REG_TXBuffer5,SendDataBuf[4]);
    SJA1000_WRITE(REG_TXBuffer6,SendDataBuf[5]);
        SJA1000_WRITE(REG_TXBuffer5,SendDataBuf[6]);
    SJA1000_WRITE(REG_TXBuffer6,SendDataBuf[7]);



    TempData = SJA1000_CMD_PRG(T_R_CMD);       // 产生一次自接收性质的报文发送,发送错误时不会重发
    //TempData = SJA1000_CMD_PRG(TXD_ONE_CMD);   // 产生一次报文发送,当错误时不再生发(单次发送)
    //TempData = SJA1000_CMD_PRG(TXD_CMD);
    if(TempData != 0x00)
        return 10;

    return 0;
}




/*****************************************************************************************
函数名称:      void main()
版本号:        2.52
生成日期:      1900.1.1
作者:          影舞者
功能说明:      主程序入口
输入参数:
输出参数:
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
void main()
{
    unsigned char SendData[8],ReceiveData[13],TempData;
    unsigned char sendflag = 0;
    unsigned int  delaycount;

    SendData[0] = 0x10;
    SendData[1] = 0x11;
    SendData[2] = 0x12;
    SendData[3] = 0x13;
    SendData[4] = 0x14;
    SendData[5] = 0x15;
    SendData[6] = 0x16;
    SendData[7] = 0x17;

    Main_Init_Self();         // 单片机自身初始化
    Init_SJA1000_HardWare();  // SJA1000硬件初始化系统



    TempData = Init_SJA1000_Soft();       // SJA1000软件初始化系统
    while(TempData != 0x00)
        TempData = Init_SJA1000_Soft();   // SJA1000软件初始化系统

    TempData = SJA1000_DATA_SEND(SendData,0,0);
    while(TempData != 0x00)   _nop_();

    sendflag = 1;             // 发送完毕标识



    while(1)
    {
        if(sendflag == 0)
        {
            for(delaycount=0;delaycount<60000;delaycount++);
            for(delaycount=0;delaycount<60000;delaycount++);
            for(delaycount=0;delaycount<60000;delaycount++);
            for(delaycount=0;delaycount<60000;delaycount++);

            TempData = SJA1000_DATA_SEND(SendData,0,0);
            while(TempData != 0x00)   _nop_();

            sendflag = 1;           // 发送完标识
        }

        if(SJA1000_INT_PIN == 0)                      // 有中断产生
        {
            TempData = SJA1000_READ(REG_INTERRUPT);   // 访问中断寄存器

            if((TempData&0x80) == 0x80)               // 总线错误中断
            {
                //SJA1000_CMD_PRG(AT_CMD);
                Init_SJA1000_HardWare();            // SJA1000硬件初始化系统
                TempData = Init_SJA1000_Soft();       // SJA1000软件初始化系统
                while(TempData != 0x00)
                    TempData = Init_SJA1000_Soft();   // SJA1000软件初始化系统

                sendflag = 0;                         // 可以发送标识

                //TempData = SJA1000_DATA_SEND(SendData,0,0);
                //while(TempData != 0x00)
                //    _nop_();
            }
            if((TempData&0x08) == 0x08)          // 数据溢出中断
            {
                TempData = Init_SJA1000_Soft();       // SJA1000软件初始化系统
                while(TempData != 0x00)
                    TempData = Init_SJA1000_Soft();   // SJA1000软件初始化系统

                sendflag = 0;                         // 可以发送标识
            }
            if((TempData&0x04) == 0x04)          // 出错报警中断
            {
                TempData = Init_SJA1000_Soft();       // SJA1000软件初始化系统
                while(TempData != 0x00)
                    TempData = Init_SJA1000_Soft();   // SJA1000软件初始化系统

                sendflag = 0;                         // 可以发送标识
            }
            if((TempData&0x02) == 0x02)          // 发送完成中断
            {
                _nop_();
                _nop_();
                _nop_();

                sendflag = 0;                         // 可以发送标识
            }
            if((TempData&0x01) == 0x01)          // 接收有效中断
            {
                ReceiveData[0] = 0x00;
                ReceiveData[1] = 0x00;
                ReceiveData[2] = 0x00;
                ReceiveData[3] = 0x00;
                ReceiveData[4] = 0x00;
                ReceiveData[5] = 0x00;
                ReceiveData[6] = 0x00;
                ReceiveData[7] = 0x00;
                ReceiveData[8] = 0x00;
                ReceiveData[9] = 0x00;
                ReceiveData[10] = 0x00;
                ReceiveData[11] = 0x00;
                ReceiveData[12] = 0x00;


                ReceiveData[0] = SJA1000_READ(REG_RXD_FID);
                ReceiveData[1] = SJA1000_READ(REG_RXD_ID1);
                ReceiveData[2] = SJA1000_READ(REG_RXD_ID2);
                ReceiveData[3] = SJA1000_READ(REG_RXD_ID3);
                ReceiveData[4] = SJA1000_READ(REG_RXD_ID4);
                ReceiveData[5] = SJA1000_READ(REG_RXBuffer1);
                ReceiveData[6] = SJA1000_READ(REG_RXBuffer2);
                ReceiveData[7] = SJA1000_READ(REG_RXBuffer3);
                ReceiveData[8] = SJA1000_READ(REG_RXBuffer4);
                ReceiveData[9] = SJA1000_READ(REG_RXBuffer5);
                ReceiveData[10] = SJA1000_READ(REG_RXBuffer6);
                ReceiveData[11] = SJA1000_READ(REG_RXBuffer7);
                ReceiveData[12] = SJA1000_READ(REG_RXBuffer8);

                SJA1000_CMD_PRG(RRB_CMD);
            }
        }
    }
}

⌨️ 快捷键说明

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