- メインページ
- ネームスペース
- クラス
- ファイル

- ネームスペース一覧
- ネームスペースメンバ

# ネームスペース twi

## 説明

twiネームスペース

TWI関連の資源を格納する名前空間。

## 関数
void | init (unsigned int sclkMHz)
| TWI初期化関数
void | start (void)
| TWIスタート関数
bool | ISR (void)
| 割込みハンドラ
void | readAsync (unsigned char address, unsigned char data[], unsigned int count, void(*callback)(bool))
| TWIデバイスからの非同期書読み込み
void | writeAsyncSub (unsigned char address, const unsigned char data[], unsigned int count, void(*callback)(bool))
| writeAsyncの下請け関数
void | writeAsync (unsigned char address, const unsigned char data[], unsigned int count, void(*callback)(bool))
| TWIデバイスへの非同期書きこみ
void | writeReadAsync (unsigned char wAddress, const unsigned char wData[], unsigned int wCount, unsigned char rAddress, const unsigned char rData[], unsigned int rCount, void(*callback)(bool))
| TWIデバイスへの非同期書き込み/読み込み
## 変数
unsigned char * | dataPtr
| データ転送バッファ・アドレス
unsigned char * | nextPtr
| Repeated Start後に使うバッファ・アドレス
unsigned char | nextAddress = 0
| Repeated Start後のデバイス・アドレス
unsigned int | transferedCount
| 転送済みバイト数
unsigned int | countToBeTransfer
| 転送するバイト数
unsigned int | nextTransfer
| Repeated Start後の転送バイト数
bool | rcv
| 受信フラグ
void(*) | userCallBack (bool)
| コールバック関数

## 関数

void twi::init | ( | unsigned int | sclkMHz | ) |

TWI初期化関数

引数:

  | sclkMHz | ADSP-BF537のSCLK周波数をMHz単位で指定する。133MHzのときには、133を指定する。

この関数は、ADSP-BF537の内蔵TWIを初期化する。最初にsclkパラメータを 元にプリスケーラーを設定する。次にデバイダを設定して、TWIのビット クロックを10kHzにする。

TWIはマスターに設定する。割込みは、データ送受信のほか、送受信完了(MCOMP)割込みも 許可する。

twi.cpp の 69 行で定義されています。

参照元 main().

    00070     {
    00071         *pTWI_CONTROL = TWI_ENA | (sclkMHz / 10);     // TWI内部クロックを10MHzに設定
    00072         *pTWI_CLKDIV = CLKHI(50) | CLKLOW(50);        // Hihg/Low期間を250クロックに設定。およそ20kHzクロック
    00073         *pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;         // FIFOをフラッシュ
    00074                 // 注意: 8bitデータ転送の場合、FIFOの設定は必ずXMTINTLEN=1, RCVINTLEN=0と
    00075                 // すること。この場合、送信はFIFOが空なら割り込み、受信はFIFOが空で
    00076                 // ないなら割り込みがかかる。この設定では送信FIFOのアンダーラン余裕が
    00077                 // 減るが、repeated startの条件(最後の送信割り込みでDCNT=0のときMDIR反転)
    00078                 // を満たすためには仕方がない。アンダーラン余裕は減ったといっても1byte送信
    00079                 // 時間分の余裕はある。400kbpsのとき、これは20uSである。
    00080         *pTWI_FIFO_CTL = XMTINTLEN;                   // 受信:1バイトでもデータがあれば割り込み。送信:バッファが空なら割り込み
    00081         *pTWI_SLAVE_CTL = 0;                          // スレーブ機能をディセーブル
    00082         *pSIC_IMASK |= IRQ_TWI;
    00083     }

bool twi::ISR | ( | void |  | ) |

割込みハンドラ

戻り値:
  割込みがTWI由来のものであった場合には真を、そうでない場合には偽を返す。

TWIに関連する割り込みをすべて処理する。、

twi.cpp の 89 行で定義されています。

参照先 countToBeTransfer, dataPtr, nextAddress, nextPtr, nextTransfer, rcv, readAsync(), transferedCount, と userCallBack.

