RK3568驱动指南|第十六篇 SPI-第190章 配置模式下寄存器的配置

news2024/9/23 14:42:10

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十六篇 SPI_全新升级)_基于RK3568


  1. 第190章 配置模式下寄存器的配置

在前面两个章节中编写了复位函数以及读寄存器函数,向MCP2515发送SPI复位指令之后就会进入配置模式下,只有在配置模式才可以修改以下寄存器:

·CNF1、CNF2 和 CNF3:用于配置波特率

·TXRTSCTRL:用于控制发送请求引脚

·验收过滤寄存器:用于设置验收过滤器

·验收屏蔽寄存器:用于设置验收屏蔽

当然除了上述寄存器只能在配置模式下进行修改之外,在配置模式也是可以对其他寄存器进行修改的,而为了SPI转CAN MCP2515芯片正常工作,需要在配置模式配置以下寄存器:

CNF1、CNF2 和 CNF3:用于配置波特率

RXB0CTRL:接收缓冲器0控制寄存器

CANINTE:中断使能寄存器

接下来对每个寄存器的具体配置原理进行讲解。

190.1 CNF1、CNF2和CNF3寄存器配置

CAN总线上的所有器件都必须使用相同的比特率,而CNF1、CNF2和CNF3三个寄存器就是用来配置CAN总线波特率的,更具体的说明为CNF1、CNF2和CNF3三个寄存器通过对位时间各个段的配置,进而设置CAN总线的波特率。

而位时间(Bit Time)是指一个二进制位在总线上传输所需的时间,它又由4段组成,每段由称为Time Quantum(Tq,时间单位)的最小时间单位构成。如下图所示:

位时间的4个段分别是:

(1)同步段(Synchronization Segment,Sync_Seg)

·用于同步接收器的时钟到传输器的时钟。

·持续1个Tq。

(2)传播时间段(Propagation Time Segment,Prop_Seg)

·用于补偿信号在总线上传输的时间延迟。

·可配置为1到8个Tq。

(3)相位缓冲段 1(Phase Buffer Segment 1,Phase_Seg1)

·用于补偿相位错误和支持重同步跳转。

·可配置为1到8个Tq。

(4)相位缓冲段2(Phase Buffer Segment 2,Phase_Seg2)

·用于补偿相位错误和支持重同步跳转。

·可配置为1到8个Tq。

每个 CAN 报文的二进制数据都通过这些位时间段进行传输。位时间的配置对于 CAN 总线的正确通信至关重要,它影响总线的传输速率、同步和误差处理能力,在数据手册中给出了TQ计算公式,TQ = 2 x (BRP + 1)/FOSC,其中FOSC为MCP2515外设晶振频率8MHZ,BRP为cnf1寄存器设置的预分频系数,可以任意设置,确保最后的TQ为整数即可,这里设置为0x01,然后对TQ进行计算得到TQ=500ns,这时候已经可以确定最小单位TQ的值为500ns,然后指定can的波特率为125K,然后相除就可以得到位时间8000ns/500ns=16个TQ,而在MCP2515的数据手册中要求时间段的设定必须满足以下要求:

(1)传播段 + 相位缓冲段 PS1 >= 相位缓冲段 PS2

(2)传播段 + 相位缓冲段 PS1 >= TDELAY (TDELAY 典型值为 1-2 TQ)

(3)相位缓冲段 PS2 > 同步跳转宽度 SJW(SJW 最大值为 4 TQ,一般取1 TQ即可满足要求)

最终确定各个段的值位:同步段1个TQ,传播段2个TQ,相位缓冲段PS1 7个TQ,相位缓冲段PS2 6个TQ,然后来根据各个段的值确定cnf1、cnf2、cnf3的取值。

CNF1寄存器内容如下图所示:

其中bit7-6为SJW同步跳转宽度位,根据数据手册的描述设置位1TQ即可满足要求,而bit5-0表示波特率预分频比位,上面计算的时候已经确定值为1,所以conf1的值已经确定为0x01。

