Linux中SPI

news2024/11/8 9:17:14

参考资料

https://www.cnblogs.com/aaronLinux/p/6219146.html

1.SPI
在这里插入图片描述
2.SPI传输
2.1传输示例

首先,CS0拉低选中的SPI Flash ,
然后在每个时钟周期,
DO输出对应的电平。
SPI FLASH会在每个时钟的上升沿读取D0的电平。

在这里插入图片描述
2.2SPI模式
根据SCK的电平以及数据在第一个跳变沿还是第二个跳变沿传输,SPI传输总共有四种模式。
在这里插入图片描述
在这里插入图片描述
3.SPI总线设备驱动模型

SPI系统中设涉及两类硬件:
SPI控制器
SPI设备

在这里插入图片描述
spi控制器有驱动程序,提供spi的传输能力。
spi设备也有自己的驱动程序,提供spi设备的访问能力。
4.spi设备驱动框架图

SPI驱动程序由spi_master及spi_device组成
spi_master是在设备树中定义的spi master及master
下边的device信息;当左边drive中的of_device_id和设备树中的compatible参数匹配的时候,会调用driver中的prboe函数,probe函数会生成master,还会生成spi_device。
spi设备左边包括一个spi驱动,当其中的of_device_id和spi_device匹配时,会调用左边driver中的probe函数。


在这里插入图片描述
4.1SPI控制器驱动程序
基于平台总线设备驱动模型实现。在probe函数中除了生成spi_master,还会创建spi_device结构体。
在这里插入图片描述
4.2SPI设备驱动程序

左边是spi_drive,里边有id_table表示能支持哪些SPI设备,有probe函数。
右边是spi_device,用来描述spi设备,可以来自设备树或者c文件

在这里插入图片描述

5.spi设备树处理过程
5.1spi_device

/**
 * struct spi_device - Master side proxy for an SPI slave device
 * @dev: Driver model representation of the device.
 * @master: SPI controller used with the device.
 * @max_speed_hz: Maximum clock rate to be used with this chip
 *	(on this board); may be changed by the device's driver.
 *	The spi_transfer.speed_hz can override this for each transfer.
 * @chip_select: Chipselect, distinguishing chips handled by @master.
 * @mode: The spi mode defines how data is clocked out and in.
 *	This may be changed by the device's driver.
 *	The "active low" default for chipselect mode can be overridden
 *	(by specifying SPI_CS_HIGH) as can the "MSB first" default for
 *	each word in a transfer (by specifying SPI_LSB_FIRST).
 * @bits_per_word: Data transfers involve one or more words; word sizes
 *	like eight or 12 bits are common.  In-memory wordsizes are
 *	powers of two bytes (e.g. 20 bit samples use 32 bits).
 *	This may be changed by the device's driver, or left at the
 *	default (0) indicating protocol words are eight bit bytes.
 *	The spi_transfer.bits_per_word can override this for each transfer.
 * @irq: Negative, or the number passed to request_irq() to receive
 *	interrupts from this device.
 * @controller_state: Controller's runtime state
 * @controller_data: Board-specific definitions for controller, such as
 *	FIFO initialization parameters; from board_info.controller_data
 * @modalias: Name of the driver to use with this device, or an alias
 *	for that name.  This appears in the sysfs "modalias" attribute
 *	for driver coldplugging, and in uevents used for hotplugging
 * @cs_gpio: gpio number of the chipselect line (optional, -ENOENT when
 *	when not using a GPIO line)
 *
 * @statistics: statistics for the spi_device
 *
 * A @spi_device is used to interchange data between an SPI slave
 * (usually a discrete chip) and CPU memory.
 *
 * In @dev, the platform_data is used to hold information about this
 * device that's meaningful to the device's protocol driver, but not
 * to its controller.  One example might be an identifier for a chip
 * variant with slightly different functionality; another might be
 * information about how this particular board wires the chip's pins.
 */
struct spi_device {
	struct device		dev;
	struct spi_master	*master;
	u32			max_speed_hz;/* 该设备能支持的spi时钟最大值 */
	u8			chip_select;/* 是对应的spi_master下边的第几个设备 */
	u8			bits_per_word;/* 每个基本的spi传输涉及多少位 */
	u16			mode; /*spi_chpa  spi_cpol组合起来得到spi传输的四种模式 */
#define	SPI_CPHA	0x01			/* clock phase */
#define	SPI_CPOL	0x02			/* clock polarity */
#define	SPI_MODE_0	(0|0)			/* (original MicroWire) */
#define	SPI_MODE_1	(0|SPI_CPHA)
#define	SPI_MODE_2	(SPI_CPOL|0)
#define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)
#define	SPI_CS_HIGH	0x04			/* chipselect active high? */
#define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */
#define	SPI_3WIRE	0x10			/* SI/SO signals shared */
#define	SPI_LOOP	0x20			/* loopback mode */
#define	SPI_NO_CS	0x40			/* 1 dev/bus, no chipselect */
#define	SPI_READY	0x80			/* slave pulls low to pause */
#define	SPI_TX_DUAL	0x100			/* transmit with 2 wires */
#define	SPI_TX_QUAD	0x200			/* transmit with 4 wires */
#define	SPI_RX_DUAL	0x400			/* receive with 2 wires */
#define	SPI_RX_QUAD	0x800			/* receive with 4 wires */
	int			irq;
	void			*controller_state;
	void			*controller_data;
	char			modalias[SPI_NAME_SIZE];
	int			cs_gpio;	/* chip select gpio */

	/* the statistics */
	struct spi_statistics	statistics;

	/*
	 * likely need more hooks for more protocol options affecting how
	 * the controller talks to each chip, like:
	 *  - memory packing (12 bit samples into low bits, others zeroed)
	 *  - priority
	 *  - drop chipselect after each word
	 *  - chipselect delays
	 *  - ...
	 */
};

5.2设备树中的spi节点

    spi4 {
        compatible = "spi-gpio";/* 这个属性很关键,因为根据这个属性找到spi_master */
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_spi4>;
        pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
        status = "okay";
        gpio-sck = <&gpio5 11 0>;
        gpio-mosi = <&gpio5 10 0>;
        cs-gpios = <&gpio5 7 0>;
        num-chipselects = <1>;
        #address-cells = <1>;/* 这个SPI Master下的SPI设备,需要多少个cell来表述它的片选引脚 */
        #size-cells = <0>; /* 这个必须设置为0 */
		/* gpio_spi是spi_master 下边的device节点 */
        gpio_spi: gpio_spi@0 {
            compatible = "fairchild,74hc595";/* 根据它找到spi device驱动 */
            gpio-controller;
            #gpio-cells = <2>;
            reg = <0>;/* 使用哪个片选引脚 */
            registers-number = <1>;
            registers-default = /bits/ 8 <0x57>;
            spi-max-frequency = <10000>;/* 该设备支持的最大spi时钟 */
        };
    };

在这里插入图片描述

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

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

相关文章

状态机模型

