CH432,CH438,CH9434串口擴展芯片常見問題


目前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驅動的。

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM