首页 > 系统相关 >嵌入式Linux SPI子系统驱动 通信协议原理 硬件 时序 深度剖析

嵌入式Linux SPI子系统驱动 通信协议原理 硬件 时序 深度剖析

时间:2025-01-13 16:02:34浏览次数:3  
标签:总线 通信协议 SPI fd Linux 数据传输 设备 时钟

SPI(Serial Peripheral Interface,串行外设接口)是一种同步的串行通信协议,通常用于微控制器和外部设备(如传感器、存储器、显示屏等)之间的高速数据传输。SPI协议由主设备(Master)和从设备(Slave)组成,主设备发起通信并控制时序,而从设备根据主设备的指令进行响应。

SPI使用4根信号线进行通信:

  • MOSI (Master Out Slave In):主设备输出,数据从主设备流向从设备。
  • MISO (Master In Slave Out):主设备输入,数据从从设备流向主设备。
  • SCK (Serial Clock):串行时钟,由主设备提供,用于同步数据传输。
  • SS (Slave Select):从设备选择信号,主设备通过拉低此信号来选择与其通信的从设备。

SPI协议基于全双工通信,即数据在传输时可以同时进行发送和接收。SPI数据传输的关键是时钟同步,数据在时钟的每个上升沿或下降沿时进行采样。协议的基本通信流程如下:

  • 初始化
    • 主设备选择一个从设备,拉低对应的SS信号线。
    • 主设备配置SPI的时钟极性(CPOL)和时钟相位(CPHA),确保双方时钟同步。
  • 数据传输
    • 主设备在时钟的上升沿或下降沿发送数据,同时从设备在相同的时钟边缘读取数据。
    • 主设备发送数据后,等待从设备通过MISO线发送数据回到主设备。
  • 数据传输顺序
    • 在SPI协议中,数据从MOSI线发送到从设备,同时从设备通过MISO线返回数据给主设备。传输顺序和方向在每个时钟周期内互相交替。

SPI的时序是协议的核心,控制着数据如何在主设备与从设备之间传递。以下是SPI的典型时序示例:

  1. CPOL = 0,CPHA = 0(时钟极性低,时钟相位为0)

    • 在时钟线的上升沿时,数据位从主设备的MOSI线传输到从设备。
    • 在时钟线的下降沿时,从设备的MISO线发送数据。
  2. CPOL = 0,CPHA = 1(时钟极性低,时钟相位为1)

    • 在时钟线的下降沿时,主设备发送数据。
    • 在时钟线的上升沿时,从设备的MISO线发送数据。
  3. CPOL = 1,CPHA = 0(时钟极性高,时钟相位为0)

    • 时钟信号在数据传输时有反向变化。
  4. CPOL = 1,CPHA = 1(时钟极性高,时钟相位为1)

    • 这种模式通常用于在某些特殊硬件上进行高速数据通信。

时钟极性和相位的选择直接影响数据采样时刻和数据稳定的时序。具体选择哪个时钟模式依赖于具体的应用和从设备的要求。

假设现在主控芯片要传输一个0x56数据给SPI Flash,时序如上:首先CS0先拉低选中SPI Flash,0x56的二进制就是0b0101 0110,因此在每个SCK时钟周期,DO输出对应的电平。 SPI Flash会在每个时钟周期的上升沿读取D0上的电平。

其次再具体说明一下在SPI协议中,有两个值来确定SPI的模式。 CPOL:表示SPICLK的初始电平,0为电平,1为高电平 CPHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿。

我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。 极性选什么?格式选什么?通常去参考外接的模块的芯片手册。比如对于OLED,查看它的芯片手册时序部分:

SCLK的初始电平我们并不需要关心,只要保证在上升沿采样数据就行。

在Linux中,SPI协议的实现涉及多个层次,包括驱动程序、硬件控制和协议管理。Linux内核提供了一个标准的SPI子系统,简化了设备驱动的开发,并且允许用户空间通过/dev/spidev接口与SPI设备进行通信。

SPI驱动通常包括以下几个部分:

  • SPI设备描述符:定义设备的相关信息,如SPI总线速率、工作模式、设备ID等。
  • SPI设备操作函数:包括发送和接收数据的函数,如spi_transfer()
  • SPI总线配置:配置SPI总线参数,如时钟频率、极性、相位、数据位宽等。

Linux SPI驱动工作流程

  • SPI总线初始化:SPI总线驱动首先初始化SPI总线,注册SPI总线控制器。
  • SPI设备注册:通过SPI设备结构体spi_device注册到SPI总线,驱动程序会在设备初始化时设置设备的配置参数。
  • 数据传输:通过调用spi_sync()或者spi_async()来同步或异步地进行SPI数据传输。
  • 传输过程
    • SPI数据传输通过spi_message结构体完成,包含了多个SPI传输操作。
    • 数据通过spi_transfer结构体传输,每个传输项包含发送和接收数据的缓冲区以及其他控制参数。

spidev是一个Linux设备驱动,允许用户空间程序通过标准文件I/O接口(如read/write)与SPI总线设备进行交互。通过spidev,用户可以控制SPI设备,而不需要编写复杂的内核驱动。应用程序通过打开/dev/spidevX.Y文件来访问SPI设备,使用标准的ioctl命令来配置SPI设备。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>

