40 Linux SPI通信问题记录

stm32spi实战(硬件+模拟) 接着开始的信号,开始信号拉低了ss,这个时候就能把数据发出去了(只管主机,从机代码不是我们写的)发出去之后拉高时钟线(这里我们用的模式0,时钟线空闲时为0,所以第一个操作只能是拉高)拉高之后就能执行读取的操作了,就是讲函数写入的字节,一位一位的发出去,我们将发送的数据与0x80相与就能发出最高位,之后在与0x40相与就能发出第二位,这样我们直接写一个循环,让0x80依次右移一位,0x1000 0000 这样有数据的位就能发送出去了。就是刚好只变最后一个字节的存储计数为255字节。 阅读详情

38.1 SPI简要介绍

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。

SPI是通过移位寄存器进行数据收发的,也就是由主机发起动作,如果主机进行单字节传输,主机发一个数据就会从从机中拿到一个数据,不管你愿不愿意,每发送一个数据,从机都会发一个数据过来。如果是没用的数据,那么不用管就好。所以SPI刚开始第一个字节通信时,一般拿到的是无效数据内容。所以,在通信时,一般发一个指令,然后跟地址,然后读取数据,可以避免这问题。

主机和从机模式区别在哪?答:就是谁发起时钟信号,就这样!

spi四种模式SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,对应的4种组合构成了SPI的4种模式:

Mode 0 CPOL=0, CPHA=0 //0-低电平 0-第一个边缘

Mode 1 CPOL=0, CPHA=1 //0-低电平 1-第二个边缘

Mode 2 CPOL=1, CPHA=0 //1-高电平 0-第一个边缘

Mode 3 CPOL=1, CPHA=1 //1-低电平 1-第二个边缘

SPI通信的基本协议格式:操作指令-地址-(读/写)数据;

38.2 SPI主从机通信问题

最近在搞Linux和单片机(MCU)的SPI通信,其中遇到一些问题。首先Linux默认的SPI驱动是master模式,所以单片机必须选为从机模式(slave)。而SPI是全双工高速、同步(就是这个同步)通信方式,也就是说数据读写只能主机发起,从机只有干等的份。如果主机不发起时钟,从机就无法发送数据,所以难点在这里。主机需要不定时的寻问从机的操作是否完成,是否已经准备好数据,准备好之后,则需要发送时钟给从机,才能把从机中的数据收上来。

本次项目中,Linux跟MCU的SPI通信原本是觉得一下子搞定,但是因为还是不够熟悉导致项目进度没有预想那么快,所以在此记录下本次项目中遇到的问题:

1.主机发送 0x7f 0x12 0x13 时,主机收到什么就回什么数据,然后主机收到0xff 0x7f 0x12;

2.主机跟从机通信出现数据丢失,或移位问题;

以下是对于以上问题的解决及想法:

对于问题1:

主机发送完0x7f 0x12 0x13之后,收到的数据却是多了一个0xff 少了一个0x13,那是因为移位寄存器的原因,你发第一个字节0x7f时,那边会把从机中SPI-DR中的0xff返回给主机,所以接收到的第一个字节是没用的。解决办法是,先发一个操作码,然后再读数据。然后还少了0x13,那是因为主机这边只发了三个时钟,0x13理论上到达了第四个时钟,所以收不到这个,如果想收到,那么就发第四个时钟就可以收到了。

对于问题2:

对于现在的SPI数据收发速率可以达到50Mbps这么快,但是一般情况,我们并不会设置这么快的传输速度,原因一般有这几个:

1、PCB布板,电磁干扰信号不稳定时,需要低频率通信;

2、模拟SPI时输出端IO的驱动能力跟不上,需要降速;

3、CPU主频低,处理SPI速度慢时需要降低频率通信;

我遇到的是第三个问题,因为是Linux跟stm32单片机SPI同信,解决的方案是,先测量出MCU中但判决对于SPI中断函数处理时间,然后再调通信频率。比如:我用的是stm32f103c8t6单片机,主频72M,使用SPI1。经过测量,从进入SPI中断函数,再出来,需要21个系统时钟节拍,那也就是用时:

所以通过上述计算,我的SPI通信速度应该小于3.4Mbps才能正常通信,不掉数据。

SPI接收数据异常问题总结 SPI接收数据左移一位问题总结 阅读详情

