linux spi相关调试

news2024/10/7 2:18:03

在Linux系统中,SPI 的用户模式设备接口的驱动源码位于 drivers/spi/spidev.c,在应用层生成 /dev/spidev* 的节点,可以通过 read、 write 达到与硬件设备的 SPI 通信。下面介绍spidev驱动移植和应用程序编写方法。

SPI (serial peripheral interface),以下是 linux 4.4 SPI 驱动支持的一些特性︰

默认采用摩托罗拉 SPI 协议

支持 8 位和 16 位

软件可编程时钟频率和传输速率高达 50MHz

支持 SPI 4 种传输模式配置

每个 SPI 控制器支持一个到两个片选

除以上支持,linux 4.19 新增以下特性:

框架支持 slave 和 master 两种模式

spiclk assigned-clock-rates 和 spi-max-frequency 的配置说明:

spi-max-frequency 是 SPI 的输出时钟,由 SPI 工作时钟 spiclk assigned-clock-rates 内部分频后输出,

由于内部至少 2 分频,所以关系是 spiclk assigned-clock-rates >= 2*spi-max-frequency;

假定需要 50MHz 的 SPI IO 速率,可以考虑配置(记住内部分频为偶数分频)spi_clk assigned-clock

rates = ,spi-max-frequency = ,即工作时钟 100 MHz(PLL 分频到一个不

大于 100MHz 但最接近的值),然后内部二分频最终 IO 接近 50 MHz;

spiclk assigned-clock-rates 不要低于 24M,否则可能有问题;

如果需要配置 spi-cpha 的话, 要求 spiclk assigned-clock-rates =

3M。

设备节点的读写操作例程请参照:

内核 4.4 Documentation/spi/spidev_test.c

内核 4.19 及以后 tools/spi/spidev_test.c

可在内核工程编译后,进入对应路径,输入以下命令直接编译标准 SPI app 程序:

buildroot系统,也有自带spidev_test程序的编译,路径:

buildroot/package/spidev_test/ 修改.mk为5.4最新版本,既可编译时自动下载

  1. 应用程序编写

在对驱动代码进行修改之后,需要根据驱动的架构来完成应用程序的编写,在内核源代码 Documentation/spi 目录下有一个spidev_test.c文件,是内核作者提供给Linux开发人员的参考文档,笔者也是参考此文件来编写的应用程序。

    应用程序无非是open、close、read、write、ioctl的使用。open,close没什么好说的,下面具体说下ioctl、read和write的使用。

    spi应用程序编写步骤:

    第一:open

    第二:ioctl ,ioctl有九种cmd,分别对应不同的arg

    a、设置或获取SPI工作模式

        SPI_IOC_RD_MODE //读 模式

        SPI_IOC_WR_MODE //写 模式

    以上两种cmd对用arg是spi_device.mode

    spi_device.mode有以下几种类型:

    #define SPI_MODE_0 (0|0)//SCLK空闲时为低电平,第一个时间延采样

    #define SPI_MODE_1 (0|SPI_CPHA)//SCLK空闲时为高电平,第一个时间延采样

    #define SPI_MODE_2 (SPI_CPOL|0)//SCLK空闲时为低电平,第二个时间延采样

    #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)//SCLK空闲时为高电平,第二个时间延采样

    #define SPI_CS_HIGH 0x04//片选为高

    #define SPI_LSB_FIRST 0x08//低位数据先传输

    #define SPI_3WIRE 0x10//三线式,输入输出数据线为一条线

    #define SPI_LOOP 0x20//回环模式

    #define SPI_NO_CS 0x40//没有片选信号

    #define SPI_READY 0x80//

    用法:

    mode = mode | SPI_MODE_0 | SPI_CS_HIGH | SPI_LSB_FIRST | SPI_LOOP

    ioctl(fd, SPI_IOC_WR_MODE, &mode);

    注意:前面四种是对SCK时钟信号空闲时的电平,和采样时刻的选择,四个只能选择其中一种,后面的五种可以用或的形式选择任意几个,使用方法如上

    b、设置或获取SPI读写是从高位还是低位开始

        SPI_IOC_RD_LSB_FIRST //读 LSB

        SPI_IOC_WR_LSB_FIRST //写 LSB

    以上两种cmd对用arg是spi_device.mode

    用法:同上,但是mode类型只有SPI_LSB_FIRST一种

    c、设置或获取SPI读写数据位数

        SPI_IOC_RD_BITS_PER_WORD //读 每字多少位

        SPI_IOC_WR_BITS_PER_WORD //写 每字多少位

    以上两种cmd对用arg是spi_device.bits_per_word

    用法:

    bits = 8;

    ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);

    d、设置或获取SPI读写的最大频率

        SPI_IOC_RD_MAX_SPEED_HZ //读 最大速率

        SPI_IOC_WR_MAX_SPEED_HZ //写 最大速率

    以上两种cmd对用arg是spi_device.max_speed_hz

    用法:

    speed = 501000;    

ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);    

