Linux系统上快速上手SPI开发————新手入门指南

Linux SPI开发新手整理的详细入门指南,涵盖从环境搭建到实际操作的完整流程:

一、环境准备

  1. 确认硬件支持
    运行 ls /dev/spidev* 检查是否存在SPI设备节点(如 /dev/spidev0.0),若无输出说明驱动未加载,需在内核配置中启用SPI支持:

    bash

    # 安装内核头文件(以Debian为例)
    sudo apt-get install linux-headers-$(uname -r)
    # 检查SPI内核配置
    grep CONFIG_SPI= /boot/config-$(uname -r)
  2. 安装工具包
    安装 spi-tools 用于命令行操作:

    bash

    sudo apt-get install spi-tools
  3. 设备树配置(嵌入式场景)​
    嵌入式开发需在设备树(.dts)中添加SPI控制器和从设备节点,例如:

    dts

    &spi0 {
        status = "okay";
        spidev@0 {
            compatible = "spidev";
            reg = <0>;
            spi-max-frequency = <10000000>;
        };
    };

    编译后通过 sudo dtc -I dts -O dtb -o /boot/overlays/spi0.dtbo spi0.dts 加载。


二、SPI基础配置参数

  1. 工作模式
    通过4种组合设置(CPOL和CPHA):

    • 模式0:CLK空闲低电平,数据在上升沿采样(最常用)
    • 模式3:CLK空闲高电平,数据在下降沿采样
  2. 关键参数设置
    使用 ioctl 系统调用配置:

    c

    int fd = open("/dev/spidev0.0", O_RDWR);
    uint8_t mode = SPI_MODE_0;
    uint8_t bits = 8;       // 数据位宽(8位)
    uint32_t speed = 500000; // 速率500KHz
    ioctl(fd, SPI_IOC_WR_MODE, &mode);
    ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

三、命令行快速测试

  1. 查看可用设备

    bash

    spidev_test -L
  2. 全双工数据传输
    发送十六进制数据并接收响应:

    bash

    spidev_test -D /dev/spidev0.0 -s 1000000 -v -p "\x01\x02\x03"
    • -s:设置速率(1MHz)
    • -p:发送的十六进制数据
    • -v:显示详细传输信息

四、C语言应用程序开发

c

#include 
#include 
#include 
#include 

int main() {
    int fd = open("/dev/spidev0.0", O_RDWR);
    uint8_t tx[] = {0xAA, 0x55}; // 发送数据
    uint8_t rx[2] = {0};

    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = (unsigned long)rx,
        .len = 2,
        .delay_usecs = 10,
        .speed_hz = 1000000,
        .bits_per_word = 8,
    };

    ioctl(fd, SPI_IOC_MESSAGE(1), &tr); // 发起传输
    printf("Received: 0x%02X 0x%02X\n", rx[0], rx[1]);
    close(fd);
    return 0;
}

编译运行

bash

gcc spi_test.c -o spi_test
sudo ./spi_test

五、调试技巧

  1. 查看内核日志

    bash

    dmesg | grep spi
  2. 信号量检查
    使用示波器或逻辑分析仪确认CLK、MOSI/MISO信号是否正常。

  3. 速率匹配问题
    若通信失败,逐步降低速率(如从1MHz降至100KHz)排查硬件兼容性。


六、扩展应用场景

  1. 连接传感器
    如读取BME280温湿度传感器的SPI协议数据帧。

  2. 驱动显示屏
    通过SPI发送ILI9341等LCD控制命令和像素数据。

  3. 自定义协议
    实现类似Modbus的SPI主从设备通信机制。

你可能感兴趣的:(Linux开发,linux,驱动开发,iot,嵌入式硬件,物联网)