CONF2寄存器内容如下图所示:

bit7为相位缓冲PS2段的时间长度位,这里设置为1,由CNF3寄存器决定。

bit6设置为0采样点配置位,这里设置为0,表示进行一次采样。

Bit5-bit3表示相位缓冲段PS1的长度,相位缓冲段PS1为7个TQ,所以Bit5-bit3应为6,换算为二进制为110,

Bit2-bit0表示传播段长度,传播段长度位2个TQ,所以Bit5-bit3应为1,换算为二进制就为001。

综上CNF2的值为10110001,换算成16进制就为0xB1。

CONF3寄存器内容如下图所示:

其中bit2-0表示相位缓冲段PS2长度,相位缓冲段为6个TQ,所以bit2-0值应为5,转换为二进制为101。而其他位设置为0即可,综上CNF3要设置的值为0x05。

190.2 RXB0CTRL寄存器配置

除了要配置CNF1、CNF2、CNF3三个CAN波特率配置寄存器之外,还需要对RXB0CTRL接收缓冲器0控制寄存器进行配置,RXB0CTRL寄存器内容如下图所示:

需要将bit6-5设置为11,表示接收所有的报文,其他位都设置为0即可,所以该寄存器要设置的二进制值为01100000,换算成16进制就为0x60。

190.3 CANINTE寄存器配置

最后还需要对CANINTE——中断使能寄存器进行配置,CANINTE寄存器内容如下所示:

可以得到写指令的指令格式为00000010,同样的可以编写写寄存器对应的函数,具体内容如下所示:

void mcp2515_write_reg(char reg, char value) {
    int ret;
    char write_buf[] = {0x02, reg, value};  // SPI写缓冲区,用于发送写寄存器命令

    ret = spi_write(spi_dev, write_buf, sizeof(write_buf));  // 发送SPI写命令
    if (ret < 0) {
        printk("mcp2515_write_reg error\n");
    }
}

通过调用mcp2515_write_reg写寄存器函数就可以对上述三个小节讲解的寄存器进行修改了,具体内容如下所示:

#define CNF1 0x2a                    // 寄存器定义
#define CNF2 0x29
#define CNF3 0x28
#define RXB0CTRL 0x2b
#define CANINTE 0x60
 
mcp2515_write_reg(CNF1, 0x01);  // 写入寄存器配置值
mcp2515_write_reg(CNF2, 0xb1);
mcp2515_write_reg(CNF3, 0x05);
mcp2515_write_reg(RXB0CTRL , 0x60);
mcp2515_write_reg(CANINTE , 0x05);

至此,关于配置模式中寄存器的配置就完成了,在下个小节中将会讲解一种常用的寄存器值修改方法位修改指令和屏蔽字节。

190.5 位修改指令和屏蔽字节

位修改指令(Modify Bit instruction)是一种指令或操作,允许用户在处理器或芯片的寄存器中修改单个位(bit),而不影响寄存器中的其他位。

屏蔽字节(Mask Byte):屏蔽处理器或芯片寄存器中特定位的字节值。屏蔽字节决定了在执行位修改指令时哪些位会被修改,哪些位会保持不变。通过在位修改指令中使用屏蔽字节,可以精确地指定要修改的寄存器位,而不会影响其他位的内容。

MCP2515支持位修改指令和屏蔽字节,MCP2515的SPI指令表如下所示:

位修改指令格式如下所示:

CS片选信号拉低之后依次向MCP2515发送位修改命令字节、寄存器地址、屏蔽字节以及数据字节。

屏蔽字节确定允许修改寄存器中的哪一位。屏蔽字节中的“1”表示允许对寄存器中的相应位进行修改;而“0”则禁止修改。数据字节确定寄存器位修改的最终结果。如果屏蔽字节 相应位置为“1”,数据字节中的“1”表示将寄存器对 应位设置为1,而“0”将对该位清零,如下图所示:

然后来编写位修改指令的函数,具体内容如下所示:

// MCP2515修改寄存器位函数
void mcp2515_change_regbit(char reg, char mask, char value) {
    int ret;
    char write_buf[] = { 0x05, reg, mask, value };  // SPI写缓冲区,用于发送修改寄存器位命令

    ret = spi_write(spi_dev, write_buf, sizeof(write_buf));  // 发送SPI写命令
    if (ret < 0) {
        printk("mcp2515_change_regbit error\n");
    }
}

在190.2章节中使用的是spi_write函数对RXB0CTRL寄存器全部的只进行的修改,在学习位修改指令之后就可以单独对要操作的位就行修改可以内容由

#define RXB0CTRL 0x60
 
mcp2515_write_reg(RXB0CTRL , 0x60);

修改为

mcp2515_change_regbit(RXB0CTRL, 0x64, 0x60);

至此,对于位修改的讲解就完成了,由于本章节只是对寄存器进行的讲解和配置,并不能得到具体的实验结果,所以本章不再进行实验,接下来的章节将继续对mcp2505驱动程序进行完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE---Spring之小练习

实现一个验证码项目 后端代码 后端代码测试 整体代码测试 输入正确的验证码 输入错误的验证码

【C++掌中宝】缺省参数的全面解析

文章目录 前言1. 什么是缺省参数&#xff1f;2. 缺省参数的分类2.1 全缺省【备胎是如何使用的&#x1f605;】2.1.1 疑难细究 2.2 半缺省2.2.1 错误用法示范2.2.2 正确用法示范2.2.3&#x1f525;实参缺省与形参缺省的混合辨析&#x1f525; 3. 缺省参数的规则和限制4. 规定必须…

Gartner发布2024年中国基础设施战略技术成熟度曲线

Gartner于近日首次发布2024年中国基础设施战略技术成熟度曲线&#xff0c;该曲线收录的21项技术主要覆盖四大领域&#xff0c;分别是&#xff1a;自主可控计划、AI 影响、运营效率以及基础设施现代化。 Gartner研究总监张吟铃表示&#xff1a;“中国市场与全球市场虽然使用的技…

[Redis][预备知识]详细讲解

目录 1.命令1.最核心的两个命令1.SET2.GET3.说明 2.基本全局命令0.前言1.KEYS2.EXISTS3.DEL4.EXPIRE5.TTL6.TYPE 2.数据结构和内部编码3.单线程架构1.单线程模型2.单线程还效率高&#xff1f;(重点)3.注意 1.命令 1.最核心的两个命令 1.SET 语法&#xff1a;SET key value功…

jmeter发送邮件:详细步骤与功能配置指南?

jmeter发送邮件如何设置&#xff1f;怎么配置JMeter以发送邮件&#xff1f; Apache JMeter作为一款强大的性能测试工具&#xff0c;不仅可以用于测试Web应用的性能&#xff0c;还可以通过插件扩展其功能&#xff0c;实现诸如发送邮件等操作。AokSend将详细介绍如何使用JMeter发…

核心复现—计及需求响应的区域综合能源系统双层优化调度策略

目录 一、主要内容&#xff1a; 二、摘要介绍&#xff1a; 三、综合能源系统结构&#xff1a; 四、实际仿真运行结果&#xff1a; 五、代码数据下载&#xff1a; 一、主要内容&#xff1a; 在模型构建部分&#xff1a;建立了一个综合能源系统双层优化调度模型&#xff0c;…

openeuler22.03 LTS 源码编译安装fastdfs-6.06

openeuler22.03 LTS 源码编译安装fastdfs-6.06 1、环境 名称版本备注openeuler22.03 LTSfastdfs6.06libfastcommon1.0.43libfastcommon是一个开源的C语言库&#xff0c;用于实现高性能的分布式文件系统和分布式存储系统 2、准备安装包 fastdfs 官网&#xff1a; https://git…

《概率论与数理统计》学渣笔记

文章目录 1 随机事件和概率1.1 古典概型求概率随机分配问题简单随机抽样问题 1.2 几何概型求概率1.3 重要公式求概率 2 一维随机变量及其分布2.1 随机变量及其分布函数的定义离散型随机变量及其概率分布&#xff08;概率分布&#xff09;连续型随机变量及其概率分布&#xff08…

【machine learning-12-多元线性回归】

线性回归-多特征 多特征线性回归多特征表示更简单的多元线性回归表示方法 之前节的线性回归为简化都是用的单特征&#xff0c;但现实中我们的预测因素很复杂不可能只有一个特征&#xff0c;下面总结多特征线性回归 多特征 之前总是用房价举例&#xff0c;预测房价和房屋面积的…

个人量化成功之路-----从 Yahoo! Finance 下载交易策略数据

雅虎财经 是投资者最受欢迎的网站之一。它提供有关股票、债券、货币和加密货币的各种市场数据。它还提供市场新闻、报告和分析、期权和基本数据 官方的雅虎财经 API 于 2017 年被下架 Yfinance 是由 Ran Aroussi 开发的开源 Python 库&#xff0c;用于访问雅虎财经上可用的财…

基于微信小程序的宠物寄养平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 随着科技和网络的进步&#xff0c;微信小程序技术与网络、生活贴和的更加紧密。需要依靠客户端的单机系统逐渐被淘汰&#xff0c;利用互联网可以处理大量数据的新型系统如雨后春笋般迅速发展起来。这类系统和信息化时代的同步发展对传统的办公管理方式造成了很大的压力。…

C++进阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成…

如何基于scrcpy改造实现大厂一键连招/触摸宏功能(带java源码)-千里马安卓framework实战

背景&#xff1a; 前面公众号文章已经分享过如何实现这种大厂里面一键连招&#xff0c;触摸宏的功能&#xff0c;原理本身是对dev/input下面的节点进行读取保存文件&#xff0c;然后在读取文件进行写入dev/input下面的节点&#xff0c;从而实现了触摸事件的读取和写入&#xf…

OpenMVG试用

1 OpenMVG 简介 全称 Open Multiple View Geometry&#xff0c;是法国人 Pierre Moulon 读博期间开源的一个 C 库 最早版本 OpenMVG 0.1 是 2013年 2月 发布的&#xff0c;目前最新版本是 2021年 10月 发布的 OpenMVG 2.0 LinkedIn 显示&#xff0c;此前一直在…

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

8. 防火墙

8. 防火墙 (1) 防火墙的类型和结构 防火墙的类型和结构可以根据其在网络协议栈中的过滤层次和实现方式进行分类。常见的防火墙类型包括: 包过滤防火墙:工作在网络层(OSI模型的第3层),主要检查IP包头的信息,如源地址、目的地址、端口号等。电路级网关防火墙:工作在会话层…

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 事务的概念 事务的ACID特性 使用事务 查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务 事务的隔离性和…

NLP 文本分类任务核心梳理

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据&#xff0c;核心解决方案&#xff1a; 自己构造训练样本 数据增强&#xff0c;如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

MySQL --基本查询(下)

文章目录 3.Update3.1将孙悟空同学的数学成绩变更为 80 分3.2将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分3.3将总成绩倒数前三的 3 位同学的数学成绩加上 30 分3.4将所有同学的语文成绩更新为原来的 2 倍 4.Delete4.1删除数据4.1.1删除孙悟空同学的考…

learn C++ NO.19——二叉搜索树

简单介绍一下二叉搜索树 二叉搜索树也称为二叉排序树。它是一种具有特殊性质的二叉树。它有如下性质。 1、当前节点的左子树的值一定小于当前节点&#xff0c;当前节点的右子树的值一锭大于当前节点。这也就意味着&#xff0c;在接近完全二叉树的情况下&#xff08;高度较为合…