视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
can总线程序
2025-09-29 00:06:11 责编:小OO
文档
can总线程序

我的一些小程序模块 2007-12-06 18:44:18 阅读5 评论0   字号:大中小 订阅 

调试好的can总线程序(c语言)

 //**********程序功能************************************************

//节点1向CAN节点2发送数据,数据的头两个字节分别是:节点1的ID和要求节点2回复的数据长度

//节点2收到节点1的信息后,立即按照节点1的要求回复数据

#i nclude 

#i nclude                            //SJA存储器定义头文件

#i nclude                            //SJA子程序文件

#i nclude                               //显示头文件

#i nclude         //字符串函数

//***************************头文件***************************************************//

void Init_Cpu(void);                                //初始化单片机

void Sja_1000_Init(void);                           //初始化SIA

//************************************************************************************

bit s;                                              //配置sja标志

bit flag_send;                                      //发送命令标志

unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05}; //显示"5"

unsigned char b[5]={0x12,0x12,0x12,0x12,0x12};      //显示"p"

unsigned char c[5]={0x01,0x01,0x01,0x01,0x01};      //显示"1"

unsigned char data  send_data[10],rcv_data[10];     //发送和接收数组

unsigned char bdata flag_init;                      //保存中断寄存器值

unsigned int count_k;                               //延时记数用

sbit rcv_flag=flag_init^0;                          //接收中断标志

sbit err_flag=flag_init^2;                          //错误中断标志

//***********************************************************************************//

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]=0x;

            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 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;           //开放错误\接收\发送中断

}下载本文

显示全文
专题