参照元 cec::ivg8().

    00090     {
    00091         unsigned int istat;
    00092
    00093         if ( *pSIC_ISR & IRQ_TWI ){                         // TWI割り込みか
    00094             istat = *pTWI_INT_STAT;                         // 割込み状況の取得
    00095             if ( istat & XMTSERV ) {                        // 送信割り込みか
    00096                 if ( countToBeTransfer == transferedCount ){// 全部送信したか
    00097                     *pTWI_INT_MASK &= ~XMTSERV;             // 送信割り込み禁止
    00098                     if ( nextAddress )                      // これはrepeated Startを使うか
    00099                        *pTWI_MASTER_CTL |= MDIR;            // 転送方向を受信に
    00100                 }
    00101                 else {                                      // まだ送信が終わっていない
    00102                     *pTWI_XMT_DATA8 = *(dataPtr++);         // 1バイト転送
    00103                     transferedCount ++;                     // 転送バイト数更新
    00104                 }
    00105                 *pTWI_INT_STAT = XMTSERV;                   // 送信割り込みクリア
    00106             }
    00107             else if ( istat & RCVSERV ) {                   // 受信割り込みか
    00108                 *(dataPtr++) = *pTWI_RCV_DATA8;             // 1バイト転送
    00109                 *pTWI_INT_STAT = RCVSERV;                   // 受信割り込みクリア
    00110                 transferedCount ++;                         // 転送バイト数更新
    00111             }
    00112             else if ( istat & MCOMP ){                      // データ転送完了か
    00113                 *pTWI_INT_STAT = MCOMP;                     // 割込みクリア
    00114                 *pTWI_INT_MASK &= ~(RCVSERV|XMTSERV|MCOMP); // 割り込みを禁止にする
    00115                 if ( rcv ){                                 // 受信か
    00116                     if ( *pTWI_FIFO_STAT & RCVSTAT ) {      // FIFOにデータが残っているか
    00117                         *(dataPtr++) = *pTWI_RCV_DATA8;     // 最後の受信バイトを取得する
    00118                         transferedCount ++;                 // 転送バイト数更新
    00119                     }
    00120                     if ( userCallBack )                     // 受信コールバックは必要か
    00121                         userCallBack(true);                 // コールバック呼び出し
    00122                 }
    00123                 else{                                       // 送信終了
    00124                     if ( nextAddress )                      // repoeated Startを使っているか
    00125                         readAsync( nextAddress, nextPtr, nextTransfer, userCallBack );
    00126                     else if ( userCallBack )                // 送信コールバックは必要か
    00127                         userCallBack(false);                // コールバック呼び出し
    00128                 }
    00129             }
    00130             ssync();
    00131             return true;                                    // 割込み処理を行ったことを知らせる
    00132         }                                                   // TWI割り込み処理終わり
    00133         else
    00134             return false;                                   // 割込み処理を行わなかった
    00135     }

void twi::readAsync | ( | unsigned char | address,
|  | unsigned char | data[],
|  | unsigned int | count,
|  | void(*)(bool) | callback |
| ) |  |  |

TWIデバイスからの非同期書読み込み

引数:

  | address | 読み込みを行うデバイスの7bit TWIアドレス。
  | data | 読み込むデータの受信バッファ
  | count | 読み込むデータ数。単位はバイト。
  | callback | 受信完了割り込み時に呼び出されるコールバック関数。NULLを指定すると何も呼び出されない。

指定されたデバイスからの読み込みを行う。この関数は、デバイスへの読み込みを 内蔵TWIに指示すると、直ちに呼び出し元に戻る。デバイスへの読みこみが完了すると パラメータで指定したcallback関数が呼び出される。callback関数が呼ばれるまで、 呼び出し側はdata[]の内容を読み出してはならない。

twi.cpp の 137 行で定義されています。

参照先 countToBeTransfer, dataPtr, nextAddress, rcv, transferedCount, と userCallBack.

