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

随机推荐

  1. golang 接口按需获取资源

    场景 爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装. 当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的 ...

  2. 通过DirectXTK,将.obj,.fbx,.dae,等常见三维格式,转换为.cmo格式

    (1)下载DirectXTK项目:https://github.com/microsoft/DirectXTK (2)VS 打开该项目,右键项目,生成依赖性-自定义 (3)勾选MeshContentT ...

  3. Web前端入门第 57 问:JavaScript 数据类型与类型转换

    在程序语言中,数据类型是基础,一切程序都是建立在基础数据之上. 如果说程序如同万丈高楼平地起,那么数据类型就像沙.石.钢筋.水泥等等最基础的原料.一样的高楼,不同的人,用相同的原料,造的方法也会有千般 ...

  4. RBMQ与odoo15的集成

    背景:在对接物联网设备时候常用的协议就是:MQTT.AMQ.https.还有WebSocket,此案例就是针对接物联网设备传输的消息的消费 原理:通过新建守护线程的方式来启动mq服务,来消费设备平台端 ...

  5. Linux环境使用apt-get安装telnet、curl、ifconfig、vim、ping等工具【转】

      当在Linux服务器执行Telnet命令时,如果提示command not found: telnet,说明服务器上并未安装Telnet命令,需要安装此命令.下面介绍在linux服务器如何安装te ...

  6. Redis异常 Invalid argument during startup: unknown conf file parameter

    问题提出 设置 redis 过期事件监听时,需将 notify-keyspace-events的值设置为Ex,故去掉了 notify-keyspace-events Ex'之前的注释符.然而,启动re ...

  7. Hexo博客Next主题更换cdn加速访问

    有时候访问我的博客时,总是会出现cdn.jsdelivr.net无法访问或者访问速度过慢的情况.我的博客园使用的是BNDong/Cnblogs-Theme-SimpleMemory主题,也遇到的这样的 ...

  8. pytorch入门 - 修改huggingface大模型配置参数

    介绍 Hugging Face的Transformers库提供了大量预训练模型,但有时我们需要修改这些模型的默认参数来适应特定任务. 本文将详细介绍如何修改BERT模型的最大序列长度(max_posi ...

  9. 十一、buildroot系统登录配置

    4.6.系统登录 4.6.1.系统登录方式配置 1.系统初始化配置选择 配置路径 : → System configuration → Init system 配置参数说明: BusyBox 简介:B ...

  10. 在浏览器中清除缓存和 Cookies

    清除浏览器缓存和 Cookie 的说明 大多数浏览器中按 Ctrl+Shift+Delete 键打开菜单以清除缓存和 Cookie.如果此步骤不起作用,请在下面选择浏览器类型了解详细说明. Inter ...