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

📄 jd1a.c

📁 美国wind river 公司的CAN总线源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   if(CAN_STATUS & 0x10)
   {
      ch=CAN_INTERRUPT;
   }

}

void testhardware()
{
    unsigned char ch,i;

    Xbyte_write(0x00,0x40);
    ch=Xbyte_read(0x00);

}


//X25045 **********************************************************************
//X25045 functions
Xwren_cmd()
{
     SCK=0;
     CS=0;
     Xoutbyte(WREN_INST);
     SCK=0;
     CS=1;
}

/*
Xwrdi_cmd()
{
     SCK=0;
     CS=0;
     Xoutbyte(WRDI_INST);
     SCK=0;
     CS=1;
}
*/

void Xwrsr_cmd(unsigned char ch)
{
     Xwren_cmd();
     SCK=0;
     CS=0;
     Xoutbyte(WRSR_INST);
     Xoutbyte(ch);
     SCK=0;
     CS=1;
}

unsigned char Xrdsr_cmd()
{
     unsigned char ch;
     SCK=0;
     CS=0;
     Xoutbyte(RDSR_INST);
     ch=Xinbyte();
     SCK=0;
     CS=1;
     return (ch);
}
Xwip_poll()
{
     unsigned char i,ch;
     for(i=0;i<MAX_POLL;i++){
        ch=Xrdsr_cmd();
        if(!(ch&0x01)) break;
     }
     return;
}
//Write a byte to the address of addr in x25045
Xbyte_write(unsigned int addr,unsigned char byte)
{
    unsigned char ch;
    Xwren_cmd();
    SCK=0;
    CS=0;
    ch=WRITE_INST;
    if(addr&0x0100)
      { ch|=0x08; }
    else
      { ch&=0xf7; }
    Xoutbyte(ch);
    ch=addr&0xff;
    Xoutbyte(ch);
    Xoutbyte(byte);
    SCK=0;
    CS=1;
    Xwip_poll();
}
//Read a byte from the address of addr in 25045
unsigned char Xbyte_read(unsigned int addr)
{
    unsigned char ch;
//    Xwren_cmd();
    SCK=0;
    CS=0;
    ch=READ_INST;
    if(addr&0x0100)
      { ch|=0x08; }
    else
      { ch&=0xf7; }
    Xoutbyte(ch);
    ch=addr&0xff;
    Xoutbyte(ch);
    ch=Xinbyte();
    SCK=0;
    CS=1;
    return(ch);

}
//Output a byte to X5045P
void Xoutbyte(unsigned char byte)
{
    unsigned char i,ch;
    ch=byte;
    for(i=0;i<8;i++){
       SCK=0;
       if(ch&0x80) SI=1;
       else SI=0;
       ch<<=1;
       SCK=1;
    }
    SI=0;
}
//Input a byte from 25045
unsigned char Xinbyte()
{
    unsigned char i,ch;
    bit so;
    for(i=0;i<8;i++){
       ch<<=1;
       SCK=1;
       SCK=0;
       so=SO;
       if(so) { ch=ch|0x01; }
       else { ch=ch&0xfe; }
    }
    return ch;
}

//Reset the watch-dog counter of the 25045
void rst_dog()
{
   CS=0;
   CS=1;
}
// End of the functions of X5045P *********************************************************

//CAN BUS Functions ***************************************************************************
void InitSJA1000(bit ResetStyle)
{
    EX0 = 0;    //Disable interrupt from sja1000
//复位 SJA1000
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_ENTER_RETMODEL ())
          continue;
        else{
          ErrorFlag=0;
          break;
        }
     } //结束while 循环
     if(ErrorFlag){
       nop=1;
       return;
     }

    CAN_COMMAND = 0x0E;//Command Register: Rv Rv Rv GTS   CDO RRB AT TR
    _nop_();
    CAN_ACR = 0x80;
    _nop_();

    CAN_AMR = 0x7f;//Receive all messages
    _nop_();

//   0x81,0xfa, //;200KBPS 的预设值
    CAN_BTR0 = 0x81;
    _nop_();
    CAN_BTR1 = 0xfa;
    _nop_();

    BCAN_SET_OUTCLK(0xAA,0x48);
    _nop_();

    CAN_CONTROL = 0x1E;
    _nop_();
    while((CAN_CONTROL&0x01)==1)
    {
        CAN_CONTROL = 0x1E;
    }
    if(ResetStyle)
    {
        EX0 = 1;
        EA = 1;
    }
