SPI通信協(xié)議深度解析:信號引腳、CLK行為與測量指南
一、SPI信號引腳詳解
SPI(Serial Peripheral Interface)是一種全雙工同步串行通信協(xié)議,廣泛應(yīng)用于嵌入式系統(tǒng)。其核心信號引腳包括:

1.1 核心信號線
信號名稱
方向
全稱
功能
| SCLK | 主→從 | Serial Clock | 時(shí)鐘信號,由主設(shè)備產(chǎn)生 |
| MOSI | 主→從 | Master Out Slave In | 主設(shè)備輸出數(shù)據(jù) |
| MISO | 從→主 | Master In Slave Out | 從設(shè)備輸出數(shù)據(jù) |
| CS/SS | 主→從 | Chip Select/Slave Select | 片選信號,使能從設(shè)備 |
1.2 可選信號
信號名稱
用途
說明
| INT | 從→主 | 中斷請求 |
| RESET | 主→從 | 復(fù)位信號 |
二、CLK信號行為特性分析
2.1 CLK的產(chǎn)生機(jī)制
在SPI通信中,SCLK信號完全由主設(shè)備控制。根據(jù)Linux內(nèi)核SPI子系統(tǒng)的實(shí)現(xiàn)(如drivers/spi/spi.c):
// 內(nèi)核SPI傳輸核心函數(shù)
static int spi_transfer_one_message(struct spi_controller *ctlr,
struct spi_message *msg)
{
// 1. 激活片選
cs_assert(ctlr, msg->spi);
// 2. 生成時(shí)鐘信號
ctlr->prepare_transfer_hardware(ctlr);
// 3. 執(zhí)行數(shù)據(jù)傳輸
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
// 產(chǎn)生CLK脈沖
ctlr->transfer_one(ctlr, msg->spi, xfer);
}
// 4. 停止時(shí)鐘
ctlr->unprepare_transfer_hardware(ctlr);
// 5. 釋放片選
cs_deassert(ctlr, msg->spi);
}
2.2 CLK波形特征
CLK信號的行為受以下因素影響:
時(shí)鐘極性(CPOL):
CPOL=0:空閑時(shí)低電平
CPOL=1:空閑時(shí)高電平
時(shí)鐘相位(CPHA):
CPHA=0:數(shù)據(jù)在第一個(gè)時(shí)鐘邊沿采樣
CPHA=1:數(shù)據(jù)在第二個(gè)時(shí)鐘邊沿采樣
graph LR
A[CPOL/CPHA組合] --> B[模式0:CPOL=0, CPHA=0]
A --> C[模式1:CPOL=0, CPHA=1]
A --> D[模式2:CPOL=1, CPHA=0]
A --> E[模式3:CPOL=1, CPHA=1]
2.3 CLK激活時(shí)機(jī)
根據(jù)用戶提供的代碼分析(SES_PORT_SPIDEV_interface.c):
// SPI傳輸觸發(fā)點(diǎn)
if (ioctl(spiLinkDescription_g[intfHandle].spiDev,
SPI_IOC_MESSAGE(1),
&message) >= 0)
{
// 傳輸成功
}
關(guān)鍵結(jié)論:
CLK只在ioctl()執(zhí)行期間產(chǎn)生
數(shù)據(jù)傳輸完成后,CLK立即停止
即使是從設(shè)備數(shù)據(jù)讀取,也需要主設(shè)備發(fā)起傳輸并提供CLK
三、SPI信號測量指南
3.1 測量設(shè)備要求
| 設(shè)備 | 推薦型號 | 關(guān)鍵參數(shù) |
|---|---|---|
| 示波器 | Rigol DS1054Z | 4通道,50MHz+ |
| 探頭 | PP215 | 10:1衰減比 |
| 邏輯分析儀 | Saleae Logic Pro 16 | 16通道,100MS/s |
3.2 測量連接方法

3.3 測量參數(shù)解讀
| 參數(shù) | 典型值 | 測量要點(diǎn) |
|---|---|---|
| CLK頻率 | 1-50MHz | 確認(rèn)是否達(dá)到標(biāo)稱值 |
| 建立時(shí)間 | >10ns | 數(shù)據(jù)在時(shí)鐘邊沿前的穩(wěn)定時(shí)間 |
| 保持時(shí)間 | >5ns | 數(shù)據(jù)在時(shí)鐘邊沿后的穩(wěn)定時(shí)間 |
| 上升/下降時(shí)間 | <10ns | 信號邊沿質(zhì)量 |
| 占空比 | 45-55% | 時(shí)鐘對稱性 |
四、常見問題排查
4.1 CLK無波形的情況分析

