1-Wire SDQ介面,是一個只靠一條信號與GND就可以進行溝通的通訊介面。常
用電池、電源辨識、資料加密等,資料量小、低速傳輸的應用。在下面我就用
TI BQ2022A的dasheet裡,CPU(HOST)I如何來讀取BQ2022A內部的資料來做例
子,從硬體到協議溝通層面來解釋。
1.硬體層面
在硬體方面,BQ2022A做為Slave,接收CPU/MCU的命令,兩邊的SDQ與GND相接,而因為兩邊都是Open drain的方式在控制SDQ信號,需要在SDQ信號線上
,加入上拉電阻到VPU電源,VPU電源為2.65~5.5V。
下圖是BQ2022Q功能方塊。裡面包括SDQ通訊控制器與8 bit CRC產生,右邊
則是3種ROM,分別存放ID、資料、狀態。當CPU透過SDQ信號線要來讀取
BQ2022A裡面的ROM,需要透過SDQ通訊命令,並且會加上CRC數據,讓
CPU確認它收到的資料是否有錯。
2.協議溝通Protocol層面
SDQ通訊命令如下,分成Level I與Level II,Level I為分為Read serializationROM (33h)與Skip Serialization ROM(CCh),差別在於要從ID ROM開始讀/寫
或是Skip跳到Memory ROM來讀寫。ID ROM是8 bit family code + 48 bit
identification number + 8 bit CRC。
Level II的命令用來讀寫Memory 與Status ROM的資料,Read Memory/Field
CRC(F0h)與Read Memory/Page CRC的差別在於前者是CPU讀到Memory
1024bit 的結尾,BQ2022A才送出CRC資料,後者是將1024bit分成4個Page
,各別256bit,每讀到一個Page結尾,BQ2022A就送出CRC資料。
執行Read serialization ROM (33h)後,可以讀到7+1 byte的ID ROM,再進到
LevelII,來操作Memory ROM
執行Skip ROM (CCh)後,就會跳過ID ROM,直接進到LevelII,來操作
Memory ROM
下圖是一個Read Memory/Field CRC的命令序列,第一步是進行Level I的
命令,第二步CPU發送Read Memory Command(F0h),第三、四步是
Address命令,來決定要從1024bit裡的那個位置開始讀取。例如要從
Address 0006h來讀,那就要先傳送Low byte 06h,再傳High byte 00h。
CPU再發送出Command與Address後,下一步就要從BQ2022A去讀到
CRC值,這個CRC值是BQ2022A計算它接收到的Command與Address,
也就是F0h,06h,00h後產生的。CPU自已也會去計算Command(F0h)與
Address(0006h)的CRC值,去跟從BQ2022A讀到的CRC值來比較,如果
一樣,表示BQ2022A有正確接收到CPU所送出的命令,如果不一樣,表
示BQ2022A接收有錯誤,就要重新Reset再送一次命令。

在第5個步驟Read and Verify CRC通過後,CPU就開始去讀Memory的
資料,BQ2022A傳送資料的起始位址,就是從Address命令決定。一
直到CPU讀到1024bit的結尾,BQ2022A會再送出一個CRC,也就是
前面所傳送Memory資料的CRC值,CPU也會計算它從BQ2022A讀到
的Memroy資料的CRC值,兩個值去比對,就可以確保CPU讀到的資
料是正確的,避免在傳送資料的過程中,SDQ訊號受到干擾,導致
CPU判讀某個bit出錯。
3.物理層Physical層面
Reset timing
當CPU要開始對BQ2022A進行控制前,需要在SDQ信號線上,CPU
當CPU要開始對BQ2022A進行控制前,需要在SDQ信號線上,CPU
與BQ2022進行確認的動作,CPU將SDQ拉low至少480us,這就是
Reset timing。而BQ2022A接收到Reset後,也要拉low在60~240us
,這就是Presence Pulse命令。CPU接收到Presence Pluse後,才
會進行後面讀寫ROM的動作。
會進行後面讀寫ROM的動作。
Write bit
當CPU在對BQ2022A發送命令時,就是寫入的動作,而每一個bit就
當CPU在對BQ2022A發送命令時,就是寫入的動作,而每一個bit就
如下圖,CPU先拉low,持續tWSTRB的時間,這個時間可以是1~15us。
再來CPU就要去拉high或low直到tWDH的時間到達。tWDH的時間至少
要60us,最大就是一個bit cycle時間,bit cycle就是一個bit的周期,從
CPU拉low到下一次CPU拉low的時間間隔。當CPU在進行Write bit,
BQ2022A就要在CPU拉low後15us~60us去辨別CPU是Write"1" 或Write
"0"。在tWDT後,會有一段High的時間trec,至少要1us。這樣BQ2022A
才能去偵測SDQ信號,判斷下一個bit cycle開始,
CPU拉low到下一次CPU拉low的時間間隔。當CPU在進行Write bit,
BQ2022A就要在CPU拉low後15us~60us去辨別CPU是Write"1" 或Write
"0"。在tWDT後,會有一段High的時間trec,至少要1us。這樣BQ2022A
才能去偵測SDQ信號,判斷下一個bit cycle開始,
Read bit
當CPU在對BQ2022A讀取資料時,每一個bit就如下圖,CPU先拉low
,持續tRSTRB的時間,這個時間可以是1~13us,然後CPU會放開控制,
由BQ2022A來決定該bit是"0"還是"1"。直到tODHO時間到,BQ2022A
放開控制。Read bit的bit cycle與Write bit一樣,由CPU決定。在CPU
拉low,到它下一次拉low的時間。

下圖為時序表。
市面上也有邏輯分析器可以直接將SDQ信號解碼,如前面說的,一個
完成的SDQ,一開始會有RESET->PRESENCE->Level I 的Skip
Serialization ROM (0xCC) ->Level II的Read Memory/Page CRC->
Address Low byte->Address High byte->第一次CRC確認->Start Read
Memory ROM->End Page CRC ->Read Memory ROM of Next Page->
End Page CRC->Read Memory ROM of Final Page->End Page CRC。
Reference
1.TI BQ2022A datasheet
http://www.ti.com/lit/ds/symlink/bq2022a.pdf
2.CRC計算網站
https://www.lammertbies.nl/comm/info/crc-calculation.html
3.孕龍邏輯分析儀
http://www.zeroplus.com.tw/logic-analyzer_tw/products.php?pdn=7&product_id=254
沒有留言:
張貼留言