首页 > 其他分享 >STC32G12K128-CAN

STC32G12K128-CAN

时间:2022-11-01 13:57:29浏览次数:46  
标签:pdat RX unsigned char CANWriteReg STC32G12K128 CANReadReg

第二部分,因为需要和其他部件通过CAN进行交互,此处记录一下STC32-CAN驱动部分,毕竟是国产芯片,数据手册看起来非常方便。希望咱们国产芯片越做越好哈

此处参考了芯片手册的例子

//===============================================
//读取CAN相关寄存器
//===============================================
unsigned char CANReadReg(unsigned char addr)
{
    unsigned char dat;
    CANAR = addr;
    dat = CANDR;
    return dat;
}
//===============================================
//写入CAN相关寄存器
//===============================================
void CANWriteReg(unsigned char addr,unsigned char dat)
{
    CANAR = addr;
    CANDR = dat;
}
//===============================================
//读取接收buffer
//===============================================
void CANReadFifo(unsigned char *pdat)
{
    pdat[0] = CANReadReg(RX_BUF0);
    pdat[1] = CANReadReg(RX_BUF1);
    pdat[2] = CANReadReg(RX_BUF2);
    pdat[3] = CANReadReg(RX_BUF3);
    
    pdat[4] = CANReadReg(RX_BUF0);
    pdat[5] = CANReadReg(RX_BUF1);
    pdat[6] = CANReadReg(RX_BUF2);
    pdat[7] = CANReadReg(RX_BUF3);
    
    pdat[8] = CANReadReg(RX_BUF0);
    pdat[9] = CANReadReg(RX_BUF1);
    pdat[10] = CANReadReg(RX_BUF2);
    pdat[11] = CANReadReg(RX_BUF3);
    
    pdat[12] = CANReadReg(RX_BUF0);
    pdat[13] = CANReadReg(RX_BUF1);
    pdat[14] = CANReadReg(RX_BUF2);
    pdat[15] = CANReadReg(RX_BUF3);
}
//===============================================
//读取接收报文,标准帧
//===============================================
unsigned short CAN_RecMsg(unsigned char *pdat)
{
    unsigned char i;
    unsigned short CANID;
    unsigned char buffer[16];
    
    CANReadFifo(buffer);
    CANID = buffer[1]<<8 + buffer[2]>>5;//标准帧
    for(i=0;i<8;i++)
    {
        pdat[i] = buffer[i+3];
    }
    return CANID;
}
//===============================================
//发送报文,标准帧
//===============================================
void CAN_SendMsg(unsigned short canid, unsigned char *pdat)
{
    unsigned short CANID;

    CANID = canid<<5;
    CANWriteReg(TX_BUF0,0x08);
    CANWriteReg(TX_BUF1,(unsigned char)(CANID>>8));
    CANWriteReg(TX_BUF2,(unsigned char)CANID);
    CANWriteReg(TX_BUF3,pdat[0]);
    
    CANWriteReg(TX_BUF0,pdat[1]);
    CANWriteReg(TX_BUF1,pdat[2]);
    CANWriteReg(TX_BUF2,pdat[3]);
    CANWriteReg(TX_BUF3,pdat[4]);
    
    CANWriteReg(TX_BUF0,pdat[5]);
    CANWriteReg(TX_BUF1,pdat[6]);
    CANWriteReg(TX_BUF2,pdat[7]);
    CANWriteReg(TX_BUF3,0x00);
    //开启发送
    CANWriteReg(CMR,0x04);
}
//===============================================
//设置波特率
//===============================================
void CANSetBaudrate()
{
    CANWriteReg(BTR0,(SJW<<6)+BRP);
    CANWriteReg(BTR1,(SAM<<7)+(TSG2<<4) + TSG1);
}
//===============================================
//CAN2初始化
//===============================================
void CAN_init(void)
{
    P_SW1 |= 0x00;    //CAN功能引脚配置,CAN_RX:P0.0,CAN_TX:P0.1
    AUXR2 |= 0x02;    //使能CAN,选择第1组
        
    CANWriteReg(MR,0x04);    //使能reset mode
    //设置波特率500k
    CANSetBaudrate();
    //设置验收代码
    CANWriteReg(ACR0,0x00);
    CANWriteReg(ACR1,0x00);
    CANWriteReg(ACR2,0x00);
    CANWriteReg(ACR3,0x00);
    //设置验收屏蔽
    CANWriteReg(AMR0,0xFF);
    CANWriteReg(AMR1,0xFF);
    CANWriteReg(AMR2,0xFF);
    CANWriteReg(AMR3,0xFF);
    //配置接收中断
    CANWriteReg(IMR,1<<3);
    CANWriteReg(ISR,0xFF);
    CANWriteReg(MR,0x00);
    CANICR |= 0x02;  //CAN中断使能
}
//===============================================
//CAN中断函数
//===============================================
void CANBUS_Interrupt(void) interrupt 28
{
    unsigned char sta;
    AUXR2 |= 0x02;        //选择CAN模块
    sta = CANReadReg(ISR);
    //CANWriteReg(ISR,sta);
    if((sta>>3) & 0x1 == 1)
    {
        CANAR = ISR;
        CANDR |= 1<<3; //清0接收flag
        CAN_recID = CAN_RecMsg(CAN_RXData);    
        CAN_SendMsg(CAN_recID,CAN_RXData); //测试接收功能
    }
    if((sta>>2) & 0x1 == 1)
    {
        CANAR = ISR;
        CANDR = 0x4; //清0发送flag
        
    }
}

 

标签:pdat,RX,unsigned,char,CANWriteReg,STC32G12K128,CANReadReg
From: https://www.cnblogs.com/taotaonihao/p/16847402.html

相关文章

  • STC32G12K128-ADC
    最近开发一个12VBMS的项目,为了降成本和提高开发周期,硬件工程师选择了一款国产MCU作为主控,基本上能满足功能要求项目主要模块就是AD采样,CAN报文发送,故障诊断今天记录一下A......