我覺得生為一個韌體工程師,不能不會看Datasheet。但是好像也沒辦法教大家看Aspeed的Datasheet,只好就是跟大家一起看一下樹莓派的Datasheet,也順便就會提到BMC的部分了,大同小異啦!
Raspberry Pi 4 Model B 所搭載的 BCM2711 SoC,對多數使用者而言,是一個相容於Linux 且擁有高度完整性的高階 library 的系統(不論是你想要用C或者Python都已經有相關的Library)。大多數剛開始接觸韌體的朋友會對於讀datasheet這件事情有點陌生,到底要讀哪裡?什麼是重要的?
當然現在是有ChatGPT的年代,要快速閱讀大量的內容也不是什麼問題。但如果你能有邏輯的知道自己需要的是什麼?就能在開發的過程中找到更多的樂趣,不會感到太迷惘。從Raspberry Pi 官網上面:
https://www.raspberrypi.com/documentation/
就可以找到你手上的型號相關的datasheet。Data sheet就像是這個產品的使用說明,是認識他的方法之一。有些產品的Datasheet寫得特別清楚有邏輯,我們在開發的時候就會很順利,按著指定的方法來執行就可以。反之,也有一些看了跟沒有看一樣的Data sheet 這時候可能就要跟廠商多溝通了!
我自己是買Pi 4 Model B,他的硬體線路圖在:
https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-reduced-schematics.pdf
然後SoC的Data sheet在:
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf
一般我們在開發BMC的時候,第一部也是先了解產品使用的BMC Chip他的線路圖是怎麼跟周邊Device相連?以及他的Data sheet有沒有詳細介紹每根IO訊號要怎麼設定?怎麼使用?
這份Data Sheet 描述的是 ARM-accessible peripherals。也就是說,這份文件關心的不是整顆 SoC 的所有內部結構,而是:ARM core 可以透過 memory-mapped I/O 存取的模組還有這些模組對系統軟體(Linux / bare-metal)所呈現的行為。我們最主要要看的就是關於 GPIO controller、BSC(I²C)、SPI、UART、PWM、Interrupt controller、DMA 的描述。
所有 peripheral 都是透過記憶體映射被 ARM 存取的。
在文件中反覆出現。每一個模組章節,都遵循類似的結構:
- 模組概述
- Register map
- Register 功能描述
- 行為與限制說明
從系統開發的角度來看,所有高階 API 的最終行為,都可以回溯到某一次記憶體讀寫。
GPIO Controller:所有外部互動的匯流點
GPIO 並不是一組「獨立的輸入輸出腳位」,而是一個高度整合的控制器,負責在多個硬體模組之間進行腳位分派。每一根 GPIO 腳位,都連接到一個 multiplexer。這個 multiplexer 可以將該腳位連接到:
- 一般 GPIO input/output
- SPI controller
- BSC(I²C)
- UART
- PWM
- 其他 peripheral function

