1. 硬件連接
SWIM接口只需要一根傳輸線,即可完成雙向的傳輸。傳輸過程,都是由主控制端(host)發起,設備端然后做出反應。host端需要在一個總線上實現讀和寫,那就是說必須要同時接一個輸出IO和一個輸入IO(也可以用同一個,開漏的情況下,IO可以同時讀寫),且輸出IO必須設計成開漏,總線上掛接上拉電阻,以便隨時交出控制權。硬件連接如下:
上圖SWIM_IN為輸入IO,SWIM為輸出IO。
2. 編碼格式
SWIM協議使用歸零碼,且支持兩種速率。
高速模式
低速模式
這兩種模式都是使用8M的clock同步(上圖中的箭頭)。高速模式下,2個低電平加8個高電平表示1;8個低電平加2個高電平表示0。低速模式下,2個低電平加20個高電平表示1;20個低電平加2個高電平表示0。
程序的第一步就是要實現這兩種速率的編碼輸出。通常情況下,使用IO口加延時即可達到目的。只不過,延時時間需要使用示波器觀測,然后多次調節才能比較准。另外,在翻轉IO的過程中,注意要關掉所有中斷,避免被打斷。
3. 通訊協議
上圖為host到設備端的通訊過程,主要由命令和數據組成。命令占6個bit,數據占11個bit。
- Command。黑體部分為Command,由5個bit組成。第一個bit固定為0,稱之為header,b0~b2為預定義的命令。pb為b0~b2異或之后的值,ack為設備返回的電平。下圖為預定義的三種命令:
- Data。Data也是由固定的0的header,加上8個bit的數據,加上數據異或校驗,然后設備返回的ack組成。下圖是實際通訊過程的截圖:
從設備到host的通訊格式也是如此,但header就由0變為1。然后ack由host發送。
程序的第二步,就需要實現這個通訊協議。即實現預定義的三種命令的函數,以及發送1個字節數據的函數。
4. 寫操作
有了上述的函數,就可以實現一個寫的操作。一個完整的寫操作由一下步驟組成:
- WOTF,寫命令,即010。
- N,需要發送的數據長度,以字節為單位。
- 三個字節表示的地址。
- N個字節的數據。
下圖為一個實際的寫操作過程:
程序的第三步就是需要實現這一個功能。
5. 讀操作
這是一個可選功能,如果不需要驗證的話,可以不實現。實現過程和寫操作是一樣的。
- ROTF,讀命令,即001
- N,要讀的數據長度,單位為字節
- 三個字節表示地址
- 設備返回的N個字節的數據。
需要注意的是,收到數據后,程序需要盡快校驗數據正確與否,並返回ACK(邏輯1)或者NACK(邏輯0)。下圖為實際的讀操作過程:
6. 復位操作
復位操作有兩種,第一種為發送復位命令,即發送SRST。第二種為拉低 總線16us以上。
下圖為發送SRST
下圖為拉低總線
這兩種復位操作有細微的區別。詳細請參考手冊《UM4070》
7. 輸入激活序列
在上電之后,SWIM總線是沒有被激活的,需要輸入特定的序列才能激活。序列如下:
詳細的描述請參考手冊。這里一個函數就實現了,挺簡單。
8. 配置寄存器,激活SWIM功能
激活之后,還不能對所有的寄存器進行讀寫,必須配置SWIM_CSR寄存器
實現上面8步之后,整個SWIM接口及其通訊就都打通了,程序中應該實現了以下函數:
1. Write()。這個函數實現SWIM寫命令和寫單個字節的功能。
2. SWIM_Write。這個函數實現了SWIM往某個寄存器寫若干數據的功能。
3. SWIM_Read。前期可以不實現該功能。
4. SWIM_Active()。這個函數實現了激活序列。
5. SWIM_RST(),SWIM_H_RST()。這兩個函數實現兩種復位功能。
9. STM8 Flash燒錄預備知識
官方手冊上,提供了三種flash操作的方式。
- 字節編程
- 字編程
- 塊編程
並提供了兩種使用SWIM燒錄的方法:
第一種方法,在某些型號的MCU上,只能支持字節操作。第二種方法,所有型號都支持,但需要先下載一個ICP驅動到RAM中。這兩種方法,官方都沒有提供詳細的文檔描述。因此,只能先使用邏輯分析儀分析STLink工具的下載過程,然后仿照其方法進行操作。
10. 邏輯分析儀分析
一般的邏輯分析儀都沒有SWIM協議,因此買的時候注意要買開放接口的邏輯分析儀,然后自己編寫。編寫的時候沒必要考慮異常情況,盡量簡單抓出所有下載過程即可。一般半天即可搞定。
我這里抓取了其數據之后,分析部分過程如下:
STLink下載是使用官方描述的第二種方法,即先下載一個驅動到RAM中,然后不停的將整塊數據送到RAM中的某特定地址,然后等待驅動將firmware數據寫入到flash中。簡單描述一下過程如下:
- 激活SWIM
- 配置若干寄存器
- 使能flash讀寫
- 下載驅動到RAM中
- 按照協議下載firmware數據到特定地址
- 等待驅動將數據寫入flash
- 繼續下一步寫入
11. 寫代碼
有了上述的實現,以及資料。基本就可以完成整個的程序設計。整個程序需要實現的功能如下,名字即功能。最后的接口為Download()。
12. 參考資料
《UM0470》,介紹SWIM接口
《PM0051》,介紹STM8 flash編程相關步驟
《RM0061》,接收STM8 flash寄存器相關