MAX3108為完整的高性能通用異步收發器(UART),采用2.1mm×2.1mm晶圓級封裝(WLP)。它在硬件中提供了許多高端功能,從而降低了固件的復雜性。MAX3108的大多數高級功能不需要快速響應和密集的固件管理,而只需要初始固件設置,很少或不需要固件管理。本應用筆記是詳細解釋MAX3108特性的系列筆記之一,解釋了如何設置目標波特率。
介紹
MAX3108是一款高性能通用異步收發器(UART),采用晶圓級封裝(WLP),具有許多硬件高級特性,從單獨的128字發送和接收FIFO到廣泛的硬件介導流控制。MAX3108的大部分功能依賴于時鐘的編程。因此,第一個編程任務是設置適當的波特率時鐘。
本應用筆記解釋了如何對1個寄存器(和5304位)進行編程以設置所需的波特率。提供了一個電子表格,大大簡化了UART波特率編程的任務。本文檔假定讀者已經熟悉應用筆記3108“與MAX<> UART的接口”。
波特率生成
本節描述MAX3108如何從晶體或振蕩器輸入產生波特率頻率。這應該首先在對UART進行編程時完成。除 SPI/I 外2C接口和基本的GPIO功能,在編程時鐘速率之前,MAX3108中沒有其他功能。如果使用晶體作為頻率源,則器件在時鐘被禁用的情況下退出復位。
MAX3108按以下方式將時鐘源處理為輸出波特率:
如果時鐘源是晶體,則晶體振蕩器模塊將此源轉換為內部邏輯電平時鐘。MAX3108接受在1MHz至4MHz諧振的晶體。要啟用晶體振蕩器,請將晶體EN位設置為1。或者,可以在MAX3108的XIN引腳上提供外部邏輯電平時鐘源。MAX3108接受500kHz至35MHz的時鐘頻率。由于CrystalEn位在上電或復位后默認為0,因此除非另有專門編程,否則它將使用外部時鐘。
步驟1中的時鐘為預分頻器的輸入供電。它將輸入頻率除以 1 到 63 之間的數字。PLLConfig 寄存器的位 5 到 0 定義除數。
預分頻器的輸出饋入鎖相環 (PLL),鎖相環將預分頻器的頻率乘以 1、6、48、96 或 144。要乘以 1,請將位 2(CLKSource 寄存器的 PLLEn 位)設置為 0。要設置任何其他乘法器,請將PLLEn位設置為1,并設置PLLConfig寄存器的第7位和第6位,如MAX4數據資料表3108所示,其中還詳細說明了PLL的頻率限值。請注意,如果電源電壓(V抄送) 小于 2.35V。當從低頻時鐘源產生高波特率時,PLL非常有用。
PLL的輸出為波特率發生器供電,波特率發生器對輸出頻率進行分頻。該電路將其輸入頻率除以整數部分(從1到65,535)和小數部分(從0/16到15/16)。這是通過DIVMSB寄存器,DIVLSB寄存器和BRGConfig寄存器的位3到0進行編程的。波特率發生器的輸出是內部波特率時鐘。實際波特率是波特率發生器的頻率輸出除以 16。可以除以 8 或 4,但如果可能的話,應該使用除以 16。被8或4分頻會使某些特性無法使用,并降低MAX3108 UART接收器的頻率誤差容限。
圖1.MAX3108時鐘選擇圖
圖2.2 倍和 4 倍波特率。
速率模式分頻器 | BRGConfig[5] | BRGConfig[4] | IrDA有能力嗎? | 線路噪聲檢測能力強? | 接收頻率誤差容限 |
16 | 0 | 0 | 是的 | 是的 | 最好 |
8 | 0 | 1 | 不 | 是的 | 非常好 |
4 | 1 | 0 | 不 | 不 | 好 |
晶體振蕩器采用常見的UART晶體(如1.8432MHz)工作,外部時鐘輸入采用嵌入式系統中的一系列常見時鐘頻率工作。這是為了生成波特率時鐘而需要消化的大量信息。此外,對于大多數波特率,可以通過多種方式生成相同的波特率。
波特率協助電子表格
因此,可以下載“MAX3108頻率選擇”電子表格。根據給定的輸入頻率和所需的波特率,該工具可以方便地確定在MAX3108的五個時鐘配置寄存器中編程的內容。該電子表格計算了從給定輸入頻率生成目標波特率的幾種最佳方法。
在許多情況下,可以精確地生成目標波特率。然而,有時最佳配置會導致生成的波特率出現小誤差。這就是電子表格提供多個可能配置的原因。每種可能性都會產生最接近的頻率匹配,但具有不同的假設。
大多數時候,會有一種配置明顯更勝一籌。在描述電子表格之后,我們將通過一些示例來說明確定MAX3108編程的最佳正確配置是多么容易。
電子表格說明
電子表格只需要來自用戶的四個輸入,所有輸入都在“綜合”選項卡的頂部附近。
輸入四個參數,如下所示:
在單元格 C2 中,輸入晶體頻率或外部振蕩器頻率(以赫茲為單位)。
在單元格 C3 中,輸入所需的波特率(以位/秒為單位)。
在單元C5中,如果頻率源是晶體(使用MAX3108晶體振蕩器),則輸入y;如果頻率源是提供給MAX3108 XIN引腳的外部時鐘,則輸入n。
在單元格 C6 中,輸入 n。這與MAX3108的特性有關,稍后將對此進行描述。
結果從第 8 行開始顯示。
如果C8單元報告FALSE,則選擇晶體作為頻率源,它超出了MAX3108晶體振蕩器電路的有效頻率范圍。有效的晶體振蕩器頻率范圍在 1MHz 和 4MHz 之間。
如果單元 C9 報告 FALSE,則表示您選擇了外部時鐘源,并且您指定的頻率超出了 XIN 引腳的有效時鐘頻率范圍。有效的外部振蕩器頻率范圍在 0.5MHz 和 35MHz 之間。
單元格 C11 報告是否有可能合理地生成所需的波特率。單元格 C11 可以報告 FALSE,因為單元格 C8 或 C9 報告 FALSE。或者因為不存在可以合理達到目標波特率的配置。例如,請求高于MAX3108最大值24MBd的波特率會導致單元C11報告FALSE,而不管其他用戶輸入的值如何。
從第 13 行開始顯示更多結果。
D、E 和 F 列計算頻率誤差最低的配置,每個列的假設都不同。D 列假定速率模式固定為 16,E 列假定速率模式固定為 8,F 列假定速率模式固定為 4。作為一般規則,費率模式應保持在 16,除非有令人信服的理由選擇其他方式,我們將很快回到這個話題。
第 14 行是一個標志,如果為 FALSE,則表示在產生接近所需波特率的結果的任何配置中都不能使用相應的速率模式。在這種情況下,此列中的其他條目將為空。
第 15 行到第 17 行和第 20 行以可通過圖 1 和圖 2 理解的方式描述配置。第 15 行描述所選的預分頻器值。第 20 行表示選擇了哪個 PLL 乘法器。此外,第 16 行和第 17 行描述了分數率生成器的整數和小數部分。更直接感興趣的是,第 17 行顯示實際生成的波特率,第 18 行包含頻率誤差(以百分比表示)。
第21行至第25行表示要編程到3108個MAX3108時鐘配置寄存器中的值,以十六進制表示。當用戶選擇配置時,將這五個十六進制值復制到程序中,稍后將介紹,以將這些值加載到MAX<>中。
第一個例子
讓我們從一個簡單的例子開始,從19.2MHz晶體產生1.8432kBd。輸入以下參數:
結果如下:
注意,單元D19表示零頻率誤差,至少在MAX3108從頻率輸入到波特率輸出的轉換過程中是這樣。這是速率模式為 16 的最佳方案。請參考單元D21至D25,確定在MAX3108時鐘配置寄存器中編程的內容。您會發現,在大多數情況下,您將選擇單元格 D21 到 D25 來編程所需的波特率。
頻率誤差示例
現在讓我們嘗試一個不同的示例。讓我們從190.1MHz晶體生成8432kBd。輸入以下參數:
請注意不同的結果:
現在,對于 16 的速率模式,我們的誤差很小,而對于其他速率模式,誤差較小。在這種情況下,誤差足夠小,應使用單元格 D21 到 D25 值。
什么是足夠小的錯誤?一般來說,0.8%或更低的頻率誤差不應引起關注。但是,應仔細查看2.0%或更高的頻率誤差。0.8%和2.0%之間的誤差涉及一些判斷。在這種情況下,速率模式為16時的頻率誤差約為0.07%,足以使其成為配置的最佳選擇。
具有大頻率誤差的示例
我們現在將嘗試一些東西來說明為什么我們有時可能需要選擇 E 列或 F 列。首先,讓我們從 5.678901MHz 時鐘生成 28.23MBd。輸入以下參數:
在這里,我們得到了一個更有趣的結果:
請注意,速率模式為16時的頻率誤差為2.63%,這太高了。如果使用MAX3108 IRDA功能,則必須將速率模式設置為16。在這種情況下,也許可以選擇不同的輸入頻率,例如18MHz。或者可以對通道時序進行更仔細的分析,以驗證此錯誤是否不會影響正在設計的特定系統。
另一種選擇是選擇速率模式設置為 8 的配置。這導致了非常可觀的0.5%頻率誤差。在這種情況下,MAX3108時鐘配置寄存器的編程參數取自單元E21至E25。
選擇更有限的示例
對于大于 6MBd 的輸出速率,速率模式不能為 16。這是必須選擇其他速率模式之一的另一個原因。即使低于6MBd,輸入頻率和輸出波特率的某些組合也不允許速率模式為16的情況。例如,嘗試從 5.775MHz 晶體生成 1.8432MBd。
結果是:
在這種情況下,根本無法使用 16 的速率模式。要么必須改變輸入頻率,要么必須選擇8的速率模式。請注意,在某些情況下,8 的速率模式也不是一種選擇。例如,當輸出波特率大于 12MBd 時,唯一可能的速率模式為 4。
MAX3108編程
從電子表格中選擇一組編程參數后,對MAX3108進行編程就變得非常簡單。上電時加載所有寄存器時,這五個寄存器構成正在加載的組的一部分。本節介紹如何對MAX3108進行目標波特率編程,假設尚無串行數據流。更改現有波特率時必須采取進一步措施。這些步驟將在以后的應用筆記中解釋。我們從一個例子開始,其中頻率源是一個外部時鐘,比如說,從MAX190 XIN引腳上的28.23MHz外部時鐘源產生3108kBd。電子表格的輸入部分如下所示:
結果是:
程序加載MAX3108時鐘配置寄存器以產生目標波特率。請注意,程序中填充到數組 U190K 中的參數是從電子表格中的單元格 D21 到 D25 復制的。
/* ** Run UART at 190KBAUD from a 28.23MHz clock source */ unsigned char U190K [] = { 0xF7, 0x05, 0x18, 0x00, 0x04 } ; // Load the MAX3108 clock configuration registers appropriately // if (!MAX3108_Puts (MAX3108R_PLLCONFIG, sizeof U190K, U190K)) { // handle possible I2C protocol error here }
第二個編程示例
再舉一個例子,讓我們從230.4MHz晶體生成1.8432kBd作為輸入。這是UART時鐘生成中非常常見的晶體。電子表格的輸入部分如下所示:
結果是:
當時鐘源是晶體時,您可以選擇驗證晶體操作。STSInt 寄存器中的 ClkReady 位僅在晶體振蕩器和 PLL 工作并鎖定時觸發。對于已知工作正常的給定MAX3108時鐘配置,這簡化為驗證晶體振蕩器是否按預期工作。如果使用外部時鐘源,ClkReady位不起作用,因此如果外部時鐘饋電MAX3108,則不要對其進行測試。
盡管此功能在開發環境中很有用,但在生產或現場部署的設備中可能用處不大。請注意,STSInt 寄存器中的其他位在讀取時被清除。如果不清除可能的 TxEmptyInt 或 GPIxInt 條件,就無法檢查 ClkReady 位。程序員當心!
對于外部時鐘,如果更改了預分頻器或PLL因子,UART將無法立即發送或接收。更改預分頻器或PLL因子后,或在啟用PLL后,UART將在1200 ×(預分頻器)/(XIN頻率)或更低的時間延遲后以新的編程波特率工作。
/* ** Run UART at 230.4KBAUD from a 1.8432MHz crystal */ unsigned char U230K4 [] = { 0x03, 0x00, 0x01, 0x00, 0x06 } ; // Load the MAX3108 clock configuration registers appropriately // if (!MAX3108_Puts (MAX3108R_PLLCONFIG, sizeof U230K4, U230K4)) { // handle possible I2C protocol error here } // Check XTAL and PLL are running OK - optional while (MAX3108_Read (MAX3108R_STSINT & 0x0008) == 0) ;
避免鎖相環更改
到目前為止,我們一直在使用第 13 行到第 25 行的結果。另一部分(第 27 行到第 39 行)的假設略有不同。在第二部分中,將計算頻率誤差最低但PLL固定為不同速率的配置。
當從單個頻率源生成多個波特率時,這非常有用,而不會產生與PLL重鎖相關的延遲。這意味著預分頻器和PLL不得在各種配置之間變化。
這方面的一個例子是在 IO-Link 場景中,能夠在 230.4kBd 38.4kBd 和 4.8kBd 之間快速切換非常重要。讓我們看看如何實現這一點,假設我們無處不在的1.8432MHz晶體。從最高波特率開始,電子表格的輸入部分如下所示:?
這導致:
讓我們從速率模式可以是 16 的假設開始。注意預分頻器和PLL系數,分別為3和x6。如果可行,我們將使用單元D21至D25中的配置值對MAX3108進行230.4kBd編程。現在,讓我們嘗試下一個波特率。
本例中的結果是:
這些條目的 PLL 因子都不為 x6,因此現在讓我們參考第二部分。
列 E 提供了假設 PLL 因子必須為 x6 的配置。請注意,預分頻器值也是 3。這意味著,如果我們選擇使用單元格 E230 到 E4 中給出的參數配置 38.4kBd 輸出速率,則 PLL 將不需要重新鎖定從 38.4kBd 到 35.39kBd。
我們需要檢查我們是否可以使用 4.8kBd 來做到這一點。電子表格的輸入部分如下所示:
結果是:
就像在 38.4kBd 的情況下一樣,沒有一個結果的 PLL 因子為 x6,因此我們參考第二部分:
就像在 38.4kBd 的情況下一樣,x6 部分顯示我們可以生成 4.8kBd,PLL 因子為 x6,預分頻器 3,使用單元格 E35 到 E39 中的配置參數。
完全避免鎖相環
在某些情況下,最好完全避免使用PLL。例如,如果 V抄送提供給MAX3108的電壓低于2.35V。此外,如果在退出低功耗模式后快速運行很重要,則應避免使用PLL。假設我們需要從 230.4MHz 晶體生成 38.4kBd、4.8kBd 和 1.8432kBd,但我們也需要避免使用 PLL。
實現此目的的最簡單方法是查閱電子表格所有三個實例的PLL因子固定為x1的部分。對于 230.4kBd 的目標波特率,第二部分是:
單元格 D35 到 D39 報告電子表格的所有三個實例所需的配置,三個所需波特率中的每一個實例一個實例。由于這三種配置中均未使用PLL,并且預分頻器值不會改變,因此在所有三種波特率之間切換可避免PLL重新鎖定的延遲。
保持高速率模式
如果希望將速率模式設置為 16 并避免使用 PLL,則應參考第三個結果部分,即第 41 行至第 53 行。請注意,這是一個相當嚴格的方案,因此第三部分通常是空白的,以指示無法合理地實現此類配置。例如,讓我們從190.28MHz外部時鐘源生成32kBd的輸出速率。
電子表格的輸入部分為:
本例中的結果是:
對于 16 的速率模式,建議的配置使用 x144 的 PLL 系數,但我們需要 x1 的 PLL 系數。這不符合我們對速率模式 16 和 PLL 因子 x1 的要求。查閱第二個結果部分:
對于 x1 的 PLL 系數,建議的速率模式為 8。不完全是我們要找的。查閱電子表格的第三個結果部分:
我們看到,從190.28MHz外部時鐘產生23kBd是可能的,PLL因子為x1,速率模式為16。頻率誤差為合理的0.28%。用于完成此操作的配置參數位于單元格 D49 到 D53 中。
“手動”選項卡
對于實驗或處理異常情況時,電子表格的“手動”選項卡提供了一些基本幫助。電子表格包含四個部分。用戶輸入部分為:
輸入所有這些參數后,請參閱第二部分:
確保 D 列中沒有單元格報告 FALSE,并且 D 列中沒有單元格報告 BAD。在繼續操作之前,請更正用戶輸入部分中的任何錯誤。清除所有錯誤后,請參閱第三部分:
如果您在單元格 D33 中看到警告,則需要返回并修復輸入中的錯誤。否則,產生的實際波特率出現在C33單元中,與所需波特率(單元C5)相比的誤差百分比出現在單元C34中,用于編程MAX3108時鐘配置寄存器的配置參數出現在單元C35至C39中。注意:除非您有一些幫助,否則頻率誤差可能會很大,這就是第四部分的原因:
在這里,唯一的輸入是單元格 C42 中所需的波特率。它假定在用戶輸入部分中輸入的預分頻器、PLL因子和速率模式,并計算要使用的最佳波特率發生器參數。若要使用這些,請將它們復制回用戶輸入部分,手動將單元格 C43 復制到單元格 C10,將單元格 C44 復制到單元格 C11。否則,第四部分的結果不會反映在第三部分,即輸出部分。
一個偉大的調試技巧
MAX3108提供了一種驗證輸出波特率的方法。此功能在開發、調試以及可能在制造過程中非常有用。激活此功能后,MAX3108將波特率發生器的輸出饋送到RTS引腳,就在速率模式分頻器之前。
例如,將MAX3108配置為波特率為230.4kBd,速率模式為16。激活此功能后,RTS 引腳將提供頻率為 230.4K × 16 或 3.6864MHz 的時鐘。這可以通過將頻率計數器連接到RTS引腳或大約使用示波器進行驗證。當 CLKsource 寄存器中的 CLKtoRTS 位(位 7)設置為 1 時,將啟用此功能。以下是該參數在電子表格的“合成”選項卡中的作用:
將此輸入設置為 y 會導致所有報告的配置啟用此功能。一旦加載到MAX3108中,這些配置將為RTS引腳提供時鐘。這是利用此功能的一種方法。
另一種方法是打開或關閉該功能,而不改變MAX3108中已編程的時鐘配置。以下代碼片段演示了如何執行此操作。這些功能將打開或關閉該功能,而不會干擾時鐘配置。
/* ** Function to enable the clock-to-RTS feature of the MAX3108 ** ** Returns TRUE if operation successfully completed. */ BOOL CLKtoRTS_En (void) { unsigned int temp; temp = MAX3108_Read (MAX3108R_CLKSOURCE); // returns 0xff00 if I2C error if (temp & 0xff00) return FALSE; return MAX3108_Write (MAX3108R_CLKSOURCE, temp | 0x0080); } /* ** Function to disable the clock-to-RTS feature of the MAX3108 ** ** Returns TRUE if operation completed successfully */ BOOL CLKtoRTS_Dis (void) { unsigned int temp; temp = MAX3108_Read (MAX3108R_CLKSOURCE); // returns 0xff00 if I2C error if (temp & 0xff00) return FALSE; return MAX3108_Write (MAX3108R_CLKSOURCE, temp & 0x007f); }
結論
本應用筆記介紹了如何使用電子表格快速、輕松地計算MAX3108所需的參數,使其具有任何所需的波特率。還解釋了如何使用這些參數對MAX3108進行編程。
審核編輯:郭婷
-
收發器
+關注
關注
10文章
3337瀏覽量
105529 -
寄存器
+關注
關注
31文章
5250瀏覽量
119191 -
晶圓
+關注
關注
52文章
4741瀏覽量
127272
發布評論請先 登錄
相關推薦
評論