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

瑞芯微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 0x60mcp2515_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 0x60mcp2515_write_reg(RXB0CTRL , 0x60);

修改为

mcp2515_change_regbit(RXB0CTRL, 0x64, 0x60);

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

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

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

相关文章

电流镜与恒流源

在两个晶体管完全对称的情况下&#xff0c;电源通过R1给两个晶体管提供相同的偏置电流&#xff0c; 这样他们流过集电极和发射极的电流就相同。 电流镜原视频链接&#xff1a; 【电流镜电路】https://www.bilibili.com/video/BV1b5411k7rh?vd_source3cc3c07b09206097d0d8b0ae…

Linux基础3-基础工具3(make,makefile,gdb详解)

上篇文章&#xff1a;Linux基础3-基础工具2&#xff08;vim详解&#xff0c;gcc详解&#xff09;-CSDN博客 本章重点&#xff1a; 1.自动化构建工具make,makefile 2.linux调试工具gdb 目录 一. 自动化构建工具make,makefile 1.1 make使用 1.2 使用make注意点 a. make和文件时…

Python数据分析案例60——扩展变量后的神经网络风速预测(tsfresh)

案例背景 时间序列的预测一直是经久不衰的实际应用和学术研究的对象&#xff0c;但是绝大多数的时间序列可能就没有太多的其他的变量&#xff0c;例如一个股票的股价&#xff0c;还有一个企业的用电量&#xff0c;人的血糖浓度等等&#xff0c;空气的质量&#xff0c;温度这些…

揭秘LLM计算数字的障碍的底层原理

LLM的 Tokenizer与数字切分 大语言模型在处理语言时&#xff0c;通常依赖Tokenization技术来将文本切分为可操作的单元。早期版本的Tokenizer对数字处理不够精确&#xff0c;常常将多个连续数字合并为一个Token。比如“13579”可能被切分为“13”、“57”和“9”。在这种情况…

【Linux修行路】网络套接字编程——UDP

目录 ⛳️推荐 前言 六、Udp Server 端代码 6.1 socket——创建套接字 6.2 bind——将套接字与一个 IP 和端口号进行绑定 6.3 recvfrom——从服务器的套接字里读取数据 6.4 sendto——向指定套接字中发送数据 6.5 绑定 ip 和端口号时的注意事项 6.5.1 云服务器禁止直接…

AIGC图片相关知识和实战经验(Flux.1,ComfyUI等等)

最近看了网上的一些新闻&#xff0c;flux.1火出圈了&#xff0c;因此自己也尝试跑了一下&#xff0c;作图的质量还是蛮高的&#xff0c;在这里做个知识总结回顾。 flux.1是什么&#xff1f; 根据介绍&#xff0c;flux.1是由stable diffusion 一作&#xff0c;Stability AI的核…

数据结构----栈和队列

&#xff08;一&#xff09;栈 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First …

【数据结构】十大经典排序算法总结与分析

文章目录 前言1. 十大经典排序算法分类2. 相关概念3. 十大经典算法总结4. 补充内容4.1 比较排序和非比较排序的区别4.2 稳定的算法就真的稳定了吗&#xff1f;4.3 稳定的意义4.4 时间复杂度的补充4.5 空间复杂度补充 结语 前言 排序算法是《数据结构与算法》中最基本的算法之一…

PHP Swoole实现简易聊天室,附加小程序端连接websocket简易代码

目录 用到的工具&#xff1a; PHP Swoole拓展 | PHP Redis拓展 | Redis 7 一、安装上述必要工具&#xff08;下面是以宝塔面板中操作为例&#xff09; 给PHP安装Swoole和Redis拓展&#xff1a; 安装Redis软件 二、创建websocket服务器文件"wss_server.php" 具…

19 MDIO 接口读写以太网PHY寄存器

以太网概述 以太网&#xff08;Ethernet&#xff09;是应用最普遍的局域网技术。IEEE组织的 IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网凭借其成本低、通信速率高、抗干扰性强等优点被广泛应用在网络…

2024 RSTCONCTF re 部分wp

Unknown Architect DIE查看&#xff0c;RISC_V架构&#xff0c;直接交即可 Duke of the Kingdom 附件拖入jadx 比较简单。脚本 Keypad 附件拖入ida。一共四遍check&#xff0c;都比较简单 Pico-Cypher 文本编辑器打开附件 稍微问一问gpt&#xff0c;得知这是micropython&#x…

2024年【浙江省安全员-C证】考试试卷及浙江省安全员-C证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 浙江省安全员-C证考试试卷是安全生产模拟考试一点通总题库中生成的一套浙江省安全员-C证模拟考试题库&#xff0c;安全生产模拟考试一点通上浙江省安全员-C证作业手机同步练习。2024年【浙江省安全员-C证】考试试卷及…

PostMan使用变量

环境变量 使用场景 当测试过程中&#xff0c;我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器&#xff0c;那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后&#xff0c;需要大量的更改接口的url地址 全局变量 使用场景 当…

[Leetcode LCR 154][Medium]-复杂链表的复制-链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 这道题难点在于如何处理random。因为涉及到的所有节点都在同一链表&#xff0c;因此可以在链表上利用复制-拆分的方法去做。 先在链表上把每个节点复制自身一次&#xff0c;相当于cur与cur.ne…

TCGA数据挖掘(全网最详细)

文章目录 前言一、数据处理二、数据融合3.基因ID转换4.表达差异分析5.可视化1. 筛选上下调及不显著变化的基因2.挑选top 103.火山图4. 热图4.1 上调前504.2 下调50 总结 前言 本文主要用于介绍TCGA初始数据的处理,数据融合,基因ID转换,数据融合以及数据的可视化! 一、数据处理…

评论怎么不被折叠?

首先 就很烦&#xff0c;即使我个人认为它很好 那么&#xff0c;怎么防止呢&#xff1f; 当然是 加代码框 //我是代码框 首先看看不加代码框 被撅了&#xff08; 那加上呢 没事 所以&#xff0c;这功能有什么用呢

比传统机器学习更先进的深度学习神经网络的二分类建模全流程教程

比传统机器学习更先进的深度学习神经网络的二分类建模全流程分析教程 深度学习介绍和与传统机器学习的区别 深度学习&#xff08;Deep Learning&#xff09;是一种机器学习的分支&#xff0c;基于多层神经网络模型&#xff0c;能够自动从大量数据中学习特征并进行预测。深度学…

Linux中使用Docker构建Nginx容器完整教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

幼儿与非幼儿识别系统源码分享

幼儿与非幼儿识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

初识Linux · 进程(3)

目录 前言&#xff1a; 进程的创建 前言&#xff1a; 继上文介绍了着重介绍了进程的内部属性&#xff0c;以及在操作系统层面进程如何被组织起来的&#xff0c;如何调用系统接口&#xff0c;有关task_struct&#xff0c;进程的部分理解等&#xff0c;今天&#xff0c;我们就…