相关推荐

电子墨水屏跨平台驱动指南:从树莓派到STM32的SPI通信与低功耗显示实战

电子墨水屏(e-Paper)是一种基于微胶囊电泳显示技术的低功耗显示方案,其核心原理是通过电压控制黑白带电粒子的位置来形成图像,断电后图像仍可长期保持。这项技术的关键价值在于实现了超低功耗和强光下的清晰可视性,特别适合嵌入式系统和物联网设备中需要长时间静态显示的场景。在工程实践中,通过SPI通信协议与SSD1680等专用驱动芯片交互,开发者可以在树莓派、Arduino、Jetson Nano和STM32等多种硬件平台上实现驱动。本文聚焦于2.15英寸电子墨水屏HAT+模块,详细解析其硬件设计、SPI通信流程

weixin_34090562的博客 560

A7+linux4.14内核SPI 总线通讯异常问题分析

SPI总线波形,需关注CLK时序,特别再操作系统中,不通版本的CS操作,可能会导致截然不通的效果

roostnew的博客 1748

树莓派SPI1启用与MCP2515 CAN总线配置全攻略

SPI(串行外设接口)是一种高速、全双工的同步串行通信总线,广泛应用于嵌入式系统连接各类传感器、存储器和控制器。其工作原理基于主从架构,通过时钟信号同步数据交换,具有接线简单、速度快的优点。在工业控制、汽车电子和物联网设备中,SPI是实现设备间可靠数据通信的关键技术。当系统需要连接多个SPI外设时,启用备用SPI总线资源成为扩展系统能力的重要实践。本文以树莓派平台为例,针对其默认SPI0接口被占用的典型场景,深入解析如何通过配置设备树(Device Tree)启用隐藏的SPI1硬件控制器,并成功挂载MCP2

weixin_30629653的博客 363

在ARM Linux下使用GPIO模拟SPI时序详解

Author:杨正  Data:2016.1.1  Mail:yz2012ww@gmail.com 一、       概述 SPI是英文SerialPeripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速、全双工、同步通信总线,标准的SPI有4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理等器件的通信。SPI通信原理要比I2

杨正的专栏 2万+

香橙派H3驱动1.3寸ST7789 SPI屏全记录(附避坑指南)

本文详细记录了在香橙派H3平台上驱动1.3寸ST7789 SPI屏幕的完整过程,涵盖硬件连接、内核FBTFT驱动修改、设备树配置及内核编译等关键步骤。文章重点剖析了SPI引脚上拉配置、GPIO申请、电源干扰等常见“暗坑”,并提供了实用的避坑指南和调试方法,帮助开发者顺利完成屏幕驱动与集成。

weixin_29182481的博客 662

aic8800M40低功耗sdio wifi在arm-linux平台调试经验

AIC8800M40低功耗wifi芯片通过SDIO连接到arm-linux平台调试经验

十多年蓝牙协议软件开发,擅长蓝牙协议分析 3203

Linux SPI设备接口函数解析&QT调试Demo

通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚。 MOSI:主设备输出/从设备输入引脚 SCK:串口时钟,作为主设备的输出,从设备的输入 NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。 时序: SPI有4种工作时序模式: CPOL表示时钟信号的初始电平的状态,CPOL为0表示时钟信号初始状态为低电平,为1表示时钟信号的初始电平是高电平。 CPHA来表示在那个时钟沿采样数据,CPHA为0表示在首个时钟变化沿采样数据,而CPHA为1则表..

JJ的博客 4677

Linux SPI接口显示屏调试过程记录

摘要:本文针对SPI接口ST7789系列驱动IC显示屏的动态画面撕裂问题进行分析,提出双缓冲和同步更新两种解决方案。通过调整SPI最大通信速率(20MHz/50MHz)和帧率控制(40/50/60/119Hz)的组合配置,结合逻辑分析仪波形验证优化效果。研究发现撕裂主要源于MCU写入与驱动IC读取时序冲突,建议采用TE信号同步、合理配置刷新率与SPI时钟、优化UI引擎渲染策略等综合方法。实际应用需结合DMA传输和逻辑分析仪验证,在写入速度与读取速度1:2比例范围内实现稳定显示。

qq_42128606的博客 1062

