STC32G12K128-CAN
第二部分,因为需要和其他部件通过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 }
}
随机推荐
- SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)
MCP 官方的 java-sdk 目前要求 java17+(直接使用 sdk 也比较复杂).Spring-AI(有 MCP 内容)也是要求 java17+. SpringBoot2 怎么办? 使用 S ...
- Axis in DataFrame
Axis in DataFrame Optional parameter axis may appear in arithmetric between DataFrame and Series,the ...
- 搭建阅读linux源码的舒适环境(vscode+clangd)
准备linux源码 linux官网下载源码压缩包 https://www.kernel.org/ 解压 由于源码是经过两次压缩的,所以需要解压两次 xz -d linux-6.14.7.tar.xz ...
- 探秘Transformer系列之(35)--- 大模型量化基础
探秘Transformer系列之(35)--- 大模型量化基础 目录 探秘Transformer系列之(35)--- 大模型量化基础 0x00 概述 0x01 outlier 1.1 定义 1.2 特 ...
- thinkphp R方法传参
thinkphp 框架中R方法和A方法很类似. 但是R方法在调用模块且传参数的时候,是有一些需要注意的地方的. R方法在传参数是只能传之前就有的参数,而不能传自定义的或者新增的参数. 例如:A --- ...
- Vue 学习笔记 [Part 2]
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 一. 计算属性 1.1. 计算属性的本质 1.2. 计算属性和methods对比 〇.ES6补充 0.1. let/var 0.2 const ...
- Astah Community安装教程及使用说明(包括括菜单命令解释、操作向导说明、快捷命令说明)
一.安装教程: 1.双击下载好的文件,允许安装(现在官网已经停刊免费的社区版了,如果想要下载社区版需要从其他地方寻找资源) 2.选择安装的语言,English,点击OK 3.next,接受协议,nex ...
- 将AI Bot接入微信,做AI对话机器人
大家好,我是Edison. 之前学习了Coze这个AI Agent智能体开发台创建了一些Agent,除了可以将其发布到微信公众号做对话机器人之外,我看到了许多直接将其集成到微信对话或群聊中的案例. 刚 ...
- 深入掌握iostat:运维必备的I/O性能分析利器
在Linux系统运维中,磁盘I/O性能往往是系统瓶颈的关键来源.iostat作为sysstat工具包中的核心命令,能够实时监控CPU使用率和磁盘I/O统计,是性能诊断不可或缺的工具.本文将全面解析io ...
- robots.txt 简单解析
简介 robots.txt 是一个规范,对于执行正常操作的爬虫理应遵守的规范. 例子 博客园例子 https://www.cnblogs.com/robots.txt User-Agent: * Al ...