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 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.mfbz.cn/a/770318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快团团能屏蔽团员某个人吗?有哪些操作步骤?

在快团团里团长不仅拥有发起团购、管理商品和订单的权利&#xff0c;还具备了一项关键功能——屏蔽特定团员的能力。这一功能确保了团长能够维护良好的社群环境&#xff0c;避免不必要的干扰。以下是屏蔽团员的具体步骤&#xff1a; 1. 登录快团团&#xff1a;首先&#xff0c;…

10 - Python文件编程和异常

文件和异常 在实际开发中&#xff0c;常常需要对程序中的数据进行持久化操作&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;对于这个概念&#xff0c;维基百科上给出…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤&#xff0c;包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码&#xff1a; 步骤1&#xff1a;设置角色的物理属性 角色通常使用Character Co…

学校卫星电子怎么自动校准时间呢

在学校的教室里&#xff0c;卫星电子钟精准地为师生们提供着时间服务&#xff0c;而其自动校准时间的功能令人称奇。那么&#xff0c;学校卫星电子钟是如何实现自动校准时间的呢&#xff1f; 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…

什么地方适合安装自动气象站?

随着科技的不断进步&#xff0c;自动气象站在气象观测、环境监测以及科研教学等领域发挥着越来越重要的作用。 一、科研机构和高校校园 科研机构和高校校园是安装自动气象站的理想场所。这些地方拥有专业的科研团队和丰富的教育资源&#xff0c;可以为气象站的建设和运营提供有…

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…

VMware Workstation桥接模式无法上网

问题背景 我之前创建过一个虚拟机&#xff0c;当时虚拟机的网络模式使用的是桥接模式&#xff0c;配置好了固定ip地址&#xff0c;是可以正常上网的&#xff0c;中间没有做任何网络上面的配置。但是今天再打开这台虚拟机时&#xff0c;发现竟然不能上网了。 物理主机的ip信息配…

详解COB封装的定义

COB封装全称是Chip on Board&#xff08;板上芯片封装&#xff09;&#xff0c;是一种非常先进的电子封装工艺&#xff0c;其会涉及到将发光芯片直接封装于印刷电路板&#xff08;PCB&#xff09;或者其他类型的互连电气基板上&#xff0c;通过细小的金属线进行键合&#xff0c…

LangChain 入门上篇:模型 I/O 封装

LangChain 是面向大模型的开发框架&#xff0c;是 AGI 时代软件工程的探索和原型。学习 LangChain 需要关注接口的变更。 LangChain 的核心组件 1.模型 I/O 封装 LLMS 大语言模型Chat Models 一套基于 LLMS&#xff0c;但按对话结构重新封装PromptTemplate 提示词模板Output…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。&#xff08;素数只能被1或其本身整除的数&#xff09; 2. 一个函数判断一年是不是闰年。 3.写一个函数&#xff0c;实现一个整形有序数组的二分查找。 4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;使得num每次增…

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系&#xff0c;宏哥这里用代码给小伙伴演示两个模块&#xff1a;注册和登录。 2.业务模块封装 因为现在各种APP的层出不群&#xff0c;各式各样的。但是其大多数都有注册、登录。为…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

surfer做等值线图笔记

surfer等值线图及其白化 **grd文件的制作****白化的边界文件的制作****白化****绘图****逆转坐标轴** grd文件的制作 单击格网&#xff0c;选择x,y,z的数据&#xff0c;选择克里金插值方法&#xff0c;让后确定&#xff0c;保存grd文件 白化的边界文件的制作 surfer新建表&am…

拒绝胶感,清纯甜美邻家女孩!逼真!逼真!SD1.5 更适合初恋般的国产真人大模型—— CNrealisticMIXV40

看惯了AI艺术大片&#xff0c;想寻找适合生成邻家女孩青涩照片的模型。 今天应邀&#xff0c;针对邻家女孩青涩风格进行下尝试。此前推荐过一款支持各种真实&#xff0c;摄影&#xff0c;写实风格模型的合体模型——**赛博Dream | CNrealistic_MIX_V40无损修剪版。**这款模型为…

notepad++ 中文乱码 出现小方格

从word文档直接拷贝过来的文字&#xff0c;到notepad 中文乱码 出现小方格 &#xff1a; 方法&#xff1a;设置-语言格式设置&#xff0c;字体样式更改为宋体&#xff0c;勾选“使用全局字体”&#xff0c;点保存并关闭&#xff0c;则ok

【Python机器学习】算法链与管道——用预处理进行参数选择的注意项

对于许多机器学习算法&#xff0c;提供的特定数据表示非常重要。比如&#xff0c;首先对数据进行缩放&#xff0c;然后手动合并特征&#xff0c;再利用无监督机器学习来学习特征。因此&#xff0c;大多数机器学习应用不仅需要应用多个算法&#xff0c;而且还需要将许多不同的处…

使用 llamaIndex 快速实现智能体

AI 智能体就是可以根据当前环境进行推理&#xff0c;并根据处理结果进行下一步的操作。简单来说 AI 智能体可以与外界环境进行交互&#xff0c;并根据结果执行更复杂的操作。本文将通过llamaIndex 实现一个简单的 Agent 实时获取数据&#xff0c;由于大模型是通过静态数据进行训…

【C++】 解决 C++ 语言报错:未定义行为(Undefined Behavior)

文章目录 引言 未定义行为&#xff08;Undefined Behavior, UB&#xff09;是 C 编程中非常危险且难以调试的错误之一。未定义行为发生时&#xff0c;程序可能表现出不可预测的行为&#xff0c;导致程序崩溃、安全漏洞甚至硬件损坏。本文将深入探讨未定义行为的成因、检测方法…

ERROR TypeError: AutoImport is not a function TypeError: AutoImport is not a

出现这种错误是AutoImport is not a function&#xff08;插件版本问题&#xff0c;回退插件版本&#xff09;-vue项目element plus按需引入配置错误 查看unplugin-auto 插件版本 npm list unplugin-auto-import 回退插件版本 npm install unplugin-auto-import0.16.1 ERRO…

字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析

在自然语言处理领域&#xff0c;人们经常需要比较字符串&#xff0c;这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似&#xff0c;或者相似度是好还是差。这类似于我们使用手机打错一个词&#xff0c;但手机会建议正确的词来修正它&#…