zoukankan      html  css  js  c++  java
  • 基于单片机的CANBUS程序(C语言)

    CAN-bus(Controller Area Network)即控制器局域网,是国际上应用最广泛的现场总线之一。起先,CAN-bus被设计作为汽车环境中的微控制器之间通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。它是一种多主方式的串行通讯总线,基本设计规范要求有较高的位速率,高抗干扰性,而且能够检测出产生的任何错误。信号传输距离达到10Km时,仍然可提供高达5Kbps的数据传输速率。由于CAN串行通讯总线具有这些特性,它很自然的在汽车、制造业以及航空工业中受到广泛应用。以上是我在单片机上调试好的can总线程序

    #include <SJA_nnyt.H> //SJA存储器定义头文件
    #include <SJA_nnyt.C> //SJA子程序文件
    调试好的can总线程序
     //
    void Init_Cpu(void);                                //初始化单片机
    void Sja_1000_Init(void);                           //初始化SIA
    //
    void main(void)
    {   
    
        s=0;                                            //配置sja1000出现错误时,重新初始化
        do{
           Sja_1000_Init();
          }while(s!=0);                                    
        Init_Cpu();                                        //initialize mcu
        flag_init=0x00;                                 //保存中断寄存器值清零
        while(1)
        {
            if(rcv_flag)                                //if there is receive interrupt
            {
                rcv_flag=0;                             //接收标志位清零
                BCAN_DATA_RECEIVE(rcv_data);            //接收数据
                BCAN_CMD_PRG(RRB_CMD);                  //释放接收缓冲区
                flag_send=1;                            //发送命令置位
            }
            if(flag_send)                                
            {
                flag_send=0;                            //发送位清零
                send_data[0]=rcv_data[2];                //接收到的"发送方ID10~ID3"
                send_data[1]=rcv_data[3];               //接收到的"发送方ID2~ID0"和要求的数据长度
                send_data[2]=0x88;
                send_data[3]=0x89;
                BCAN_DATA_WRITE(send_data);             //发送数据
                BCAN_CMD_PRG(TR_CMD);                   //置位发送请求位
                for(count_k=0;count_k<200;count_k++)
                display(a);                             //延时显示"5"
            }
            if (err_flag)                               //错误中断
            {   
                for(count_k=0;count_k<280;count_k++)    
                display(c);                             //错误显示"1"
                err_flag=0;                             //错误标志位清零
                Sja_1000_Init();                        //初始化SJA
                
            }
            display(b);                                 //显示"p"
        }
    }
    
    
    void ex0_int(void) interrupt 0 using 1              //外部中断0
    {
        SJA_BCANAdr=REG_INTERRUPT;                      //指针指向中断寄存器
        flag_init=*SJA_BCANAdr;                         //保持中断寄存器值
    }
    
    void ex0_int(void) interrupt 0 using 1              //外部中断0
    {
        SJA_BCANAdr=REG_INTERRUPT;                      //指针指向中断寄存器
        flag_init=*SJA_BCANAdr;                         //保持中断寄存器值
    }
    
    
    void Init_Cpu(void)                                 //单片机初始化,开放外部中断0
    {
        PX0=1;
        EX0=1;
        EA=1;
    }
    
    void Sja_1000_Init(void)
    {
        s=BCAN_CREATE_COMMUNATION();  //SJA自测
        s=BCAN_ENTER_RETMODEL();      //进入复位
        s=BCAN_SET_BANDRATE(0x04);    //设置波特率100K/S
        s=BCAN_SET_OBJECT(0xaa,0x00); //设置地址ID:550
        s=BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
        s=BCAN_QUIT_RETMODEL();       //退出复位模式
        SJA_BCANAdr=REG_CONTROL;      //地址指针指向控制寄存器
        *SJA_BCANAdr|=0x1e;           //开放错误\接收\发送中断
    } 
  • 相关阅读:
    checkbox的问题整理
    通过阅读ASP.NET MVC5 框架解密 路由的一点心得
    用JS实现避免重复加载相同js文件
    如何给一个网站设置子网站
    Linux环境下Python的安装过程
    linux下更新Python版本并修改默认版本
    【引用】如何读技术类书籍
    专业收藏_资格证书
    ASP.NET单元测试配置文件
    面试收集
  • 原文地址:https://www.cnblogs.com/pd520/p/2774135.html
Copyright © 2011-2022 走看看