第二部分,因为需要和其他部件通过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