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

浏览量:212
时间: 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
浪涌测试不过怎么整改?EMC工程师面试浪涌防护设计与整改思路

分类:EMC电磁兼容经验级别:中级难度:中等题型:整改实战题本文概述浪涌测试是EMC认证中通过率较低的项目之一,也是硬件和EMC工程师面试的高频考点。本文从浪涌... 详情>>

2026-08-21 10:43:28
硬件设计面试:运放带容性负载为什么容易振荡?相位裕量、隔离电阻和阶跃响应怎么判断

很多模拟电路在仿真里输出很干净,接上长线、ADC输入电容或大电容后却出现振铃甚至自激。面试官问“运放为什么怕容性负载”,真正考察的是闭环稳定性:额外极点怎样吃掉... 详情>>

2026-10-20 14:03:16
项目改板返工了,你如何讲清原因、责任和改进?-电子工程师行为面试

FANYI / 行为面试题 / INTERVIEW 面试官问“说一次你做错的PCB或者硬件设计”,重点不在候选人是否永不犯错,而在于是否能说明真实故障、定位方法... 详情>>

2026-11-06 09:55:12
锂电池充电电路怎么设计?CC/CV充电与保护怎么做?电源工程师面试

电源设计中级技术基础题本文概述锂电池充电是消费电子和便携设备电源设计的常考题。面试官想听的不是“用充电芯片就行”,而是你懂不懂锂电池充电的基本流程(预充、恒流、... 详情>>

2026-09-05 09:51:45
EMC面试:屏蔽壳为什么一开缝就可能失效?缝隙天线、接缝和360°端接怎么答

“加一个金属罩就能屏蔽”是很典型的初级回答。真正的屏蔽效果取决于壳体导电连续性、开孔尺寸、接缝阻抗、线缆穿壳方式以及噪声频率。面试先抓这几个点:屏蔽不是只看材料... 详情>>

2026-10-16 20:11:01
开班信息