アプリケーション・ノート使用上の注意

本アプリケーションノートの英語以外の言語への翻訳はユーザの便宜のために提供されるものであり、リビジョンが古い場合があります。最新の内容については、必ず最新の英語版をご参照ください。

なお、日本語版のアプリケーションノートは基本的に「Rev.0」(リビジョン0)で作成されています。

Image
アプリケーション・ノート使用上の注意

AN-891: ADuC703xシリーズのLINボーレート計算

はじめに

このアプリケーション・ノートの目的は、アナログ・デバイセズが発売するADuC703xシリーズのUARTで使用するデバイザ値(COMDIV0、COMDIV1、COMDIV2)の計算に習熟していただくことです。このアプリケーション・ノートでは、読者がLocal Interconnect Network(LIN)2.0仕様に精通しているものと想定します。

本書は、以下の3つの節で構成されます。

  • LINフレームヘッダ:LINフレームヘッダとSyncバイトについて説明します。
  • LINボーレート計算:LIN Hardware Synchronization(LHS)機能を使用してUARTの分周値を計算する方法について説明します。
  • LINボーレート計算のCコード例:「LINボーレート計算」で説明した計算のCコードによる実装例を示します。

LINフレームヘッダ

図1は、標準のLIN通信フレームを示します。このフレームは、ブレイクシンボル、Syncバイト、プロテクトID、データ、チェックサムで構成されます。

  • ブレイクシンボルは、LINパケットの先頭を表します。
  • Syncバイトは、スレーブのボーレートをキャリブレーションします。
  • プロテクトIDは、スレーブを識別します。
  • チェックサムは、送信データについて計算される標準チェックサム、またはプロテクトIDとデータについて計算される拡張チェックサムです。
Figure 1. LIN frame 図1. LINフレーム
図1. LINフレーム

図2は、Syncバイトの詳細を示します。Syncバイトは、マスターの所望のボーレートで送信される0xAAです。マスターのビットレートを判断する標準的な方法としては、最初の立下がりエッジから5番目の立下がりエッジまでの時間を測定します。この値を8で割ると、所望のビットレートが得られます。その後、この値はUARTの分周値の計算に使用されます。計算の詳細は、以降の節で説明します。このアプリケーション・ノートでは、Syncバイトの全8ビットのタイミングをとるために、LHS MMRが設定されているものと想定します(LHSCON1=0x62)。

Figure 2. LIN sync byte 図2. LIN Syncバイト
図2. LIN Syncバイト

LINボーレート計算

LHSシステムを使用すると、Syncバイトの受信後にLHSVAL0から値が得られます。LHSVAL0には8つのTBITに相当する値が含まれています。この値はUARTのデバイダCOMDIV0とCOMDIV1、およびフラクショナル・デバイダCOMDIV2の値の生成に使用されます。UARTの詳細については関連するADuC703xのデータシートを参照してください。

標準のボーレート・ジェネレータを使用してCOMDIV0/COMDIV1の値を計算するには、次の基本UART式を使用します。

DL  20.48 MHz

ボーレート×2CD×16×2

ここで、

DLはCOMDIV0とCOMDIV1の値です。
CDはクロック・デバイダです。

LHSVAL0に基づいて、所望のボーレートは次のようになります。

所望のボーレート  5.12 MHz x 8

LHSVAL0

(LHSVAL0は内部の5.12MHzクロックから駆動されます。LHSCON1は8つのTBITを測定するように設定されていると想定します。)

標準のボーレート式と所望のボーレート式を組み合わせた場合、

DL  20.48 MHz x LHSVAL0

5.12 MHz x 2CD x 16 x 2 x 8
DL  LHSVAL0

2CD×16×2×2
DL  LHSVAL0

2CD + 6

標準のボーレート・ジェネレータ式だけを使用すると、COMDIV0/COMDIV1の必要な値が得られます。

精度を高めるには、DL値(COMDIV0/COMDIV1)を標準のボーレート・ジェネレータ向けにあらかじめ計算して、ADuC703xフラクショナル・デバイダを使用します。フラクショナル・デバイダを使用する式は、次のようになります。

ボーレート  20.48 MHz

DL x 2CD x 16 x 2 x ( M + N2048)

ここで、MとNはCOMDIV2の値です。

M + N2048  20.48 MHz

ボーレート×DL×2CD×16×2

ボーレートを置き換えると、

M + N2048  20.48 MHz x LHSVAL0

5.12 MHz x 8 x DL x 2CD x 16 x 2

これは次のように簡略化されます。

M + N2048  LHSVAL0

DL x 2CD x 2 x 16 x 2
M + N2048  LHSVAL0

DL x 2CD + 6

フラクショナル・デバイダの計算に使用される複雑な数値演算を簡略化するため、DL (COMDIV0/COMDIV1)の値を2のべき乗に制限します。たとえば、DL=17の場合、Nの計算でDL=16=24を使用します。これによりDLの変更による誤差を補償するようにNの値が自動的に調整されます。

DL  2DL_Power
M + N2048  LHSVAL0

2DL_Power x 2CD + 6
M + N2048  LHSVAL0

2DL_Power + CD + 6

M=1に設定された場合は、

N  211 x LHSVAL0  − 2048

2DL_Power + CD + 6
N  25 − DL_Power − CD x LHSVAL0 − 2048

たとえば、19,200bpsのボーレートで、CD=0、DL=33、LHSVAL0=2133の場合、N=21でボーレートは19,197bpsです。DL=32とN=85を使用した場合、ボーレートは19,203bpsとなります。

LINボーレート計算のCコード例

Cでプログラミングするときは、シフト・コマンド<<and>>を使用して前述の式を簡単に記述できます。

// DL = LHSVAL0 >> CD_Bits + 6 
iDL = LHSVAL0 >> (( POWCON & 0x7)+6);

// writing DL as 2^iDL_Power 
iDL_Power = 0; 
iDL_temp = iDL; 
while(iDL >> (iDL_Power +1 )) 
{
     iDL_Power++;
}

// Configuration of the fractional divider: 
// M = 1 
// N = LHSVAL0 × 2 ^ (5 – (iDL_Power + CD)) - 2048 
iDL_temp = iDL_Power + (POWCON & 0x7); 
if (iDL_temp > 5) 
{ 
     iDL_temp = (LHSVAL0 >> (iDL_temp -5)) - 2048; 
} 
else 
{ 
     iDL_temp= (LHSVAL0 << (5 - iDL_temp)) - 2048; 
} 

COMDIV2 = 0x8800 + iDL_temp;

COMCON0 = 0x080;   // Setting DLAB 
// Setting DIV0 and DIV1 to DL calculated 
COMDIV0 = (1<< iDL_Power) & 0xff; 
COMDIV1 = (1<< iDL_Power) & 0xff00; 
COMCON0 = 0x03;   // Setting DLAB 
COMIEN0 = 0x1;    // Enable RX interrupt

 

著者

Generic_Author_image

Aude Richard