e、传输数据        S

PI_IOC_MESSAGE(n) //传输n个数据包    

以上一种cmd对用arg是spi_ioc_transfer   

 用法:全双工传输数据struct spi_ioc_transfer tr = {.tx_buf = (unsigned long)tx,.rx_buf = (unsigned long)rx,.len = ARRAY_SIZE(tx),.delay_usecs = delay,.speed_hz = speed,.bits_per_word = bits,};ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);12345678910   

 第三:read或write    

用法:和大多数的设备read函数一样的用法,但是每次读或者写的大小不能大于4096Byte。   

char buf[n];

    read(fd,buf,sizeof(buf));或者write(fd,buf,sizeof(buf));

    第四:close

原文链接:Linux内核自带SPI设备驱动测试程序分析:spidev_test.c_heat.huang的博客-CSDN博客

注意: 我们项目是soc与fpga通信,其中涉及到一些大数据量的传输,所以spi传输速率是有要求的。调试发现改成48M之后,读取概率会出错,抓取波形,发现读取的数据会少一个周期。

参考文档,

我们进行延迟采样2个周期解决,dts修改如下:

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

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

相关文章

阿里 P8 面试官总结的《2023 最新 java 面试题》限时开源了

国内的互联网面试,恐怕是现存的、最接近科举考试的制度。 以美国为例,北美工程师面试比较重视算法(Coding),近几年也会加入 Design 轮(系统设计和面向对象设计 OOD)和 BQ 轮(Behavi…

怎么学习数据库的相关知识? - 易智编译EaseEditing

学习数据库的相关知识可以按照以下步骤进行: 确定学习目标: 了解数据库的基本概念、原理和常用术语,学习数据库管理系统(DBMS)的功能和特性,以及掌握数据库设计和查询语言等方面的知识。 学习数据库基础知…

【闭包函数与装饰器大全】——python基础

目录索引 闭包:闭包三要素:闭包的作用:闭包演示:闭包的意义: 装饰器:特点:实例演示:实例演示2之参数: 装饰器常用的场景:编写一个计时的装饰器:*普…

AIGC和虚拟现实为什么必然产物

背景 在流量存量时代,内容运营重要性不言而喻。在流量时代,内容可以不要过于多样化和差异化,只需要有足够多的人流量,按流量转化比率来看,1000个人有1%概率转化,素材不变只要增加足够多的流量那就一定会有…

永久存储:文件处理与路径处理

📢博客主页:盾山狂热粉的博客_CSDN博客-C、C语言,机器视觉领域博主📢努力努力再努力嗷~~~✨ 💡大纲 ⭕如何将数据永久的存放到硬盘上 👉不要打开文件,然后直接关闭文件,会导致截断 一、如何操作…

OneNote支持Markdown:高亮代码

文章目录 结论在前效果安装日常工作流(高亮代码块) 结论在前 markdown对我来说是伪需求,真正需要的是高亮代码,通过Github/NoteHighlight2016这个开源插件可实现这个插件虽然叫2016,但实测onenote 2013也是可以用的 效…

华为OD机试之数组去重和排序(Java源码)

数组去重和排序 题目描述 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。 输入描述 一个数组 输出描述 去重排序后的数组…

使用微信怎么图片投票怎么设置qq里面投票是如何

手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。 现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工作效率,提高活动的影响力。 那么微信做投票的小程序哪个比较…

苹果头显Vision Pro深度解读2 软件开发者谁最受益?

1 软件开发者谁最受益? 开发Vision pro这种设备的软件啊,首先得跟vision pro本身的特点结合起来,比如它本质上并不是一个很适合移动的的设备。用户大多数时候,都是坐着,站着,躺着使用。 所以典型的应用场…

【Linux】文件描述符与重定向操作

系列文章 收录于【Linux】文件系统 专栏 对于Linux下文件的写入与读取,以及文件原理还有疑惑的可以看看上一篇文章浅谈文件原理与操作。 目录 系列文章 再谈文件描述符 ​编辑 IO函数的本质 一切皆文件 文件重定向 原理 系统接口 再谈文件描述符 &#x…

C语言 指针(特别篇)

本篇目录 C语言 指针(特别篇)内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &(Address-of Operator)C语言中的 * 号运算符示例集:指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…

doris docker部署 1.2.4.1版本

目录 写在前面 镜像编译 准备工作 下载编译好的包 fe be 编辑初始化文件 fe be 编辑Dockerfile fe be 构建镜像 fe be 构建结果 镜像运行 fe be 修改配置 添加udf依赖 启动be 注册be 错误分析 写在前面 以下操作语句按顺序执行即可,如果需要…

泛型Generic

泛型 1. 介绍1.1 使用泛型的好处 2. 自定义泛型结构:泛型类、泛型接口;泛型方法2.1 泛型类、泛型接口2.2 泛型方法 3. 其他3.1 泛型在继承方面的体现3.2 通配符使用3.2.1 有限制的通配符 1. 介绍 把元素的类型设计成一个参数,这个类型参数叫…

数组6大排序算法

快速排序 核心算法: 1.取一个基准值(一般是数组中间的元素),遍历数组,比基准值大的放右边,小的放左边,相等的则不动 2.分别创建三个数组来存储元素,最后将三个数组拼接起来 3.循…

Java替换Jar文件中的class文件方法

备份源文件 文件不重要的话可以不需要备份,线上环境务必备份方便回滚 mkdir bak cp test.jar bak 查看class文件所在目录 jar -tvf test.jar | grep Time.class 标红内容就是需要替换的class文件,如果有多个文件需要替换依次执行2,3步骤…

webSocket实时通信02——基于Spring【纯后端——JAVA】

这里是基于Spring整合websoket后来实现的实时通信&#xff0c;这里只有java的代码&#xff0c;通过在线网站 http://www.websocket-test.com/测试即可 1. 导包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

网络安全合规-职业发展路线

网络安全人才一将难求&#xff0c;缺口高达 95% 在以前&#xff0c;很多政企单位在进行 IT 部门及岗位划分时&#xff0c;只有研发和运维部门&#xff0c;安全人员直接归属到基础运维部&#xff1b;而现在&#xff0c;越来越多单位为了满足国家安全法律法规的要求&#xff0c;…

终极攻略!如何彻底防止Selenium被检测!

在使用Selenium进行爬虫时&#xff0c;许多朋友都会遇到各种反爬措施。 实际上&#xff0c;在绝大多数情况下&#xff0c;网站轻而易举地能够检测出你正在使用WebDriver而非标准浏览器。 本文将详细介绍如何有效防止检测的方法。 在一篇公众号文章《别去送死了。Selenium 与…

【重磅】智能未来 —— 人工智能与城乡规划的交叉对话(CSDN深圳城市开发者社区首场线下技术交流活动)

文章目录 活动主题活动海报活动时间活动地点互动有礼加入有礼赠书简介特别说明 活动主题 智能未来-人工智能与城乡规划的交叉对话 —— 以 AI 为核心主题&#xff0c;探索 AI 在 智慧城市、智能视频、智能编程 等重点领域的技术发展和实战落地。 活动海报 活动时间 2023.06…

加密与解密 调试篇 动态调试技术 (五)-WinDbg

windbg主要厉害的地方是在他可以对内核调试 并且本身微软的产品 对windows调试适配度够高 注意 windbg给出的图形操作并不好用 主要是使用命令行来进行操作 我们省略安装 直接进入调试 file 可以打开软件 可以附加也可以分析dump文件还可以进行内核和 远程调试内核调试分为…