linux spi 设备节点 读写

本文记录spi设备节点的操作方法。 SPI总线设备文件名通常为/dev/spidevN.P(N=0、1、2……,P=0、1、2……), 其中N表示第几路SPI总线,而P表示在该路SPI总线中使用哪个CS信号线。 参考链接:   http://www.wzaobao.com/p/l5079K.html   http://www.emcraft.com/stm32f429discovery/...

青豆——廖 2947

SPI总线的特点、工作方式及常见错误解答

SPI总线技术是Motorola公司推出的一种同步串行接口。它用于CPU与各种外围器件进行全双工、同步串行通讯。它只需四条线就可以完成MCU与各种外围器件的通讯。文章介绍了SPI总线的特点、工作方式以及对常见错误进行了解答。

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 699

SPI转can芯片CSM300详解、Linux驱动移植调试笔记

CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块。CSM300(A)系列隔离 SPI / UART 转 CAN 模块是集成微处理器、 CAN 收发器、 DC-DC 隔离电源、 信号隔离于一体的通信模块, 该芯片可以很方便地嵌入到具有 SPI 或 UART 接口的设备中, 在不需改变原有硬件结构的前提下使设备获得 CAN 通讯接口, 实现 SPI 设备或 UART 设备和 CAN 总线网络之间的数据通讯。外观CSM300使用SPI转CAN功能时, 需要将MODE引脚接至高电平。

tecoes的博客 992

初学树莓派——(九)DHT11数据传入ONENET

目录 前言 DHT11实现本地温湿度监测 DHT11.py 接线图 效果图 温湿度数据上传至ONENET 新建产品 新建设备 ONENET.py 测试 Shell脚本配置 效果图 前言 本文分部分实现温湿度上传至OneNet云平台,本地数据监测,数据上传 新建一个文件夹,文件夹内包含DHT11.py、ONENET.py、tmp_data.txt、hum_data.txt DHT11实现本地温湿度监测 DHT11.py import RPi.GPIO as GPIO

会点灯的大力水手的博客 2612

Linux SPI驱动实战:从spi_sync超时到Flash识别的完整链路