4.2 典型故障解決方案
CLK持續(xù)輸出:
檢查SPI控制器是否處于連續(xù)傳輸模式
驗(yàn)證片選信號是否保持激活狀態(tài)
CLK頻率不穩(wěn)定:
# 在Linux中檢查時(shí)鐘源
cat /sys/kernel/debug/clk/clk_summary | grep spi
數(shù)據(jù)與CLK不同步:
調(diào)整CPOL/CPHA設(shè)置
增加建立/保持時(shí)間裕量
五、SPI驅(qū)動(dòng)開發(fā)實(shí)踐
5.1 內(nèi)核SPI框架結(jié)構(gòu)
// SPI設(shè)備注冊
struct spi_board_info my_spi_dev = {
.modalias = "my_device",
.max_speed_hz = 10000000,
.bus_num = 0,
.chip_select = 1,
.mode = SPI_MODE_0,
};
spi_register_board_info(&my_spi_dev, 1);
// 驅(qū)動(dòng)實(shí)現(xiàn)
static struct spi_driver my_spi_driver = {
.driver = {
.name = "my_device",
},
.probe = my_probe,
.remove = my_remove,
};
module_spi_driver(my_spi_driver);
5.2 用戶空間spidev使用
// 配置SPI模式
ioctl(fd, SPI_IOC_WR_MODE, &mode);
// 設(shè)置位順序
ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsb);
// 執(zhí)行傳輸
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = len,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
六、高級測量技巧
6.1 使用邏輯分析儀解碼

6.2 信號完整性優(yōu)化
阻抗匹配:
串聯(lián)匹配電阻:22-100Ω
終端匹配:在接收端并聯(lián)100Ω電阻
PCB布線規(guī)則:
SCLK與MOSI/MISO等長布線
避免平行走線超過信號波長1/20
參考地平面完整
噪聲抑制:
// 軟件濾波
for (int i = 0; i < 3; i++) {
if (abs(value - last) < threshold) break;
}
七、SPI協(xié)議變體
7.1 多從設(shè)備連接方式

7.2 半雙工模式
// 配置為3線模式
ioctl(fd, SPI_IOC_WR_MODE, SPI_3WIRE);
// 方向切換
gpio_set_value(direction_pin, TX_MODE);
spi_write(...);
gpio_set_value(direction_pin, RX_MODE);
spi_read(...);
八、總結(jié)與最佳實(shí)踐
8.1 SPI使用黃金法則
CLK由主控產(chǎn)生:從設(shè)備永遠(yuǎn)不能主動(dòng)產(chǎn)生時(shí)鐘
通信必須成對:每次傳輸都需要主設(shè)備發(fā)起
空閑狀態(tài)保持:傳輸結(jié)束后CLK保持CPOL定義的電平
片選管理嚴(yán)格:CS信號必須在傳輸前有效,傳輸后無效
8.2 調(diào)試檢查清單
CLK信號是否在預(yù)期時(shí)間出現(xiàn)
CPOL/CPHA設(shè)置是否匹配從設(shè)備要求
片選信號是否在傳輸間隙正確釋放
信號電壓是否符合器件要求
建立/保持時(shí)間是否滿足時(shí)序要求
完整測量案例:GitHub-SPI-Signal-Analysis
包含示波器截圖、邏輯分析儀配置和參考驅(qū)動(dòng)代碼
最后建議:當(dāng)SPI通信出現(xiàn)問題時(shí),首先測量CLK信號行為。通過確認(rèn)CLK是否在預(yù)期時(shí)間出現(xiàn)、頻率是否正確、占空比是否合規(guī),可以快速定位80%以上的通信故障。掌握SPI信號測量技能,是嵌入式開發(fā)工程師的核心競爭力之一。
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
1097瀏覽量
42374 -
信號
+關(guān)注
關(guān)注
12文章
2937瀏覽量
80429 -
SPI
+關(guān)注
關(guān)注
17文章
1900瀏覽量
102212
原文標(biāo)題:SPI通信協(xié)議深度解析:信號引腳、CLK行為與測量指南
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
常用的串口通信協(xié)議之SPI協(xié)議簡析
SPI通信協(xié)議
SPI通信協(xié)議的基礎(chǔ)知識解析
SPI是什么?SPI通信協(xié)議說明
通信協(xié)議:SPI
通信協(xié)議(SPI)
Arduino UNO上的SPI通信協(xié)議
通信協(xié)議IIC與SPI之間有何區(qū)別?
SPI通信協(xié)議原理是什么
SPI通信協(xié)議深度解析
評論