//    return 1;
}

void TestSJA1000(void)
{
//检测CAN 控制器的接口是否正常
     while(uchERRORCOUNT--){
         if(BCAN_CREATE_COMMUNATION())
           continue;
         else{
           ErrorFlag=0; //通讯成功
           break;
         }
     } //结束while 循环
     if(ErrorFlag){
       nop=1;
     }
     else{
       nop=0;
     }

//测试 CAN 控制器进入复位工作模式
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_ENTER_RETMODEL ())
          continue;
        else{
          ErrorFlag=0;
          break;
        }
     } //结束while 循环
     if(ErrorFlag){
       nop=1;
     }
     else{
       nop=0;
     }

//该函数用使CAN 控制器退出复位工作模式
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_QUIT_RETMODEL ())
           continue;
        else{
           ErrorFlag=0;
        break;
        }
     } //结束while 循环
     if(ErrorFlag){
       nop=1;
     }
     else{
       nop=0;
     }

//设置CAN 总线系统的波特率为100kbps
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_SET_BANDRATE (0x06)) //设置CAN 总线系统波特率100kbps
           continue;
        else{
           ErrorFlag=0;
           break;
        }
     } //结束while 循环
     if(ErrorFlag){
       nop=1;
     }
     else{
       nop=0;
     }

//设设置本节点只对报文识别码为10101010xxx 的报文响应
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_SET_OBJECT (0xAA,0x00)) //设置CAN 总线系统波特率100kbps
           continue;
        else{
           ErrorFlag=0;
           break;
        }
     } //结束while 循环
     if(ErrorFlag){
        nop=1;
     }
     else{
        nop=0;
     }

//设置本节点的输出控制为正常输出,时钟分频为 '0x48'
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_SET_OUTCLK(0xAA,0x48))
           continue;
        else{
           ErrorFlag=0;
           break;
        }
     } //结束while 循环
     if(ErrorFlag){
        nop=1;
     }
     else{
        nop=0;
     }

//将数据发送至发送缓冲区
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_DATA_WRITE (uchSendBuff)) //将uchSendBuff 内的数据写入发送缓冲区
           continue;
        else{
           ErrorFlag=0;
           break;
        }
     } //结束while 循环
     if(ErrorFlag){
        nop=1;
     }
     else{
        nop=0;
     }

//CAN 控制器接收数据,仅限于接收数据
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
         if(BCAN_DATA_RECEIVE (uchRcvBuff)) //将接收数据写入uchRcvBuff
             continue;
         else{
             ErrorFlag=0;
             break;
         }
     } //结束while 循环
     if(ErrorFlag){
        nop=1;
     }
     else{
        nop=0;
     }

//执行sja1000 命令
     uchERRORCOUNT=20; //错误计时器,20 次可自己定义
     ErrorFlag=1; //错误标志
     while(uchERRORCOUNT--){
        if(BCAN_CMD_PRG (RRB_CMD)) //释放接收缓冲区命令
            continue;
        else{
            ErrorFlag=0;
            break;
        }
     } //结束while 循环
     if(ErrorFlag){
         nop=1;
     }
     else{
         nop=0;
     }


}

/*
********************************************************************************************
** 以下基本的函数说明BasicCAN
********************************************************************************************
*/
/*
********************************************************************************************
**函数原型: bit BCAN_CREATE_COMMUNATION(void)
**参数说明: 无
**返回值: 0 ; 表示SJA1000 接口正常
** 1 ; 表示SJA1000 与处理器接口不正常
**说明: 该函数用于检测CAN 控制器的接口是否正常
********************************************************************************************
*/
bit BCAN_CREATE_COMMUNATION(void)
{
    SJA_BCANAdr =REG_TEST; //访问测试寄存器
    *SJA_BCANAdr =0xAA; //写入测试值
    if(*SJA_BCANAdr == 0xAA)
    {
       return 0;
    }
    else
    {
       return 1;
    }
}

/*
********************************************************************************************
**函数原型: bit BCAN_ENTER_RETMODEL(void)
**参数说明: 无
**返回值: 0 ; 表示成功进入复位工作模式
** 1 ; 表示不能进入复位工作模式
**说明: 该函数测试 CAN 控制器进入复位工作模式
********************************************************************************************
*/
bit BCAN_ENTER_RETMODEL(void)
{
    unsigned char TempData;
    SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
    TempData= *SJA_BCANAdr; //保存原始值
    *SJA_BCANAdr=(TempData|0x01); //置位复位请求
    if((*SJA_BCANAdr&0x01) == 1){
       return 0;
    }
    else{
       return 1;
    }
}

