【linux开发-驱动】SPI驱动开发相关

ops/2024/10/25 11:20:40/

一、什么是SPI

SPI 全称是 SerialPerripheral Interface,也就是串行外围设备接口,SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)。

①CS/SS,Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。

②SCK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。

③MOSI/SDO,Master Out Slave In/Serial Data Output,简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。

④MISO/SDI,Master In Slave Out/Serial Data Input,简称主入从出信号线,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。

SPI有四种工作模式,过串行时钟极性(CPOL)相位(CPHA)的搭配来得到四种工作模式:

①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

二、linux下的SPI驱动框架

在 Linux 内核当中,与 I2C 总线框架一样,SPI 总线框架(也可以叫做 SPI 子系统)也可以分为三个部分:

1、SPI核心层:提供了核心数据结构的定义、SPI 控制器驱动和设备驱动的注册、注销、管理等 API。

2、SPI控制器驱动层:为系统中的 SPI 总线实现相应的读写方法。

3、SPI设备驱动层:SPI 从设备对应的驱动程序,比如一些 SPI 接口的芯片器件对应的驱动程序。

三、SPI设备驱动编写流程

3.1SPI设备信息描述

1、IO 的 pinctrl 子节点创建与修改

修改前检查相应的IO有没有被其他设备所使用。

2、SPI设备节点的创建于修改

采用设备树方式的情况下,SPI 从机设备信息描述就通过创建相应的设备子节点来完成,我们可以打开 stm32mp157d-atk.dts 这个设备树文件,然后在里边创建一个 SPI 从机设备节点,描述该设备的相关信息,我们后面再创建。

3.2SPI从机设备数据收发处理流程

SPI 设备驱动的核心是 spi_driver,当我们向 Linux 内核注册成功 spi_driver 以后就可以使用 SPI 核心层提供的 API 函数来对设备进行读写操作了。

重点代码部分(代码参看正点原子资料):

1、spi_transfer结构体,用于描述SPI传输信息。

2、spi_message结构体,spi_message 初始化完成以后需要将 spi_transfer 添加到 spi_message 队列中

spi_message 准备好以后就可以进行数据传输了。

正式编写步骤:

1、在 stm32mp15-pinctrl.dtsi 里面搜索一下,找到SPI1 接口引脚配置进行修改。

2、编写对应传感器的驱动,也设计到SPI相应的驱动,SPI驱动最终是通过读写传感器的寄存器实现的。

3、编写测试程序进行验证

4、测试时,需要使能SPI控制器,可以通过 Linux 内核图形化配置界面。

→ Device Drivers
→ SPI support (SPI [=y])
→<*> STMicroelectronics STM32 SPI controller//编译进内核

重新编译设备树和内核,运行以下命令进行编译:

make dtbs uImage LOADADDR=0XC2000040 -j8

5、修改Makefile文件,编译驱动程序。成功后会生成一个.ko文件

6、将生成的驱动文件和测试软件放在rootfs/lib/modules/5.3.41 目录中,重启开发板,进入到目录 lib/modules/5.3.41 中。

测试是否接受到数据。

参考:正点原子视频资料


http://www.ppmy.cn/ops/128315.html

相关文章

Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案

文&#xff1a;安科瑞郑桐 摘要&#xff1a;大型化工企业供配电具有的集约型特点&#xff0c;化工企业内35kV变电站和10kV变电所数量大、分布广&#xff0c;对于老的大多大型及中型化工企业而言&#xff0c;其变电站或变电所内高压电气设备为旧式继电保护装置&#xff0c;可靠…

【Docker】docker | 部署nginx

一、概述 记录下nginx的部署流程&#xff1b;将conf配置文件映射到宿主机 前提依赖&#xff1a;自行准备nginx的镜像包 二、步骤 1、运行、无映射 docker run --name nginx -p 80:80 -d nginx:1.18.0-alpine 80&#xff1a;80&#xff0c;前面是宿主机端口&#xff1b;如果冲…

你对MySQL的having关键字了解多少?

在MySQL中&#xff0c;HAVING子句用于在数据分组并计算聚合函数之后&#xff0c;对结果进行进一步的过滤。它通常与GROUP BY子句一起使用&#xff0c;以根据指定的条件过滤分组。HAVING子句的作用类似于WHERE子句&#xff0c;但WHERE子句是在数据被聚合之前进行过滤&#xff0c…

ModuleNotFoundError: No module named ‘pdfminer.high_level‘

解决办法&#xff1a; pip uninstall pdfminer pip install pdfminer.six 如果还报错&#xff1a;重启计算机 参考资料&#xff1a;https://blog.csdn.net/xigewang_/article/details/132319419

Ovis原理解读: 多模态大语言模型的结构嵌入对齐

论文&#xff1a;https://arxiv.org/pdf/2405.20797 github:https://github.com/AIDC-AI/Ovis 在多模态大语言模型 (MLLM) 中&#xff0c;不同的嵌入策略有显著的区别。以下是使用基于连接器的方法与 Ovis 方法的比较&#xff1a; 基于连接器的方法-优缺点(connector-based …

Cursor零基础小白教程系列「高阶」 - Cursor 模型选择和API密钥配置

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 Cursor 模型选择和API密钥配置 概述 Cursor提供了多种AI模型供选择&#xff0c;并允许用户配置自己的API密钥。本教程将介绍如何选择不同的AI模型以及如何配置…

【AI知识点】倒排索引(Inverted Index)

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 倒排索引&#xff08;Inverted Index&#xff09; 是信息检索系统中用于快速查找包含某个词项的文档集合的核心数据结构。倒排索引在搜索引擎、全文检索系统以及数据库中被广泛使用&#xff0c;它能够极大提高查询速度&a…

前端面试题16 | Http和Https相比,有什么区别?

哈喽小伙伴们大家好&#xff01;我是程序媛小李&#xff0c;一位正在往全栈方向发展的前端小姐姐&#xff0c;今天我们继续来给大家分享一道经典的面试题 http和https的区别&#xff1a; 1. 安全性 HTTP&#xff1a;HTTP是超文本传输协议&#xff0c;信息以明文传输&#xff…