文章目录 一、大盗阿福二、股票买卖 IV三、股票买卖 V四、设计密码4.1kmp题目4.2设计密码 一、大盗阿福 题目链接 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e5 10; int f[N][2]; int main() {int…

用户统计开发思路

1. 需求分析 所谓用户统计&#xff0c;实际上统计的是用户的数量。通过折线图来展示&#xff0c;上面这根蓝色线代表的是用户总量&#xff0c;下边这根绿色线代表的是新增用户数量&#xff0c;是具体到每一天。所以说用户统计主要统计两个数据&#xff0c;一个是总的用户数量&…

我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍

前言 大家好&#xff0c;这里是白泽&#xff0c;拖更了一段时间&#xff0c;抱歉。在 DouTok2.0 可以初步允许大家接入开发之后&#xff0c;这篇文章才得以出炉。 DouTok&#xff1a;一个开源的 web 端的短视频应用&#xff0c;采用微服务架构&#xff0c;包含前后端&#xff…

JavaEE初阶---网络原理之TCP篇(二)

文章目录 1.断开连接--四次挥手1.1 TCP状态1.2四次挥手的过程1.3time_wait等待1.4三次四次的总结 2.前段时间总结3.滑动窗口---传输效率机制3.1原理分析3.2丢包的处理3.3快速重传 4.流量控制---接收方安全机制4.1流量控制思路4.2剩余空间大小4.3探测包的机制 5.拥塞控制---考虑…

玩转HF/魔搭/魔乐社区

下载依赖 下载指定文件 玩转HF/魔搭/魔乐社区 1. 闯关任务 &#x1f600;Hello大家好&#xff0c;这节课为大家带来“玩转HF/魔搭/魔乐社区”的课程&#xff0c;课程任务请访问闯关任务 2. 课程内容 &#x1f600;Hello大家好&#xff0c;欢迎来到书生大模型实战营第四期…

ReactNative Fabric渲染器和组件(5)

ReactNative Fabric渲染器和组件 简述 Fabric是ReactNative中新架构最核心的模块&#xff0c;本章我们会来了解一下自定义一个Fabric组件&#xff0c;然后在JS文件中声明之后如何&#xff0c;是怎么映射到原生构建一个View的。 关于Fabric架构理念官网已经有说明了&#xff0…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件&#xff1a;impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律&#xff1a; 每对成年兔子每个月会生育一对新的小兔子&#xff08;一雌一雄&#xff09;。新生的小兔子需要一个月成长&#xff0c;到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件

手机上有很多组件&#xff0c;需要手机底部弹窗来做选择,picker选择器&#xff0c;select列选择器呀这些&#xff0c;在苹果手机上会被底部nav遮住 采用了好几种配置的方式&#xff0c;多多少少都不太行&#xff0c;还是采用css来做吧&#xff0c;但是css来写想让它生效&#x…

从零开始使用Surya-OCR最新版本0.6.1——最强文本检测模型:新添表单表格检测识别

目录 一、更新概述 二、环境安装 1.基础环境配置 2.模型参数下载 3.参数地址配置——settings.py 三、指令使用 1.命令指令运行 一、更新概述 surya项目Github地址&#xff1a;https://github.com/VikParuchuri/surya 号称今年最强OCR的surya近期迎来新的更新&#xff0c;Vik…

深入理解C++ Lambda表达式:语法、用法与原理及其包装器的使用

深入理解C Lambda表达式&#xff1a;语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind &#x1f30f;个人博客主页&#xff1a; 个人主页 本文深入介绍了…

nacos介绍

Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于提供发现、配置和管理微服务的统一解决方案&#xff0c;以支持构建云原生应用。 服务发现&#xff08;Service Discovery&#xff09;&#xff1a; Nacos 支持服务的动态注册与发现&#xff…

【操作系统实验课】Git操作基础

1. Windows系统 1.1. Git下载安装 下载 Git 访问 Git 官方网站:https://git-scm.com/。 在页面中找到适合 Windows 系统的下载链接,一般会有 “Windows” 字样的按钮,点击下载安装程序。 安装 Git 运行下载的安装程序。 在安装向导中,一般可以选择默认设置,也可以根…

搜维尔科技:Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,应用于元宇宙数字人制作解决方案

Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成&#xff0c;能够实现非常逼真且高效的数字人动作和表情捕捉&#xff01; 硬件连接与数据传输方面&#xff1a; 1.Xsens与Manus的集成&#xff1a;Xsens惯性动作捕捉系统通常可以与Manus的数据手套直接集成。Xsens主要…

MQTTnet4.3.x服务端+客户端实例测试(服务端和客户端方法及参数)

一、示例 目的&#xff1a;学习MQTTnet4.x使用方法&#xff0c;网上很多方法都是3.x版本介绍 二、方法调用 2.1 服务端 2.2 客户端 结合上篇博文&#xff0c;实现与多客户端进行交流&#xff08;实现在线客服功能&#xff09; 当然还有其他方法。之前曾写过相关MQTT文章&#…

【WebDriver】浏览器驱动下载及其配置

一、Windows电脑环境搭建-Chrome浏览器 行业内&#xff0c;Chrome (谷歌) 浏览器对于自动化程序来讲是比较稳定的. 自动化程序推荐使用 Chrome 浏览器的原因有几个&#xff1a; 开发者工具&#xff1a;Chrome 提供强大的开发者工具&#xff0c;方便调试和测试自动化脚本。 稳…

用jest做单元测试不得不知道的起手式配置,闭坑指南

做单元测试有很多的工具&#xff0c;今天在一个老项目中看到的用的工具是用的jest做的单元测试&#xff0c;特尝试更新下&#xff0c;遇到不少的问题。 相关依赖配置文件 npm install --save-dev jestpackage.json {"name": "jest-app","version&qu…

【Android】多渠道打包配置

目录 简介打包配置签名配置渠道配置配置打包出来的App名称正式包与测试包配置 打包方式开发工具打包命令行打包 优缺点 简介 多渠道打包 是指在打包一个 Android 应用时&#xff0c;一次编译生成多个 APK 文件&#xff0c;每个 APK 文件针对一个特定的渠道。不同的渠道可能代表…

Linux初学者导引:掌握主要命令与操作系统基础(第一天)

本文使用的工具&#xff1a;CentOS。 1.打开终端&#xff1a; 鼠标单击右键&#xff0c;选择“在终端打开(E)”选项。 2.命令行基础 常用命令&#xff1a; &#xff08;1&#xff09;ls:列出目录内容 列出当前目录或指定目录中的文件和文件夹。 基本用法&#xff1a;ls常…