Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

一. 简介

前面文章的学习,已经实现了 读写SPI设备中数据的功能。文章如下:

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能-CSDN博客

本文来使用内核提供的读写SPI设备中的数据的API函数,来实现读写SPI设备中数据。

二.  Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

1. 内核提供的读写SPI设备中的数据的函数

所使用内核源码为NXP官方提供。读写SPI设备中的数据的函数所在内核源码路径为:

/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/linux/spi/spi.h

(1)  读取SPI设备中数据的函数

spi_read函数
int spi_read(struct spi_device *spi, void *buf, size_t len)
spi_write_then_read函数
/* this copies txbuf and rxbuf data; for small transfers only! */
int spi_write_then_read(struct spi_device *spi, const void *txbuf, unsigned n_tx,void *rxbuf, unsigned n_rx);

(2) 向SPI设备中写数据的函数

int spi_write(struct spi_device *spi, const void *buf, size_t len)

2.  使用内核提供的读写SPI设备中的数据的函数

这里的代码与前一篇文章相比,不同的是 读写SPI设备中数据的函数实现。

读写SPI设备中数据的函数实现如下(spi_icm20608.c文件中):

static int spi_write_regs(struct icm20608_Dev* dev, u8 reg_addr, void* buf, int len)
{int ret = 0;unsigned char value = 0;struct spi_device* spi_dev = (struct spi_device*)dev->private_data;value = reg_addr & ~0x80; //最高为位清0(写标志位)//发送要写入的寄存器地址ret = spi_write(spi_dev, &value, 1); if(ret)printk("spi_write_regs: spi_write reg_addr error\n");//发送要写入SPI设备中的数据ret = spi_write(spi_dev, buf, len); if(ret)printk("spi_write_regs: spi_write  data error\n");return ret;
}static int spi_read_regs(struct icm20608_Dev* dev, u8 reg_addr, void* buf, int len)
{int ret = 0;unsigned char value = 0;struct spi_device* spi_dev = (struct spi_device*)dev->private_data;value = reg_addr | 0x80; //最高为置1(读标志位)
#if  0    //发送要读取的寄存器的地址ret = spi_write(spi_dev, &value, 1);if(ret < 0)printk("spi_read_regs: spi_write reg_addr error\n");//接收SPI设备中的数据 ret = spi_read(spi_dev, buf, len);if(ret)printk("spi_read_regs: spi_read data error\n");
#endifspi_write_then_read(spi_dev, &value, 1, buf, len);return ret;
}/*ICM20608设备初始化(即SPI设备初始化)*/
static int icm20608_register_init(struct icm20608_Dev* dev)
{unsigned char value = 0;spi_write_reg_onebyte(&icm20608_dev, ICM20_PWR_MGMT_1, 0x80); /*复位,复位后为0x40,睡眠模式 */mdelay(50);spi_write_reg_onebyte(&icm20608_dev, ICM20_PWR_MGMT_1, 0x01);  /*关闭睡眠,自动选择时钟 */mdelay(50);value = spi_read_reg_onebyte(&icm20608_dev,ICM20_WHO_AM_I);printk("ICM20_WHO_AM_I: 0x%02X\r\n", value);if((value != ICM20608G_ID) && (value != ICM20608D_ID)){return 1;}value = spi_read_reg_onebyte(&icm20608_dev,ICM20_PWR_MGMT_1);printk("ICM20_PWR_MGMT_1: 0x%02X\r\n", value);return 0;
}

可以看出,读SPI设备中数据的实现函数中,有一段屏蔽的代码段,如下代码段:

    ret = spi_write(spi_dev, &value, 1);if(ret < 0)printk("spi_read_regs: spi_write reg_addr error\n");//接收SPI设备中的数据 ret = spi_read(spi_dev, buf, len);if(ret)printk("spi_read_regs: spi_read data error\n");

这里先写了SPI设备的寄存器地址,然后从SPI设备中读取数据。

经过测试,这段代码最后 SPI读取数据是不对的,也就是存在问题。正点原子的左神说是,可能的原因是 在发送寄存器地址前片选信号是拉低的,之后片选信号拉高了,然后在从SPI深圳中读取数据前,片选信号再拉低。这样导致时序混乱。

所以,这里从SPI设备中读取数据调用了 spi_write_then_read函数,不过根据该函数的注释信息,说这个函数只适用于小数量的数据传输!

三.  测试

将 编译的驱动进行编译后,将新生成的驱动模块拷贝到开发板系统中,加载驱动模块如下:

可以看出,寄存器ICM20_PWR_MGMT_1在 ICM20608初始化函数中最后写入了0x01,这里读出来也是 0x01,确定读写SPI设备函数运行正常。

卸载模块:

卸载驱动模块时, remove函数也运行了,也不存在错误的信息。

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

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

相关文章

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

MySQL 8.0 新特性之 Clone Plugin

个人感觉&#xff0c;主要还是为 Group Replication 服务。在 Group Replication 中&#xff0c;如果要添加一个新的节点&#xff0c;这个节点差异数据的补齐是通过分布式恢复&#xff08; Distributed Recovery &#xff09;来实现的。 在 MySQL 8.0.17 之前&#xff0c;只支…

【数据结构】队列(链表模拟队列)

学习本章节必须具备 单链表的前置知识&#xff0c; 建议提前学习&#xff1a;点击链接学习&#xff1a;单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff…

