关于spi的半双工读写和全双工读写 spi.c spidev.c spidev_message() struct spi_ioc_transfer

SPI (四) -- spi_sync和spi_async的调用流程 内核版本:4.9.88前面我们分析了总线驱动模型,同时分析了如何编写设备驱动。只从上层使用角度去分析。因为内核的spi代码里已经提供好了相应的函数框架供我们使用,这里看一下最核心的两个函数spi_sync和spi_async。 阅读详情

一点理解,不知道是否正确,请指正.

 

在spidev.c有read write 以及spidev_message函数.分别实现半双工和全双工的功能.

不过最后调用的都是spi控制器驱动的transfer函数.

例如, atmel_spi_transfer() 【drivers/spi/atmel_spi.c 】

 

那么驱动如何判断应用程序要读还是写呢?

简单,判断tx_buf或者rx_buf是否为空即可!

例如read 的读写流程:

调用顺序:spi_read(spi.h)->spi_sync(spi.c)->spi_async(spi.h)->spi->master->transfer(总线的驱动)

 

所以,全双工函数实际上是同时给rx_buf何tx_buf赋了值。

 

有一点需要注意,spi_sync()函数是个阻塞函数,里面有一句话:

 

if (status == 0) {
        wait_for_completion(&done);
        status = message->status;
}

 

你的传输结束后需要加上这么一句(不管是否使用中断和dma):

 

msg->complete(msg->context);

 

否则spi_sync()就死等,当然内核没有死,不过你也干不了其他事了.

另外,在msg->complete(msg->context);之前,必须置位msg->status=0,否则spi_sync会返回这个状态,就是ioctl的返回值.

 

另请注意,在应用层,一般会使用ioctl(fd, SPI_IOC_MESSAGE(2), xfer);来进行读写一起的操作.在声明xfer后,必须初始化为0:

struct spi_ioc_transfer xfer[2];

memset(xfer, 0, sizeof xfer);

这是因为驱动层会判断tx_buf和rx_buf不为空来进行读写操作!否则很容易误判断!

 

SPI全双工通信解读和调试问题分析汇总 致敬对这篇文档感兴趣的所有读者,关于对spi通信的解读,目前花费大概几个星期进行相关验证和调试,在这个过程中发生了很多奇怪的现象,一般来说spi控制形式多种多样,对于spi的全双工、半双工通信形式也会有所不同,这篇文档主要是帮助大家解读spi不同机制通信和相关问题分析,以供后期方便类似问题及时参考。本文档重点解读spi下相关控制机制,其中包括spi的控制器形式和spi的gpio通信形式多方位解读。 阅读详情

相关推荐

154 spidev:SPI“万能”驱动

文章目录一、总结二、两个数据类型1、spidev_data结构体2、spi_ioc_transfer结构体三、设备树节点1、pinctrl子节点2、spidev子节点四、spidev_init()函数spidev_fops文件操作接口(1) spidev_read()函数spidev_sync_read()函数spidev_sync()函数(2) spidev_ioctl()函数spidev_message()函数应用层对应的ioctl()函数SPI_MODE_MASK宏spidev_get_ioc_mes

engineer0的博客 4721

spi应用层写法

1.1     重要的数据结构 1.  spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它。 在内核中,每个spi_device代表一个物理的SPI设备。它的成员如程序清单 1.1所示。 程序清单 1.1 spi_device [cp

wang714818的博客 1万+

Linux SPI子系统(2):SPI核心层

上次简单介绍了下Linux SPI子系统的系统结构,主要有3部分组成,分别是SPI核心、SPI总线驱动(控制器驱动)以及SPI设备驱动。SPI核心层代码位于drivers/spi/spi.c,头文件位于include/linux/spi/spi.h,SPI核心提供了SPI总线驱动和设备驱动的注册、注销方法,并提供一些需要控制器驱动实现的回调函数。本文主要介绍SPI核心层,包括重要的数据结构和API。

MisakiMe1的博客 2613

【驱动】SPI驱动分析(七)-SPI驱动常用调试方法

使用spi_test可以发送和接收SPI数据,以验证spidev驱动的功能和性能。总结起来,spidev驱动提供了一种简单而灵活的方式来与SPI设备进行通信,使得用户可以轻松地在Linux系统上开发和控制SPI设备。根据传入的参数和全局变量的设置,配置SPI传输的参数,并将发送和接收的数据进行打印。这段代码通过解析命令行选项,并根据选项的值设置相应的变量,实现了对命令行参数的解析和处理。通用设备驱动以及对应的ioctl命令实现,可以方便的用来对spi的通用型驱动来进行测试。函数,作为内核模块的初始化函数。

嵌入式与Linux那些事的博客 4591

Linux spi:用户空间“免设备驱动”读写spi设备方法——spidev

spi_device虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它。0x010x02(0|0)(0|)(|0)(|)0x040x080x100x20spi_device的mode成员有两个比特位含义很重要:SPI_CPHA选择对数据线采样的时机,0选择每个时钟周期的第一个沿跳变时采样数据,1选择第二个时钟沿采样数据;...

weixin_44498318的博客 8228

爬取信用中国里面的行政处罚

result字段名为行政处罚文书号、处罚决定日期、处罚内容、处罚金额、违法事实、处罚机关、公司名称,行政处罚次数。file_path=r'E:\Data analyze\python\行政处罚爬虫/'#路径需要按实际修改。writer = pd.ExcelWriter('统计.xlsx')# 写入Excel文件。src_workbook=file_path+r'行政处罚(名单).xls' #表格名称也要更改。# keyword = input("输入爬取的公司全称必须是全称")

qq_42863025的博客 1674

与spi有关的c语言程序设计,关于spi的半双工读写和全双工读写 spi.c spidev.c spidev_message() struct spi_ioc_transfer...

一点理解,不知道是否正确,请指正.在spidev.c有read write 以及spidev_message函数.分别实现半双工和全双工的功能.不过最后调用的都是spi控制器驱动的transfer函数.例如, atmel_spi_transfer() 【drivers/spi/atmel_spi.c 】那么驱动如何判断应用程序要读还是写呢?简单,判断tx_buf或者rx_buf是否为空即可!例如r...

weixin_39880621的博客 1135

FPGA从入门到精通(2) - LUT

LUT:(look up table) 查找表 今天我要讲的与FPGA CLB相关的第一节LUT。根据上一节课的课程大纲,讲CLB应该是讲SLICEL(SLICEM)。不过当我打开用户手册,看了一下SLICE的结构(图一),一眼望去,这是分分钟会劝退入门者。为了让读者更好的接受以及理解,所以我打算先讲清楚它里面的每一个基本单元(LUT, 进位链,MUX,寄存器,几乎所有的FPGA器件的SLICE都是这四大件组成,只是组合不太一样而已),然后再将他们联系在一起,和读者一步步推倒出SLICE的结构。 图1​

Jasper灬兰的博客 1万+

Linux驱动修炼之道-SPI驱动框架源码分析(下)

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处 http://blog.csdn.net/woshixingaaa/article/details/6574224 这篇文档主要介绍spi数据传输过程。 当应用层要向设备传输数据的时候,会通过ioctl向设备驱动发送传输数据的命令。如图,向SPI从设备发送读写命令,实际的读写操作还是调用了主机控制器驱动的数...

tomhibolu 372

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 452

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 374

21.SPI万能驱动

spi支持全双工,可使用unlocked_ioctl接口可以支持半双工、全双工(switch的default选择)收发消息。32bit系统对应fops中的unlocked_ioctl接口,即spidev_ioctl。可用来设置spi的通信参数,但很少用,用户空间编程也会用到此结构体。存放在内核/drivers/spi/spidev.c文件。内核集成spidev驱动模块,开机后会中的加载此模块。全双工收发信息,本质上还是调用一些spi核心层的函数。内核开放的通用版本的spi驱动。支持修改多种spi通信参数。

weixin_47077788的博客 1098

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细

sakura的博客 3万+

用户空间的spi驱动

============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版权没有,但是转载请保留此段声明 ============================================ 1.1     重要的数据结构 1.  spi_device 虽然用户空

yuanlulu的博客 2万+

【PDN仿真笔记9-使用Sigrity PowerDC进行IR Drop仿真的方法】

使用Sigrity PowerDC进行IR Drop进行仿真的方法

qq_42682826的博客 8000

【3D Slicer】的小白入门使用指南一

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 5553

linux应用:spi_ioc_transfer结构cs_change说明

linux应用层控制spi设备时cs_change的使用注意事项

So_shine的博客 1011

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 946

【Linux】Linux驱动开发:SPI子系统

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC 的 SPI 控制器接口。样。和 I2C适配器驱动一样,SPI主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC的使用者,这一部分的驱动就不用操心了。

W__winter的博客 3522

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux系统编程9-SPI通信

序号 内容 链接 1 多进程 点我访问 2 进程间通信 点我访问 3 多线程 点我访问 4 网络编程 点我访问 5 shell 点我访问 6 Makefile 点我访问 7 串口通信 点我访问 8 I2C通信 点我访问 9 SPI通信 点我访问 1 SPI通讯协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等...

L1643319918的博客 8178

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux SPI 应用编程

Linux SPI 应用编程 设备文件 /dev/spidevx.y x是SPI总线号,即一组SCLK、MOSI、MISO y是SPI设备号,同一条总线上用不同的片选信号区分:CE0、CE1等 对于树莓派,启用SPI功能后,有一条总线,两个设备: /dev/spidev0.0 /dev/spidev0.1 树莓派上还可以通过dtoverlay使能第二条SPI总线,支持三个设备: 在config.txt中加入 dtoverlay=spi1-3cs 树莓派SPI相关PIN定义参考https://pinout.x

1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

spi 协议硬件分析以及在linux上的实现分析

Spi几种模式: 模式0: CPOL=0 CPHA=0 模式1: CPOL=0 CPHA=1 模式2: CPOL=1 CPHA=0 模式3: CPOL=1 CPHA=1 现在看看3模式 1.CLK空闲的时候为高电平 [CPOL = 1] 2.在第二个边沿采样 [CPHA = 1] 发送一字节 8bit数据

alianqiugui的博客 2633

153 SPI数据传输剖析:同步、异步

文章目录spi_register_master() 宏spi_register_controller()函数spi_controller_initialize_queue()函数spi_init_queue()函数spi_start_queue()函数spi_pump_messages()函数__spi_pump_messages()函数spi_transfer_one_message()函数spi_finalize_current_message()函数spi_sync()函数__spi_sync()函数

engineer0的博客 6218

FL2440开发板spi驱动分析(3)

本文分析SPI发送数据的过程,首先构造spi_ioc_transfer结构,再调用ioctl函数发送。  如测试程序中的transfer函数。

nanaoxue的专栏 786

linux I2C驱动4种读写方法

From 一:读写/dev/i2c-x设备结点 /dev/i2c-x设备结点对应的驱动文件为内核目录drivers/i2c下自带的i2c-dev.c文件,通读此文件可以发现它的工作流程。 1、通过register_chrdev注册字符设备结点 2、通过class_create在sysfs下创建对应的class结点 3、利用bus_register_nofifier对I2C总线添加通知链,...

Android系统攻城狮 6508
上一篇: Windows上建立AndRoid开发环境
下一篇: 指针 8位转32 的读写技巧
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值