参照元 ISR().

    00143     {
    00144         rcv = true;                         // 受信
    00145         nextAddress = 0;                    // Repeated Startを使わない。
    00146         countToBeTransfer = count;          // 受信するデータ数
    00147         dataPtr = (unsigned char *)data;    // バッファ・ポインタをセット
    00148         userCallBack = callback;            // コールバック関数をセット
    00149         *pTWI_INT_MASK = 0;                 // 割り込みを一時禁止
    00150         *pTWI_MASTER_ADDR = address;        // 7bit アドレスを設定
    00151         transferedCount = 0;                // 受信済みデータ数
    00152         *pTWI_MASTER_CTL = MEN | MDIR | DCNT & ( count << 6 ); // マスターモード、受信、アドレス設定
    00153         *pTWI_INT_MASK = RCVSERV | MCOMP;   // 割込みマスク設定
    00154     }

void twi::start | ( | void |  | ) |

TWIスタート関数

この関数はダミー

twi.cpp の 85 行で定義されています。

参照元 main().

    00086     {
    00087     }

void twi::writeAsync | ( | unsigned char | address,
|  | const unsigned char | data[],
|  | unsigned int | count,
|  | void(*)(bool) | callback |
| ) |  |  |

TWIデバイスへの非同期書きこみ

引数:

  | address | 書き込みを行うデバイスの7bit TWIアドレス。
  | data | 書き込むデータの配列
  | count | 書きこみデータ数。単位はバイト。
  | callback | 送信完了割り込み時に呼び出されるコールバック関数。NULLを指定すると何も呼び出されない。

指定されたデバイスへの書き込みを行う。この関数は、デバイスへの書き込みを 内蔵TWIに指示すると、直ちに呼び出し元に戻る。デバイスへの書きこみが完了すると パラメータで指定したcallback関数が呼び出される。callback関数が呼ばれるまで、 呼び出し側はdata[]の内容を変更してはならない。

twi.cpp の 191 行で定義されています。

参照先 nextAddress, と writeAsyncSub().

参照元 ad7998::start().

    00197     {
    00198         nextAddress = 0;                    // Repeated Startを使わない。
    00199         *pTWI_MASTER_CTL = 0;               // Repeated Startを使わない
    00200                                             // 主処理
    00201         writeAsyncSub( address, data, count, callback );
    00202     }

void twi::writeAsyncSub | ( | unsigned char | address,
|  | const unsigned char | data[],
|  | unsigned int | count,
|  | void(*)(bool) | callback |
| ) |  |  |

writeAsyncの下請け関数

引数:

  | address | 書き込みを行うデバイスの7bit TWIアドレス。
  | data | 書き込むデータの配列
  | count | 書きこみデータ数。単位はバイト。
  | callback | 送信完了割り込み時に呼び出されるコールバック関数。NULLを指定すると何も呼び出されない。

I2C送信の処理実体。 twi::writeAsyncと twi::writeReadAsyncは、 repeated Startに関する設定を行った後、残りの処理をこの関数に 丸投げする。

writeAsync関数は、I2Cデバイスアドレスを設定後、最初の1バイトを FIFOに書き込んでから送信をイネーブルにする。

twi.cpp の 170 行で定義されています。

参照先 countToBeTransfer, dataPtr, rcv, transferedCount, と userCallBack.

参照元 writeAsync(), と writeReadAsync().

    00176     {
    00177         rcv = false;                        // 送信
    00178         countToBeTransfer = count;          // 送信するデータ数
    00179         dataPtr = (unsigned char *)data;    // バッファ・ポインタをセット
    00180         userCallBack = callback;            // コールバック関数をセット
    00181         *pTWI_INT_MASK = 0;                 // 割り込みを一時禁止
    00182         *pTWI_MASTER_ADDR = address;        // 7bit アドレスを設定
    00183         *pTWI_XMT_DATA8 = *(dataPtr++);     // 最初の1バイトを転送
    00184         transferedCount = 1;                // 送信済みデータ数
    00185
    00186         *pTWI_MASTER_CTL |= MEN | DCNT & ( count << 6 ); // マスターモード、送信、アドレス設定
    00187         *pTWI_INT_MASK = XMTSERV | MCOMP;   // 割込みマスク設定
    00188     }