javase基础汇总学习

目录 背景步骤宏观微观理论基础用法面向对象数据类型基础语法&#xff08;关于方法&#xff09;try&#xff08;正常的逻辑代码&#xff09;catch&#xff08;这个和异常有关系&#xff09;finally&#xff08;经典面试题&#xff09; 高阶使用序列化泛型注解反射 总结 背景 后…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时&#xff0c;不要企图去更换更强大的服务器&#xff0c;对大型网站而言&#xff0c;不管多么强大的服务器&#xff0c;对大型网站而言&…

Jenkins 的构建时执行时间问题

我们希望我的项目能够在特定的时间自动执行&#xff0c;我们需要设定一个定时任务。 Jenkins 的定时任务是通过 Cron 任务来实现的&#xff0c;但是由有点不一样。 H/2 * * * * 比如说上面的设置就是每 2 分钟执行一次。 希望每分钟执行一次 Jenkins 的每分钟执行一次的设置…

【AI工具之Prezo如何自动生成PPT操作步骤】

先说优缺点&#xff1a; 最大的优点就是免费&#xff08;但说实话功能和体验方面很弱&#xff09;支持中文提问&#xff08;最好用英文&#xff09;&#xff0c;智能生成图文&#xff08;但是只能生成英文内容&#xff09;可以AI生成图片&#xff0c;图片很精美酷炫&#xff0…

Eureka基础介绍和使用

目录 一.理论基础 二.父项目 2.1 新建父项目 2.2 管理依赖 三.子项目 3.1 新建子项目 3.2 注册中心Server依赖和启动类和配置文件 3.3 生产者Client 依赖和启动类和配置文件 3.5 消费者Custmer依赖和配置类、启动类和配置文件 四.心跳 五.公共资源项目 5.1新建实体…

空心电抗器的matlab建模与性能仿真分析

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 空心电抗器是一种无铁芯的电感元件&#xff0c;主要由一圈或多圈导线绕制在非磁性材料制成的空心圆筒或其他形状的骨架上构成。其工作原理基于法拉第电磁感应定律&#xff0c;…

【计算机组成原理】加法器原理及其优化

苏泽 本专栏纯个人笔记作用 用于记录408 学习的笔记记录&#xff08;敲了两年码实在不习惯手写笔记了&#xff09; 如果能帮助到大家当然最好 但由于是工作后退下来备考 很多说法和想法都会结合实际开发的思想 可能不是那么的纯粹应试哈 希望大家挑选自己喜欢的口味食用…

现代商业中首席人工智能官(CAIO)的角色与影响

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

CTFHub(web SQL注入)

CTFHub技能树 Web-SQL注入 详解_666c6167-CSDN博客 Ctfhub - web -- SQL注入_ctfhub sql注入-CSDN博客 整数型注入 方法一 根据提示输入1&#xff0c; 闭合方式就是 1 &#xff0c;整数型 存在两列&#xff0c;这里已经给出了字段&#xff0c;不需要再order by了 爆出数据库…

yolov7模型输出层预测方法解读

本文从代码的角度分析模型训练阶段输出层的预测包括以下几个方面&#xff1a; 标注数据&#xff08;下文统称targets&#xff09;的正样本分配策略&#xff0c;代码实现位于find_3_positive。候选框的生成&#xff0c;会介绍输出层的预测值、GT、grid、 anchor之间的联系损失函…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法&#xff1f; 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。其本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢&#xff1f; 因为有的问题能暴力…

Hive进阶(2)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 一、写入流程 1、 Client向NameNode发起RPC请求&#xff0c;来确定请求文件block所在的位置&#xff1b; 2、 NameNode会视情况返回文件的部分或者全部block列表&#xff0c;对于每个block&#xff0c;NameNode都会返回含有该block副本的DataNode地址&…

Ubuntu22.04.4 - 网络配置 - 笔记

一、设置固定ip 1、cd /etc/netplan 查看文件夹下的配置文件 我这里叫 00-installer-config.yaml 2、sudo nano /etc/netplan/00-installer-config.yaml 完成配置后&#xff0c;按下Ctrl O保存更改&#xff0c;然后按下Ctrl X退出nano编辑器。 3、sudo netplan apply 4、ip …

前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。

1、演示 2、思路 1、用传统的 <table></table> 表格标签来实现比较麻烦。因此通过模拟 表格标签 的写法用<div></div>来实现 2、表头和表格列数是相同的&#xff0c;因此可以确定代码结构 <div class"table"><div class"head…

PotPlayer 图像截取

PotPlayer 图像截取 1. PotPlayer2. PotPlayer 下载2.1. PotPlayer 240305 3. 图像截取References 1. PotPlayer http://www.potplayercn.com/ PotPlayer 是 KMPlayer 原作者姜勇囍进入新公司 Daum 之后推出的&#xff0c;继承了 KMPlayer 所有的优点&#xff0c;拥有异常强大…

Flask项目在Pycharm中设置局域网访问

打开PyCharm导入本应用。点击Run标签中的Edit Configurations 其中Target type选择Script path&#xff0c;Target填入本项目中app.py的路径&#xff0c;Additional optional填入--host0.0.0.0(不要有空格)。 再重新运行项目&#xff0c;会观察到除了原本的http://127.0.0.1:50…