目前WCH有三款串口擴展芯片CH432,CH438以及CH9434。
型號 |
CH432 |
CH438 |
CH9434 |
擴展串口數量 |
2 |
8 |
4 |
通訊接口 |
並口/SPI(具體需要看芯片封裝) |
並口 |
SPI |
接口速度 |
支持最高 10MB的並口 24MHz的SPI |
10MB的8位並口 |
最高16Mbit/s 注1:見表格底 |
是否支持級聯 |
是 |
是 |
是 |
FIFO大小 |
內置 16 字節的 FIFO 先進先出緩沖器,支持 4 個 FIFO 觸發級 |
內置 128 字節的 FIFO 先進先出緩沖器,支持 4 個 FIFO 觸發級 |
串口每個方向獨立 FIFO 緩存,發送 1536 字節,接收 2048 字節 |
封裝 |
CH432Q(LQFP44) CH432T(SSOP20) |
CH438L(LQFP128) CH438Q(LQFP44) |
QFN48_5X5 |
電源 |
3.3V-5.3V (5V典型值) |
3.3V-5.3V (5V典型值) |
2.4V-3.6V (3.3V典型值) |
注1:CH9434的SPI最快時鍾速度與CH9434的系統時鍾有關系。最快速度(穩定)約為系統時鍾的1/3。Eg:如果使用內部32M,倍頻15,分頻15.那么sys_clk還是32M,那么SPI_Clk不能超過10Mbit/s。
常見問題解決
1. CH432/8/CH9434的LSR寄存器進入break。
解答:這個是因為串口的RXD腳一直處於低電平導致的,只需要硬件接上拉等方式即可解決。
2. 如何判斷CH432/CH438/CH9434芯片是否正常工作
解答:(1)檢查硬件,檢查芯片的VCC引腳的電壓是否為手冊里面要求的典型值。看一下VCC的紋波是否過大。
(2)在上電的情況,使用示波器去檢查芯片的XI,看一下晶振是否有波形。
(3)檢查硬件的連接線是否有問題(主控芯片與串口擴展芯片通訊接口的連接)
(4)通過接口發送對應的數據,往SCR寄存器寫數據,再讀出來看是否為剛剛寫入的數據,如果是的,則表示芯片工作正常並且硬件基礎的通訊連接沒有問題。
注:這三個串口擴展芯片的SCR寄存器為用戶自定義的寄存器,斷電復位是會保持。
3. 主控芯片與芯片通訊不正常
解答:(1)首先檢查硬件的連接。
(2)如果是SPI,檢查一下SPI的CLK速度是否超過了芯片要求的最大值
(3)部分芯片對於命令與數據,命令與命令之間是由最小時間的間隔要求,具體需要看芯片手冊。可以用邏輯分析儀查看是否有這些時間間隔。
(4)所有的SPI轉串口(擴展)的芯片的時序,CS是在發送完addr和數據后,才會重新拉高的。具體可以看芯片手冊的時序圖。
4.有關串口擴展芯片的FIFO的問題
解答:三款串口擴展芯片的接收fifo觸發點都是控制FCR寄存器的RECVTG1 和 RECVTG0位(3個芯片的大部分寄存器都是一樣的)。
(1)CH432:RECVTG1 和 RECVTG0:設置接收 FIFO 的中斷和硬件流控制的觸發點,00 對應 1 個字節,即接收
滿 1 個字節產生接收數據可用的中斷,並在使能硬件流控制時自動無效 RTS 引腳,01 對應 4
個字節,10 對應 8 個字節,11 對應 14 個字節。(FIFO16字節)。
(2)CH438:RECVTG1 和 RECVTG0:設置接收 FIFO 的中斷和硬件流控制的觸發點,00 對應 1 個字節,即接收
滿 1 個字節產生接收數據可用的中斷,並在使能硬件流控制時自動無效 RTS 引腳,01 對應 16
個字節,10 對應 64 個字節,11 對應 112 個字節((FIFO128字節)
(3)CH9434M:RECVTG1 和 RECVTG0:設置接收 FIFO 的中斷和硬件流控制的觸發點,00 對應 256 個字節,即
接收滿 256 個字節產生接收數據可用的中斷,並在使能硬件流控制時自動無效 RTS 引腳,
01 對應 512 個字節,10 對應 1024 個字節,11 對應 1280 個字節。
當接收數據達到觸發值時,就會觸發recv_rdy(接收字節數達到fifo觸發點)中斷。
5. 對於CH43x芯片讀取的問題
解答:有些新上手的工程師,在使用fifo接收的時候,會發現隨着波特率的提高,當觸發RECV_RDY中斷的時候,去讀取RBR寄存器(注1)的數據。最后讀出來的數據長度會超過FIFO接收觸發的長度。這個是因為目前43xEVT的代碼里面,是一個do--while循環,判斷的條件是看BIT_LSR_DATARDY,也就是LSR的DATARDY位是否為1(注2),為1則表示fifo里面有數據,那么如果通訊接口的速度與較慢,串口的波特率較高,並且對方串口的發送速度也較快,那么就會出現,觸發fifo_recv_rdy中斷后,主控芯片通過接口去讀取緩沖區的數據,但如果在讀取的時候來了新的數據,那么就會繼續停留在這個do-while循環語句當中。最后導致的情況就是讀出的數據長度明顯大於fifo觸發的長度,如果fifo觸發值設置的較大,那么很有可能會出現fifo溢出的問題。
u8 CH432Seril1Rcv( u8 *buf ) /* 禁用FIFO,CH432串口1接收多字節子程序*/
{
u8 RcvNum = 0;
if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4無錯誤 */
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待數據准備好 */
do
{
*buf++ = ReadCH432Data( CH432_RBR1_PORT ); /* 從接收緩沖寄存器讀出數據 */
RcvNum++;
}
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
}
else ReadCH432Data( CH432_RBR1_PORT );
return( RcvNum );
}
解決辦法就是在這個接收函數里面,如果是fifo觸發的中斷,則強制只讀一個觸發值長度的數據,如果是超時中斷則調用原來的dowhile的那個方式。其次,若選擇的是CH432這樣的fifo較小的串口擴展芯片,那么fifo觸發值最好選擇一半。還有就是提高spi接口的通信的速率。
6. 有關串口波特率的問題
解答:串口波特率的計算和DLM以及DLL兩個寄存器有關。具體的計算公式:除數(DLL和DLM的值)=芯片主時鍾/16or8(具體看芯片手冊)/波特率。
注1:RBR:接收緩沖寄存器,如果 LSR 的 DATARDY 位為 1 則可以從該寄存器讀取接收到的數據。如果 FIFOEN
為 1 則從串口移位寄存器 RSR 接收到的數據首先被存放於接收 FIFO 中,然后通過該寄存器讀出
注2:DATARDY:該位為 1 表示接收 FIFO 中有接收到的數據,讀取 FIFO 中所有數據后,該位自動清 0。
驅動代碼工程
可以去個人Gitee,里面有STM32F103單片機控制CH423/CH438的驅動代碼。
個人Gitee:https://gitee.com/maji19971221/wch_-per/tree/master/WCH_Per/STM32F103
CH9434的驅動代碼可以去WCH官網,官方留的就是stm32驅動的。