void twi::writeReadAsync | ( | unsigned char | wAddress,
|  | const unsigned char | wData[],
|  | unsigned int | wCount,
|  | unsigned char | rAddress,
|  | const unsigned char | rData[],
|  | unsigned int | rCount,
|  | void(*)(bool) | callback |
| ) |  |  |

TWIデバイスへの非同期書き込み/読み込み

引数:

  | wAddress | 書き込みを行うデバイスの7bit TWIアドレス。
  | wData | 書き込むデータの配列
  | wCount | 書きこみデータ数。単位はバイト。
  | rAddress | 読み込みを行うデバイスの7bit TWIアドレス。
  | rData | 読み込むデータの受信バッファ
  | rCount | 読み込むデータ数。単位はバイト。
  | callback | 送信完了割り込み時に呼び出されるコールバック関数。NULLを指定すると何も呼び出されない。

指定されたデバイスへの書き込みを行う。この関数は、デバイスへの書き込みを 内蔵TWIに指示すると、直ちに呼び出し元に戻る。デバイスへの書きこみが完了すると ただちに読み出しを行う。読み出しが終了したら。 パラメータで指定したcallback関数が呼び出される。callback関数が呼ばれるまで、 呼び出し側はdata[]の内容を変更してはならない。

twi.cpp の 204 行で定義されています。

参照先 nextAddress, nextPtr, nextTransfer, と writeAsyncSub().

参照元 ad7998::callBack().

    00213     {
    00214         nextTransfer = rCount;              // Repeated Start後の受信データ数
    00215         nextPtr = (unsigned char *)rData;   // Repeated Start後の受信バッファ
    00216         nextAddress = rAddress;             // Repeated Start後の受信デバイスアドレス
    00217         *pTWI_MASTER_CTL = RSTART;          // Repeated Startを使う
    00218                                             // 主処理
    00219         writeAsyncSub( wAddress, wData, wCount, callback );
    00220     }

## 変数

unsigned int twi::countToBeTransfer

転送するバイト数

進行中の送信、あるいは受信における総転送バイト数。

twi.cpp の 48 行で定義されています。

参照元 ISR(), readAsync(), と writeAsyncSub().

unsigned char* twi::dataPtr

データ転送バッファ・アドレス

次に送信するデータのアドレス、あるいは受信データを格納するバッファのアドレス。

twi.cpp の 21 行で定義されています。

参照元 ISR(), readAsync(), と writeAsyncSub().

unsigned char twi::nextAddress = 0

Repeated Start後のデバイス・アドレス

現在の転送の終了後にRepeated Startを行う場合は、次の転送を行うTWIデバイスの アドレスをこの変数に格納する。Repeated Startを行うか否かの判断にも使うので Repeated Startを使わない場合は必ず0にセットする。

twi.cpp の 36 行で定義されています。

参照元 ISR(), readAsync(), writeAsync(), と writeReadAsync().

unsigned char* twi::nextPtr

Repeated Start後に使うバッファ・アドレス

現在の転送の終了後にRepeated Startを行う場合は、次の転送を行うバッファの アドレスをこの変数に格納する。

twi.cpp の 28 行で定義されています。

参照元 ISR(), と writeReadAsync().

unsigned int twi::nextTransfer

Repeated Start後の転送バイト数

現在の転送の終了後にRepeated Startを行う場合は、 次の転送での送信、あるいは受信における総転送バイト数。

twi.cpp の 55 行で定義されています。

参照元 ISR(), と writeReadAsync().

bool twi::rcv

受信フラグ

現在の転送が受信ならば真、送信ならば偽

twi.cpp の 61 行で定義されています。

参照元 ISR(), readAsync(), と writeAsyncSub().

unsigned int twi::transferedCount

転送済みバイト数

進行中の送信、あるいは受信データ数を数える。

twi.cpp の 42 行で定義されています。

参照元 ISR(), readAsync(), と writeAsyncSub().

void( * ) twi::userCallBack(bool)

コールバック関数

現在の転送が受信ならば真、送信ならば偽

twi.cpp の 67 行で定義されています。

参照元 ISR(), readAsync(), と writeAsyncSub().