int main() {
    int fd = open("/dev/spidev0.0", O_RDWR);
    if (fd < 0) {
        perror("Unable to open SPI device");
        return -1;
    }

    uint8_t mode = SPI_MODE_0;
    uint32_t speed = 500000;
    uint8_t bits = 8;

    // Set SPI mode
    if (ioctl(fd, SPI_IOC_WR_MODE, &mode) == -1) {
        perror("Unable to set SPI mode");
        close(fd);
        return -1;
    }

    // Set SPI speed
    if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) {
        perror("Unable to set SPI speed");
        close(fd);
        return -1;
    }

    // Set bits per word
    if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits) == -1) {
        perror("Unable to set bits per word");
        close(fd);
        return -1;
    }

    uint8_t tx_buffer[2] = {0x01, 0x02};
    uint8_t rx_buffer[2] = {0};

    struct spi_ioc_transfer transfer = {
        .tx_buf = (unsigned long)tx_buffer,
        .rx_buf = (unsigned long)rx_buffer,
        .len = sizeof(tx_buffer),
        .speed_hz = speed,
        .bits_per_word = bits
    };

    // Perform SPI transfer
    if (ioctl(fd, SPI_IOC_MESSAGE(1), &transfer) < 0) {
        perror("SPI transfer failed");
        close(fd);
        return -1;
    }

    printf("Received data: 0x%02x 0x%02x\n", rx_buffer[0], rx_buffer[1]);
    close(fd);
    return 0;
}

标签:总线,通信协议,SPI,fd,Linux,数据传输,设备,时钟
From: https://blog.csdn.net/weixin_64593595/article/details/145117668

相关文章

  • 【Linux】Linux常见指令(下)
    个人主页~Linux常见命令(上)~初识Linux一、Linux基本命令11、cat命令12、more指令13、less指令14、head指令15、tail指令16、时间相关的指令(1)date指令(2)cal指令17、find指令18、grep指令19、压缩相关指令(1)zip、unzip指令(2)tar指令20、bc指令一、Linux基本命令i=1......
  • linux常用命令(2)[常用快捷键, clear, date, ping, ps, kill, man, help, info ]
    常用快捷键清空命令行界面  clear示例显示时间 datedate和date-R命令的区别如下"CST"表示"ChinaStandardTime",即中国标准时间中国标准时间是协调世界时(UTC)的东八区时间,也就是UTC+8:00网络测试命令  ping用于测试主机之间网络的连通性上面的截图......
  • windows消息循环和linux消息循环的异同
     一、消息循环的基本概念消息循环(MessageLoop)是一种编程结构,用于等待和分派消息。在不同的系统或机制下,消息循环有不同的称呼,如事件循环(EventLoop)或运行循环(RunLoop)。它是经典的消息驱动机制的基础‌。 二、相同点事件驱动机制的核心地位在Linux和Windows中......
  • Linux电源管理——Suspend-to-Idle(s2idle) 流程
    目录一、常见的Suspend方式1、Suspend-to-idle2、Standby 3、Suspend-to-RAM4、Hibernation 二、代码分析1、state_store2、suspend_enter3、s2idle_loop4、idleloop5、psci_enter_idle_state6、cpu_suspend7、开始resume流程8、开启IRQ中断9、pm_syst......
  • linux命令--按照场景分类
    需求测试kcreatensdrliu;kdelete-fconfig/crd/bases/;kaconfig/crd/bases/;kasample/operatorTest/;kdelete-fsample/operatorTest/;dos2unixsample/cleancr.sh;shsample/cleancr.shdrliu;goruncmd/cluster-controller/main.go--namespace="dr......
  • centos(linux): 安装php8.4.1的报错
    一,配置时报错:1,报错configure:error:Packagerequirements(xpm)werenotmet:Package'xpm',requiredby'virtual:world',notfound解决:[root@blog~]#dnfinstalllibXpm-devel2,报错:checkingforicu-uc>=50.1icu-ioicu-i18n...noconf......
  • Linux下ext2文件系统
    文章目录一:penguin:基本概述二:star:ext2文件系统:star:​1.:star:​BootBlock(引导块)位置与作用三BlockGroup(块组):star:​1.:star:​SuperBlock(超级块):star:​2.:star:​GroupDescriptor(块组描述符):star:​3.:star:BlockBitmap(​块位图):star:​4.......
  • 深入理解Linux环境配置文件:.bashrc、.bash_profile和.profile
    转自:https://blog.csdn.net/weixin_39973810/article/details/137281970在Linux世界中,理解各种shell配置文件如.bashrc、.bash_profile和.profile的作用和区别对于有效地管理和定制你的命令行环境至关重要。许多用户经常对这些文件的功能和使用场景感到困惑。本文旨在详细解释这......
  • day14-Linux系统基础权限知识精讲
    1.给文件加特殊属性1.1chattra:只能追加内容,不能删除i:不能修改,不能删除;保护关键文件,防止非法写入[root@oldboy~]#chattr+atest.txt[root@oldboy~]#chattr+itest.txt[root@oldboy~]#echo123>>test.txt-bash:test.txt:权限不够[root@oldboy~]......
  • 鸟哥的Linux私房菜 基础学习篇 第四版PDF、EPUB免费下载
    适读人群:Linux初学者适合Linux管理员作为参考手册Linux入门书升级版,适用Linux系统应用和开发及运维的人员,涵盖linux内核,命令行,嵌入式,基于CentOS,7.x电子版仅供预览,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息作者:鸟哥出版社:人民邮电出版社出品方:异步图......