Linux SPI驱动怎么写?spi_driver和probe怎么填?用户态怎么访问?嵌入式Linux面试

浏览量:5
时间: 2026-09-23 16:24:00
一句话答案

SPI 驱动框架和 I2C 类似:spi_driver 结构填 probe/remove,设备树 compatible 匹配;probe 里用 spi_write/spi_read/spi_sync 传输;用户态通过 /dev/spidevX.Y 访问,也可以封装成字符设备或 MTD(SPI Flash)。

本文概述

SPI 是 Linux 常用外设驱动,面试常考:spi_driver、spi_transfer、设备树、spidev。回答要给代码骨架和传输方式。

核心要点

  • SPI 驱动用 spi_driver,和 i2c_driver 框架类似

  • 设备树里 compatible 匹配,reg 是片选号,spi-max-frequency 设速率

  • 传输用 spi_sync(同步)或 spi_async(异步),spi_transfer 结构描述

  • 用户态:/dev/spidevX.Y + ioctl,或封装成 MTD(Flash)/字符设备

  • SPI 是 4 线:CLK、MOSI、MISO、CS,全双工

终端显示 Linux SPI 驱动代码,spi_driver 结构和设备树,开发板连 Flash

面试官:写一个 SPI Flash 驱动,框架是什么?怎么读写?

面试官考察点

驱动开发基础题。面试官看你是否写过 SPI 驱动。重点听:spi_driver、spi_transfer、probe。

回答思路

给最小骨架,讲 probe 里做什么,传输函数。

参考回答

驱动骨架。

#include <linux/spi/spi.h>

static int flash_probe(struct spi_device *spi){
  /* 读 Flash ID 验证 */
  u8 tx[4] = {0x9F, 0, 0, 0};
  u8 rx[4];
  spi_write_then_read(spi, tx, 1, rx, 3);
  /* 注册 MTD 设备 */
  return 0;
}

static struct spi_driver flash_driver = {
  .probe = flash_probe,
  .remove = flash_remove,
  .driver = {
    .name = "spi_flash",
    .of_match_table = flash_of_match,
  },
};
module_spi_driver(flash_driver);

SPI 传输函数。

函数作用
spi_write(spi, buf, len)写 len 字节
spi_read(spi, buf, len)读 len 字节
spi_write_then_read(spi, tx, n_tx, rx, n_rx)先写命令再读数据
spi_sync(spi, &msg)自定义传输(多个 transfer)
spi_async(spi, &msg, cb)异步传输,完成回调

spi_transfer 自定义传输。

struct spi_transfer t1 = { .tx_buf = cmd, .len = 4 };
struct spi_transfer t2 = { .rx_buf = data, .len = 256 };
struct spi_message msg;
spi_message_init(&msg);
spi_message_add_tail(&t1, &msg);
spi_message_add_tail(&t2, &msg);
spi_sync(spi, &msg);

设备树。

&spi1 {
  flash@0 {
    compatible = "jedec,spi-nor";
    reg = <0>; /* CS0 */
    spi-max-frequency = <50000000>;
  };
};

用户态访问。

  • spidev:通用 SPI 字符设备 /dev/spidevX.Y,ioctl 读写,适合调试;

  • MTD:SPI Flash 用 MTD 子系统,/dev/mtdblockX,可挂载 JFFS2/UBIFS;

  • 自定义字符设备:封装成专用接口(如传感器驱动)。

注意。

  • SPI 速率不要超过器件最大值(看 datasheet);

  • SPI 模式(CPOL/CPHA)要和从设备匹配,设备树里 spi-cpol/spi-cpha;

  • 多设备共享总线时 CS 要分别控制;

  • SPI 传输可能睡眠,不能在中断上下文调用。

面试官可能追问

追问 1:SPI 和 I2C 驱动框架区别?
框架类似(spi_driver vs i2c_driver),但 SPI 传输更灵活(全双工、自定义 transfer),I2C 是半双工。
追问 2:spi_write_then_read 为什么常用?
SPI Flash 都是先发命令(读 ID/读数据)再发 dummy 再读数据,这个函数封装了常见操作。
追问 3:SPI 模式 0/1/2/3 是什么?
CPOL(时钟极性)和 CPHA(时钟相位)组合。模式 0:CPOL=0,CPHA=0,最常用。
追问 4:spidev 和自定义驱动哪个好?
spidev 适合调试和简单应用,产品级用自定义驱动(有错误处理、并发控制)。
追问 5:SPI 速率怎么设?
设备树 spi-max-frequency,驱动里 spi->max_speed_hz。实际速率不超过这个值和控制器上限。

常见失分表达

✗ SPI 模式不匹配 — 数据读写错误。
✗ 在中断里调用 SPI 传输 — SPI 传输会睡眠,中断上下文不能用。
✗ 速率超过器件上限 — 数据错误或器件不响应。

准备动作

1
写一个 SPI Flash 读 ID 驱动
2
用 spidev 测试过 SPI 设备
3
准备一个 SPI 通信失败最终定位是模式不对的案例

核心关键词

SPI驱动spi_driverspi_transferspi_syncspidevMTD


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
单片机进入低功耗后无法唤醒,嵌入式面试应该怎样排查?

题库分类:嵌入式单片机适合经验:0—5年难度:中高级题型:低功耗场景题 + 系统排查题面试题单片机进入低功耗模式后偶发无法唤醒,或者能唤醒但串口、定时器不再工作... 详情>>

2026-07-31 16:00:42
PCB走线阻抗不连续有哪些常见原因和整改方法

分类:PCB设计经验级别:1-3年难度:中级题型:原理+整改PCB工程师通过TDR测试波形分析走线阻抗不连续位置本文概述PCB走线阻抗不连续是高速电路设计中的常... 详情>>

2026-08-11 16:55:31
FPGA中BRAM与分布式RAM怎么选与用?FPGA面试存储资源

FPGA设计中级技术基础题本文概述FPGA的存储资源(块RAM BRAM与分布式RAM)是数字设计的基础,面试中需要讲清BRAM与分布式RAM的物理结构区别、容... 详情>>

2026-09-02 09:16:33
面试最后反问环节怎么提问才加分

面试最后反问环节怎么提问才加分电子工程师面试技巧 · 技术岗3类优质问题模板与禁忌清单分类:其他类面试 经验级别:不限 难度:基础 题型:面试技巧面试最后反问环... 详情>>

2026-08-11 17:50:12
USB接口ESD保护电路怎么设计

分类:硬件设计经验级别:初级难度:★★☆☆☆题型:电路设计+器件选型USB接口ESD保护是硬件接口设计中的基础必备技能本文概述USB接口ESD保护的核心是在静电... 详情>>

2026-08-12 09:56:38
开班信息