■はじめてまじめに使ってみたTWIモジュール、最初は変則的な通信をするチップには使えないかと思っていたのですが、きちんきちんと手順を踏むとちゃんと通信できることが解りました。「変則的なチップ」と思っていたのは秋月電子から購入したリアルタイムクロックで、このプロトコルの中に一旦読み出しレジスタ番号を書き込んでからストップビットなしにスタートビットと読み出しフラグを立てたアドレスを送り出すシーケンスがあって、そこに標準的なI2Cプロトコルは使えない…と思っていたのでした。
このRTCモジュールは以前も使ったことがあって、その時は自前のI2Cライブラリを使ったので問題なく対応できたのですが、それをペリフェラルでやってみたところ最初はダメでした。ただ、そのあとちゃんと手順を確認して、つまりはデバッグをやったらペリフェラルでもできたので、別に何の問題もないのでした。
I2Cのライブラリは拾いものでも十分使えるものなのですが、使うには不便なところもあったので、本筋からはずれる部分ですがビットレート設定を計算せずに使えるようにしてみました。
I2Cの初期設定する前に使えばよいので、どのライブラリでも使えるでしょう。設定したいビットレート(上限400Kbit/Sec)を指定するとTWBRの設定値とプリスケーラー値を戻します。
#define CPU_MASTER_FREQ 8000000
#define TWI_PORT PORTC
BOOL i2cCalcRate( unsigned long sclFreq,
unsigned char *vTWBR,
unsigned char *presc)
{
unsigned long wk,i;
*vTWBR = 255;
*presc = 3;
//Freq Limit: 400KHz(400Kbit/Sec) (I2C FastMode)
if (sclFreq > 400000){
return false;
}
wk = (CPU_MASTER_FREQ/sclFreq - 16 ) / 2;
for(i = 1; i < 4; i++){
if(wk < 256){
*vTWBR = (unsigned char)(wk);
*presc = i;
return true;
}
wk /= 4;
}
return false;
}