GPIO 腳位的「功能」是軟體設定的結果。當程式碼設定 GPIO function select register 時,實際發生的事情,是 multiplexer 路徑的切換。同一根實體腳位,在硬體上只能連接到一個 peripheral 的輸入或輸出端。當該腳位被設定為 SPI MOSI,它就物理上不再連接到 GPIO output buffer。
如果是Aspeed的BMC Chip,又會是更多的Pin角需要確認,通常我們在系統bring up的階段,最需要確認的就是每根Pin腳的設定都正確,該選的功能有選擇正確,該是GPIO的話,要確認在系統開機的時候Default要是High/Low的狀態,免得異常output可能會導致系統不預期行為。
BSC(I2C)
BCM2711 的 I2C 是由 Broadcom Serial Controller(BSC)實作。datasheet 明確指出,BSC 符合 I2C 規範,但它仍然是一個 Broadcom 設計的控制器。一般來說你看BMC的Datasheet會很明確的寫I2C。符合I2C規範表示:
- START / STOP condition 的定義符合 I2C 規範
- SDA / SCL 的基本電氣與時序行為遵循 I2C 協定
- 裝置位址、ACK/NACK 機制符合標準
使用 BSC 時,START/STOP 並不是由 library 自行產生的 waveform。當 transaction 行為異常時,問題往往不在「訊號有沒有被送出」,而在於 controller 為什麼沒有進入下一個狀態。在 BSC 的設計中,錯誤條件是由 status register 與 interrupt flag 表示的。然而,這些錯誤並不一定會被完整向上傳遞。在 Linux 系統中:
- kernel driver 會嘗試將 BSC 的錯誤狀態轉換為標準 error code
- library 再將這些 error 包裝成例外或回傳值
但並非所有錯誤都能被精確分類。特別是當 controller 停留在某個等待條件時,上層往往只能觀察到「沒有回應」。這也是為什麼 I2C 的 debug,常常需要回到 datasheet:
- 檢查 controller 是否仍然 enable
- 確認 FIFO 是否被清空
- 檢查 bus 是否被視為 busy
- 理解 STOP condition 是否真的被產生
一般我們在公司就會用I2C analyzer去分析看看transaction發生了什麼不預期的狀況? 或者不用外部tool,我們還沒有i2cdetect,它常被視為I2C 正常與否的快速檢查工具。在工廠生產的時候,幾乎每條bus我們都要掃過一遍,確認狀態正確之餘,也確認bus上的device都有回應。i2cdetect 的行為,本質上是:
- 對每個可能的 address 發起最小化 transaction
- 觀察 ACK/NACK
- 不進行實質資料交換
SPI(Serial Peripheral Interface)在 BCM2711 中的技術理解
在 BCM2711(樹莓派 4 所使用的 SoC)中,SPI 並非單純的「傳輸資料的線路」,而是一個基於同步時脈的高速序列通訊控制器。datasheet 對 SPI controller 的描述,重點集中在三個核心層面:
- 資料移動方式
- clock 與 phase 設定
- chip select 行為
這三者在實務中直接決定了 SPI 的可靠性與效能。
SPI(Serial Peripheral Interface)本身是一種由 Motorola 在 1980 年代初期開發的同步序列通訊協定,用於主設備與一個或多個從設備之間在較短距離內進行高速同步通訊。它是嵌入式系統中最常見的高速序列通訊協定之一。在 SPI 協定中:
- 主設備(Master)產生 時脈(SCLK),控制整個通訊節奏
- 使用四條主要信號線:
- SCLK(Serial Clock):由 Master 產生的時脈
- MOSI(Master Out Slave In):主設備送給從設備的資料
- MISO(Master In Slave Out):從設備回傳給主設備的資料
- CS / SS(Chip Select / Slave Select):用來選擇哪一個從設備被啟用進行通訊,這些線行程了一個同步、全雙工(full-duplex)的資料通道。
(以上SPI簡介引用自維基百科)
SPI 的設計哲學在於「盡量簡單,但速度快」。
- SPI 不包含位址或仲裁(arbitration)機制,它依靠 chip select 來選取從設備
- 沒有 ACK/NACK 這樣的協定回覆機制
- 所有控制都來自主設備提供的 clock 信號
在 SPI 協定中,資料傳輸是同步的——這意味著資料比特的發送與接收都必須依附於一條時脈線(SCLK)。SPI 可以執行 全雙工通訊,也就是說:在同一時脈週期內,主設備可以同時送出和接收資料。
在BMC中SPI通常用來做firmware update,更新不同的Firmware。也就是說他要負責把image傳到 target device。
PWM:時間解析度即是控制能力
PWM 並不是產生類比電壓,而是以固定頻率輸出高低電平,透過 duty cycle 改變平均值。datasheet 中對 clock source、range 與 mode 的描述,清楚界定了 PWM 能力的邊界。通常如果是BMC在server上就會用他來控制風扇或者馬達。在樹莓派上也看到不少人會利用PWM來控制燈泡的亮暗程度。關於下面這一點「PWM 的 ON/OFF 脈波與 LED 光學特性結合時,由於人眼的暫留效應,會感覺光亮是連續變化的。」我很好奇,也許下次可以來親自試試看差異。
結語:
閱讀 BCM2711 Peripherals datasheet,是當工程師能夠在需要時,精確地翻到正確的章節,理解其限制與設計取向,Raspberry Pi 就不再只是教育用板子,而是一個正式的工具,你想像在業界真正的開發一個產品,也一樣要對自己產品上用的IC都有一定程度的認知,然後就可以去駕馭它寫出你要的韌體功能。