SPI(串行外设接口)是嵌入式系统中最常用的同步串行总线之一,其核心在于主从架构下的可靠数据交互。理解SPI协议原理后,关键在于掌握Linux内核中SPI Master控制器与Slave设备的协同机制,以及`spi_sync`等核心API的底层行为逻辑。技术价值体现在对硬件时序、片选管理、错误码(如ETIMEDOUT、EIO)的精准响应能力,支撑工业控制、AI芯片外设、Flash存储等高可靠性场景。本文聚焦真实产线中SPI Flash设备的驱动落地过程,覆盖设备树配置、`spi_setup`调用时机、`sp

weixin_30920597的博客 482

立创开源TinyAWG:基于ZYNQ7010的35MHz带宽200MSa/s任意波形发生器设计与实现

本文详细解析了立创开源TinyAWG的设计与实现,这是一款基于ZYNQ7010芯片的低成本高性能任意波形发生器。项目实现了35MHz带宽和200MSa/s采样率,核心采用ARM+FPGA协同架构,FPGA负责高速DDS信号生成,ARM运行Linux并搭载LVGL图形界面。文章涵盖了硬件选型、电路设计、软件逻辑及性能测试,为复刻和学习ZYNQ系统设计、高速DAC应用提供了完整参考。

weixin_42576467的博客 434

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2250

Linux内核学习17--SPI子系统

本文介绍了Linux SPI子系统的架构及其在树莓派5上的应用实践。主要内容包括:1. SPI子系统四层架构:用户层(spidev接口)、核心层(通用API)、控制器驱动层(硬件时序实现)和外设驱动层。2. 树莓派5的SPI配置:默认SPI0关闭,需手动开启生成/dev/spidev0.0节点,并详细解析了设备树节点与硬件引脚的对应关系。3. 开发调试方法:包括环回测试(spidev_test)、内核事件追踪(ftrace)、动态调试(dynamic_debug)、引脚复用状态检查等实用技巧。4. 驱动开发

fanged的专栏 350

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 174

树莓派SPI1/SPI2接口配置MCP2515 CAN总线模块全攻略

SPI(串行外设接口)是一种高速、全双工的同步通信总线,广泛应用于微控制器与传感器、存储器等外设的连接。其工作原理基于主从架构,通过时钟线同步数据交换,具有接线简单、速度快的优点。在嵌入式Linux系统中,SPI设备的管理依赖于设备树(Device Tree)这一硬件描述机制,它使得驱动与硬件配置解耦,提升了系统的可移植性。对于树莓派这类单板计算机,其原生SPI0接口常被默认使用,但在多外设或引脚冲突的场景下,启用其备用的SPI1、SPI2等接口就变得至关重要。这不仅能解决资源冲突,还能实现更灵活的硬件布局

weixin_34268843的博客 364

044.树莓派4B部署YOLO:从系统烧录到模型运行

《树莓派4B部署YOLOv8实战笔记》摘要:本文详细记录了在ARM架构树莓派4B上部署YOLOv8的全流程。关键点包括:必须使用64位系统并手动编译OpenCV(禁用FFMPEG、开启NEON优化);模型需在x86转换为TFLite格式(分辨率不超过320×320);推理代码使用tflite_runtime替代TensorFlow以减少内存占用;针对USB摄像头卡顿、内存泄漏等典型问题给出了解决方案。

2603_95664987的博客 169

基于AOD-Net与GAN的深度学习去雾算法开发

本文提出一种结合AOD-Net与GAN的深度学习去雾算法。通过改进的AOD-GAN网络架构,集成风格迁移模块,设计包含对抗损失、内容损失和风格损失的复合目标函数。实验表明,该方法在PSNR(24.67)、SSIM(0.92)和FID(32.15)指标上优于传统方法,实现了端到端的物理模型引导图像去雾。未来将优化多尺度特征融合和轻量化部署。

huanghm88的专栏 594

Linux 驱动研究 —— SPI (6)

作为内核 SPI 子系统的核心执行引擎,主控层驱动负责将上层抽象出的标准化数据请求(spi_message)转化为底层硬件可解析的指令序列;它既是通信协议的‘配置者’,也是数据流的‘调度指挥官’,通过对物理寄存器、DMA 通道及中断系统的实时操控,确保数据在内存缓冲区与物理总线之间实现稳定、高效、有序的闭环传输。

kdxiaojie的博客 297

C语言实现惯导更新算法(机械编排)

四元数可用于描述刚体转动或姿态变换,与方向余弦阵相比,表达简洁。四元数是一个包含四个元素的列向量,列向量的第一个元素表示刚体围绕旋转轴转过的角度大小,其余3个元素代表了旋转轴的方向。

十八与她的博客 1730

电子墨水屏驱动全解析:从SPI通信到低功耗显示优化实践

电子墨水屏(E-paper)是一种基于电泳显示技术的双稳态显示器件,其核心原理是通过电场控制带电颜料微粒的移动来实现图像显示。这种技术仅在画面刷新时消耗电能,显示静态内容时功耗近乎为零,具有类似纸张的视觉体验和极低的能耗特性。在工程实践中,电子墨水屏通过SPI(串行外设接口)与主控设备通信,需要正确处理片选(CS)、数据/命令选择(DC)、复位(RST)和忙状态(BUSY)等控制信号。其技术价值在于为物联网设备、智能家居仪表盘、电子标签等需要长时间显示固定信息且对功耗敏感的场景提供了理想的显示解决方案。以树

weixin_30352191的博客 506

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记

一口君最近移植了一款SPI转CAN的芯片CSM300A,在这里和大家做个分享。一、CSM300概述CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块。1. 简介CSM300(A)系列隔离 SPI / UART 转 CAN 模块是集成微处理器、 CAN 收发器、 DC-DC 隔离电源、 信号隔离于一体的通信模块, 该芯片可以很方便地嵌入到具有 SPI 或 UART...

weixin_42594419的博客 828

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux 驱动研究 —— SPI (3)

本篇文章详细记录了 SPI 框架图中内核层的接口层,先从 无法打印出 probe函数的具体问题进入分析,教给读者定位问题的方法;最后研究了由调用链倒序分析,从最底层开始,最后创建设备的过程。

kdxiaojie的博客 254

SAP B1中文培訓教材_SDK

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

上一篇: 39 Linux如何查看哪个线程占用CPU最高
下一篇: 41 Windows VS封库及库引用
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值