簡介
CH9434是一款SPI轉四串列埠轉接晶片,提供四組全雙工的9線非同步串列埠,用於微控制器/嵌入式/安卓系統擴充套件非同步串列埠。提供25路GPIO,以及支援RS485收發控制引腳TNOW。本篇基於STM32F103,介紹CH9434在MCU平臺移植和使用方法。
Linux移植說明可以跳轉到這個連結:https://blog.csdn.net/WCH_TechGroup/article/details/128288016
本次移植的最終程式碼工程可以去個人Gitee下載:https://gitee.com/maji19971221/wch_-per#202214
CH9434EVT下載連結:https://www.wch.cn/downloads/CH9434EVT_ZIP.html
移植說明
1. 找一個最簡單的MCU的SPI程式碼。
2. 去WCH官網下載CH9434EVT.ZIP,找到裡面MCU的驅動程式碼。CH9434.c和CH9434.h複製到工程裡面。
3. 因為不同MCU,SPI的首發,以及自己寫的CS的拉高拉低和CH9434.c有區別。把裡面的CH9434_SPI_SCS_OP;CH9434_SPI_WRITE_BYTE函式改為自己MCU的寫法或者把自己的程式碼在外面封一層函式就行了。我這邊選擇再封了一層函式,不去修改驅動檔案。
4. 接下來需要判斷主控和CH9434之間是否保持一個正常的介面通訊。晶片這裡預留了一個使用者自定義暫存器(SCR暫存器),可以透過往這個暫存器寫入隨機值再讀出,看讀出值是否為剛剛寫入的值,如果不是那就是介面通訊異常,問題有以下幾個可能:
a) CH9434的硬體存在問題。硬體問題判斷方向比較多。可以透過看晶片的VCORE(33)腳的電壓(1.05V-1.1V),以及外部32M晶振是否振盪做一個基礎的判斷。常見的一些硬體設計問題包括:1. CH9434的3個VDD腳沒有外部短接,這個是在硬體設計時比較容易犯的錯誤,晶片的3個VDD(1,2,35)腳如果沒外部短接,晶片無法正常工作。2. PCB封裝畫錯,沁恆目前只提供AD的元器件封裝庫,對於使用Candence等EDA工具的需要自己建立元器件庫,而CH9434A的封裝並不是每邊引腳數量一致,這個就會導致部分PCB工程師在繪製時出錯。
b) 軟體時序問題。CH9434A的時序圖如下(使用DsView抓包獲得)。可以看到,CH9434的正常通訊時序是在一個CS低電平裡面有兩個位元組的資料(命令+資料),並且命令和資料之間要保持至少3us的間隔。沒有按照這個要求,晶片可能就無法正常識別主機發過來的資料,從而通訊失敗。
5. 程式新增SCR讀寫操作程式碼,判斷介面通訊是否正常。
正常的話讀取資料就是0x55,通訊異常就是其它資料。這樣和9434最基礎的通訊程式碼就已經完成了。
功能測試
串列埠功能測試
首先需要初始化時鐘和串列埠,初始化的程式碼,可以參考EVT中的main函式。因為都已經封裝好了函式,使用者實際只需要呼叫庫函式,給入對應的實參即可。這邊拿其中的串列埠0(0-3)舉例。CH9434的4個串列埠都是獨立的,每個串列埠的暫存器都有獨立的暫存器地址,所以需要根據自己實際需要使用幾個串列埠去做對應的初始化設定。晶片本身的串列埠是TTL,但是也支援流控和485Tnow的使能控制,如果需要使用只需要將程式碼這邊對應的宏定義開啟即可。
透過EXIT_INT宏定義選擇使用while(1)查詢方式還是使用INT外部中斷的方式去做。需要注意的是,CH9434的中斷方式是低電平觸發,目前部分MCU僅支援下降沿觸發,此時就需要在外部中斷服務函式里面加上INT引腳判斷,直到INT變高才退出外部中斷服務函式。
將CH9434EVT裡面的main函式處理複製到自己的工程。這裡的程式碼做的功能就是回傳(收到什麼回傳什麼)。整個程式碼的處理流程邏輯如下:
最終實現的效果就是串列埠收到什麼就回傳什麼資料。
RS485功能測試
評估版透過跳帽將晶片的串列埠連結到485晶片。程式方面只需要開啟RS485宏定義。
和TTL的初始化程式碼區別就是多了一個RS485 TNOW使能的初始化,讀寫的程式流程和前面的TTL保持一致。
最終實測效果也是一樣,實現的效果就是串列埠收到什麼就回傳什麼資料。
Modem流控功能測試
程式中將開啟流控的宏定義開啟。和TTL的初始化程式碼區別就是多了一步流控的使能以及RTS和DTR引腳的電平狀態設定,讀寫的程式流程和前面的TTL保持一致。
開啟串列埠工具的RTS使能,即可實現正常的資料收發。
GPIO功能測試
將GPIO_Test宏定義開啟,本次程式碼是將GPIO0-12作為推輓輸出,GPIO13-25作為上拉輸入讀取電平狀態。
程式下載,如圖,隨機拿GPIO10連結一個LED燈。實現閃爍效果。
隨機將GPIO19接地,程式列印正常讀取。