RX62N用のi2c通信プログラムです。割り込みを利用しません。
- /*
- Interface 2011年6月号を参考にして作成したIIC通信プログラム
- 割込みを使用しない
- */
- #include "iodefine.h"
- /*
- RIICの初期化
- 引数 無し
- 戻り値 無し
- */
- void initRIIC0(void)
- {
- MSTP(RIIC0) = 0; // モジュールスタンバイ解除
- RIIC0.ICCR1.BIT.ICE = 0;
- /* set port direction to input */
- PORT1.DDR.BIT.B3 = 0; // SDA0
- PORT1.DDR.BIT.B2 = 0; // SCL0
- /* enable input buffer */
- PORT1.ICR.BIT.B3 = 1; // SDA0
- PORT1.ICR.BIT.B2 = 1; // SCL0
- /* オープンドレイン設定 いらない?*/
- PORT1.ODR.BIT.B3 = 1;
- PORT1.ODR.BIT.B2 = 1;
- /* RIIC disable for RIIC initial */
- RIIC0.ICCR1.BIT.ICE = 0;
- RIIC0.ICCR1.BIT.IICRST = 1; // リセットパルス発生
- RIIC0.ICCR1.BIT.IICRST = 0;
-
- /* Set baud rate */
- RIIC0.ICMR1.BIT.CKS = 4; // IIC phi = PCLK/8 clock
- RIIC0.ICBRH.BIT.BRH = 25; // 100kbps (PCLK = 48MHz)
- RIIC0.ICBRL.BIT.BRL = 25;
- /* disable all address detection. Master mode only. */
- RIIC0.ICSER.BYTE = 0x00;
- /* ACKWP is protect bit for ACKBT */
- RIIC0.ICMR3.BIT.ACKWP = 1; // disable protect for ACKBT
- RIIC0.ICCR1.BIT.ICE = 1; // enable RIIC
- }
- /*
- バスフリーの確認
- 引数 無し
- 戻り値 無し
- */
- inline void i2cBusFree(void)
- {
- while(RIIC0.ICCR2.BIT.BBSY == 1);
- }
- /*
- バス・スタートを実行
- 引数 無し
- 戻り値 無し
- */
- inline void i2cStart(void)
- {
- RIIC0.ICCR2.BIT.ST = 1;
- while(RIIC0.ICSR2.BIT.START != 1);
- RIIC0.ICSR2.BIT.START = 0;
- }
- /*
- バスがBusy中にバス・スタート
- 引数 無し
- 戻り値 無し
- */
- inline void i2cReStart(void)
- {
- RIIC0.ICCR2.BIT.RS = 1;
- while(RIIC0.ICSR2.BIT.START != 1);
- RIIC0.ICSR2.BIT.START = 0;
- }
- /*
- バス・ストップを実行
- 引数 無し
- 戻り値 無し
- */
- inline void i2cStop(void)
- {
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICCR2.BIT.SP = 1;
- while(RIIC0.ICSR2.BIT.STOP != 1);
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICSR2.BIT.NACKF = 0;
- }
- /*
- デバイスに1byteデータ転送
- 引数 送信データ
- 戻り値 無し
- */
- inline void i2cSendByte(unsigned char data)
- {
- while(RIIC0.ICSR2.BIT.TDRE != 1);
- RIIC0.ICDRT = data;
- }
- /*
- データの転送完了を確認
- 引数 無し
- 戻り値 無し
- */
- inline void i2cCheckTEND(void)
- {
- while(RIIC0.ICSR2.BIT.TEND != 1);
- }
- /*
- デバイスから1byte読み取りバスストップを実行
- 引数 無し
- 戻り値 デバイスから読み取ったデータ
- */
- unsigned char i2cReceiveByteStop(void)
- {
- unsigned char rdt;
- while(RIIC0.ICSR2.BIT.RDRF != 1);
- RIIC0.ICMR3.BIT.WAIT = 1;
- RIIC0.ICMR3.BIT.ACKBT = 1;
- rdt = RIIC0.ICDRR; //dummy read
- while(RIIC0.ICSR2.BIT.RDRF != 1);
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICCR2.BIT.SP = 1; //stop
- rdt = RIIC0.ICDRR; //data read
- RIIC0.ICMR3.BIT.WAIT = 0;
- while(RIIC0.ICSR2.BIT.STOP != 1);
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICSR2.BIT.NACKF = 0;
- return rdt;
- }
- /*
- スレーブ・アドレスを指定してデバイスのレジスタ・メモリにデータを書き込む
- 引数 sadr : スレーブ・アドレス
- madr : レジスタ・メモリアドレス
- data : 書き込むデータ
- 戻り値 無し
- */
- void i2cDevWrite(unsigned char sadr, unsigned char madr, unsigned char data)
- {
- i2cBusFree();
- i2cStart();
- i2cSendByte(sadr);
- i2cSendByte(madr);
- i2cSendByte(data);
- i2cCheckTEND();
- i2cStop();
- }
- /*
- スレーブアドレスとデバイスのレジスタ・アドレスを指定してデバイスからデータを読み込む
- 引数 sadr : スレーブ・アドレス
- madr : レジスタ・メモリアドレス
- 戻り値 読み込んだデバイスのデータ
- */
- unsigned char i2cDevRead(unsigned char sadr, unsigned char madr)
- {
- unsigned char rdt;
- i2cBusFree();
- i2cStart();
- i2cSendByte(sadr);
- i2cSendByte(madr);
- i2cCheckTEND();
- i2cReStart();
- i2cSendByte(sadr | 0x01);
- rdt = i2cReceiveByteStop();
- return rdt;
- }
- /*
- スレーブアドレスを指定して複数byteのデータを送信する
- 引数 sadr : スレーブアドレス
- databuff: 送信するデータの入った配列
- datanum : 送信するデータ数
- 戻り値 0 : 送信完了 -1 : 送信エラー
- */
- int i2cSendData(unsigned char sadr, const unsigned char databuff[], int datanum)
- {
- int senddata=-1,ret=-1;
-
- i2cBusFree();
- i2cStart();
- while(senddata<datanum) {
- if(RIIC0.ICSR2.BIT.NACKF != 0) goto sendstop; //送信エラー
- if(RIIC0.ICSR2.BIT.TDRE != 1) continue;
- if(senddata < 0) {
- RIIC0.ICDRT = sadr; //最初にアドレスを送信
- } else {
- RIIC0.ICDRT = databuff[senddata];
- }
- senddata++;
- }
- i2cCheckTEND();
- ret = 0; //送信完了
- sendstop:
- i2cStop();
- return ret;
- }
- /*
- スレーブアドレスを指定して複数byteのデータを受信する
- 引数 sadr : スレーブアドレス
- databuff: 受信したデータを入れる配列
- datanum : 受信するデータ数
- 戻り値 0 : 受信完了 -1 : 受信エラー
- */
- int i2cReceiveData(unsigned char sadr, unsigned char databuff[], int datanum)
- {
- int recvdata=0,ret=-1;
- unsigned char dummy;
-
- i2cBusFree();
- i2cStart();
- i2cSendByte(sadr | 0x01); // アドレス送信 受信設定(|0x01)
- i2cCheckTEND();
- if(datanum == 1 ) {
- databuff[0] = i2cReceiveByteStop();
- return 0;
- }
- if(RIIC0.ICSR2.BIT.NACKF == 0) {
- /* データ受信処理 */
- dummy = RIIC0.ICDRR; //dummy read
- while(recvdata < datanum) {
- if(RIIC0.ICSR2.BIT.RDRF != 1) continue;
- if(recvdata == (datanum-2) ) break;
- if(recvdata == (datanum-3) ) {
- RIIC0.ICMR3.BIT.WAIT = 1;
- }
- databuff[recvdata++] = RIIC0.ICDRR;
- }
- RIIC0.ICMR3.BIT.ACKBT = 1;
- databuff[recvdata++] = RIIC0.ICDRR;
- while(RIIC0.ICSR2.BIT.RDRF != 1);
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICCR2.BIT.SP = 1;
- databuff[recvdata++] = RIIC0.ICDRR;
- RIIC0.ICMR3.BIT.WAIT = 0;
- ret = 0;
- } else {
- /* 受信エラー */
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICCR2.BIT.SP = 1;
- dummy = RIIC0.ICDRR; //dummy read
- }
- while(RIIC0.ICSR2.BIT.STOP != 1);
- RIIC0.ICSR2.BIT.STOP = 0;
- RIIC0.ICSR2.BIT.NACKF = 0;
-
- return ret;
- }
※コメント投稿者のブログIDはブログ作成者のみに通知されます