/*
********************************************************************************************
**函数原型: bit BCAN_QUIT_RETMODEL(void)
**参数说明: 无
**返回值: 0 ; 表示成功退出复位工作模式
** 1 ; 表示不能退出复位工作模式
**说明: 该函数用使CAN 控制器退出复位工作模式
********************************************************************************************
*/
bit BCAN_QUIT_RETMODEL(void)
{
    unsigned char TempData;
    SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
    TempData = *SJA_BCANAdr; //保存原始值
    *SJA_BCANAdr=(TempData&0xfe); //清除复位请求
    if((*SJA_BCANAdr&0x01) == 0){
       return 0;
    }
    else{
       return 1;
    }
}

/*
********************************************************************************************
**函数原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
**参数说明: R7 波特率Kbit/s BTR0 BTR1
** 0 20 053H 02FH
** 1 40 087H 0FFH
** 2 50 047H 02FH
** 3 80 083H 0FFH
** 4 100 043H 02fH
** 5 125 03H 01cH
** 6 200 081H 0faH
** 7 250 01H 01cH
** 8 400 080H 0faH
** 9 500 00H 01cH
** 10 666 080H 0b6H
** 11 800 00H 016H
** 12 1000 00H 014H
**返回值: 0 ;波特率设置成功
** 1 ;波特率设置失败
**说明: 设置CAN 控制器SJA1000 通讯波特率.SJA1000 的晶振为必须为16MHZ,
** 其它晶体的频率的值的波特率需自己计算该子程序只能用于复位模式
********************************************************************************************
*/
unsigned char code SJA_BTR_CODETAB[]={
   0x53,0x2F, // ;20KBPS 的预设值
   0x87,0xFF, //;40KBPS 的预设值
   0x47,0x2F, //;50KBPS 的预设值
   0x83,0xFF, //;80KBPS 的预设值
   0x43,0x2f, //;100KBPS 的预设值
   0x03,0x1c, //;125KBPS 的预设值
   0x81,0xfa, //;200KBPS 的预设值
   0x01,0x1c, //;250KBPS 的预设值
   0x80,0xfa, //;400KBPS 的预设值
   0x00,0x1c, //;500KBPS 的预设值
   0x80,0xb6, //;666KBPS 的预设值
   0x00,0x16, //;800KBPS 的预设值
   0x00,0x14 //;1000KBPS 的预设值
};
bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
    unsigned char BTR0_num,BTR1_num;
    BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
    BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
//将波特率的的预设值装入sja1000 的总线定时器
    SJA_BCANAdr=REG_BTR0; //访问地址指向总线定时寄存器0
    *SJA_BCANAdr=BTR0_num; //写入参数
    if(*SJA_BCANAdr != BTR0_num) //校验写入值
    {
       return 1;
    }
    SJA_BCANAdr=REG_BTR1; //访问地址指向总线定时寄存器1
    *SJA_BCANAdr=BTR1_num; //写入参数
    if(*SJA_BCANAdr != BTR1_num) //校验写入值
    {
       return 1;
    }
    return 0;
}

/**函数原型: bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,
** unsigned char BCAN_AMR)
**参数说明: BCAN_ACR:存放验收代码寄存器ACR 的参数设置
** BCAN_AMR:存放接收屏蔽寄存器AMR 的参数设置
**返回值: 0 ;通信对象设置成功
** 1 ;通信对象设置失败
**说明: 设置CAN 节点的通讯对象允许接收的报文ID 号的高8 位(D10--D3) 允许接
** 收的报文,是由AMR 和ACR 共同决定的. 满足以下条件的ID 号的报文才可以被接收
** [ ID.10-ID.3 AC.7-AC.0 ]|| AM.7-AM.0 11111111
** 该子程序只能用于复位模式
********************************************************************************************
*/
bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR){
    SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
    *SJA_BCANAdr=BCAN_ACR; //写入参数
    if(*SJA_BCANAdr != BCAN_ACR) { //校验写入值
       return 1;
    }
    SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
    *SJA_BCANAdr=BCAN_AMR; //写入参数
    if(*SJA_BCANAdr != BCAN_AMR) { //校验写入值
       return 1;
    }

⌨️ 快捷键说明

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