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を指定する。 |
TWIはマスターに設定する。割込みは、データ送受信のほか、送受信完了(MCOMP)割込みも 許可する。
参照元 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 | ) |
割込みハンドラ
参照先 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を指定すると何も呼び出されない。 |
参照先 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::writeAsync | ( | unsigned char | address, | |
const unsigned char | data[], | |||
unsigned int | count, | |||
void(*)(bool) | callback | |||
) |
TWIデバイスへの非同期書きこみ
address | 書き込みを行うデバイスの7bit TWIアドレス。 | |
data | 書き込むデータの配列 | |
count | 書きこみデータ数。単位はバイト。 | |
callback | 送信完了割り込み時に呼び出されるコールバック関数。NULLを指定すると何も呼び出されない。 |
参照先 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を指定すると何も呼び出されない。 |
writeAsync関数は、I2Cデバイスアドレスを設定後、最初の1バイトを FIFOに書き込んでから送信をイネーブルにする。
参照先 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を指定すると何も呼び出されない。 |
参照先 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 |
unsigned char* twi::dataPtr |
データ転送バッファ・アドレス
次に送信するデータのアドレス、あるいは受信データを格納するバッファのアドレス。
unsigned char twi::nextAddress = 0 |
Repeated Start後のデバイス・アドレス
現在の転送の終了後にRepeated Startを行う場合は、次の転送を行うTWIデバイスの アドレスをこの変数に格納する。Repeated Startを行うか否かの判断にも使うので Repeated Startを使わない場合は必ず0にセットする。
unsigned char* twi::nextPtr |
Repeated Start後に使うバッファ・アドレス
現在の転送の終了後にRepeated Startを行う場合は、次の転送を行うバッファの アドレスをこの変数に格納する。
参照元 ISR()・writeReadAsync().
unsigned int twi::nextTransfer |
Repeated Start後の転送バイト数
現在の転送の終了後にRepeated Startを行う場合は、 次の転送での送信、あるいは受信における総転送バイト数。
参照元 ISR()・writeReadAsync().
bool twi::rcv |
unsigned int twi::transferedCount |
void( * ) twi::userCallBack(bool) |