MCP23017 へのアクセスを 2バイト単位で行う。
内容:
2バイトアクセス用の関数を追加する。
ライト時、
Wire.write((byte *)data,length) ; で データを送信。
リード時、
Wire.requestFrom(address, count) ; で coount を 2 にしてデータを要求し、
Wire.read() ; で2回 データを受信。
例:
前回「ESP32/arduino:I2CでMCP23017を接続」のアクセスの一部を2バイトアクセスに変更。
/* * i2c_test */ #include <Wire.h> byte MCP23017 = 0x21 ; // slave address byte IODIRA = 0x00 ; // IODIRA Register Address byte IODIRB = 0x01 ; // IODIRB Register Address byte GPPUA = 0x0C ; // GPPUA Register Address byte GPPUB = 0x0D ; // GPPUA Register Address byte GPIOA = 0x12 ; // GPIOA Register Address byte GPIOB = 0x13 ; // GPIOA Register Address void I2C_BWR(byte TGT, byte REGADR, byte DATA) { Wire.beginTransmission(TGT); // transmit to device #TGT Wire.write(REGADR); // send REG address (REGADR) Wire.write(DATA); // send write data (DATA) Wire.endTransmission(); // end transmit } byte I2C_BRD(byte TGT,byte REGADR) { byte data = 0 ; Wire.beginTransmission(TGT); // transmit to device #TGT Wire.write(REGADR); // send REG address (REGADR) Wire.endTransmission(); // end transmit Wire.requestFrom(TGT, 1); // request 1 byte from slave device #TGT data = Wire.read(); // receive 1 byte return data ; } void I2C_2BWR(byte TGT, byte REGADR, short DATA) { Wire.beginTransmission(TGT); // transmit to device #TGT Wire.write(REGADR); // send REG address (REGADR) Wire.write((byte *)&DATA,2); // send write data (DATA) Wire.endTransmission(); // end transmit } short I2C_2BRD(byte TGT,byte REGADR) { byte data[2] ; Wire.beginTransmission(TGT); // transmit to device #TGT Wire.write(REGADR); // send REG address (REGADR) Wire.endTransmission(); // end transmit Wire.requestFrom(TGT, 2); // request 1 byte from slave device #TGT data[0] = Wire.read(); // receive 1 byte data[1] = Wire.read(); // receive 1 byte return *(short *)data ; } void setup() { byte DATA = 0 ; // for data byte error = 0xff ; Wire.begin(); Serial.begin(115200); // while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C test"); // set direction IOA,IOB I2C_BWR(MCP23017,IODIRA,0xFE) ; // set IOA0 : output I2C_BWR(MCP23017,IODIRB,0x7F) ; // set IOB7 : output I2C_BWR(MCP23017,GPPUA,0x80) ; // set IOA7 : PullUp } void loop() { byte DATA ; unsigned short DT2 ; DATA = I2C_BRD(MCP23017,GPIOA) ; if ( (DATA & 0x80) == 0x00 ) { I2C_2BWR(MCP23017,GPIOA,0x0001) ; DATA = I2C_BRD(MCP23017,GPIOA) ; Serial.print("REG GPIOA : 0x"); Serial.println(DATA, HEX); DATA = I2C_BRD(MCP23017,GPIOB) ; Serial.print("REG GPIOB : 0x"); Serial.println(DATA, HEX); DT2 = I2C_2BRD(MCP23017,GPIOA) ; Serial.print("REG GPIO : 0x"); Serial.println(DT2, HEX); Serial.println(""); delay(2000); // wait 2 seconds for next I2C_2BWR(MCP23017,GPIOA,0x8000) ; DATA = I2C_BRD(MCP23017,GPIOA) ; Serial.print("REG GPIOA : 0x"); Serial.println(DATA, HEX); DATA = I2C_BRD(MCP23017,GPIOB) ; Serial.print("REG GPIOB : 0x"); Serial.println(DATA, HEX); DT2 = I2C_2BRD(MCP23017,GPIOA) ; Serial.print("REG GPIO : 0x"); Serial.println(DT2, HEX); Serial.println(""); delay(2000); // wait 2 seconds for next } else { I2C_BWR(MCP23017,GPIOA,0x00) ; // set IOA0 = L I2C_BWR(MCP23017,GPIOB,0x00) ; // set IOB7 = L delay(4000); // wait 4 seconds for next } }
以下、覚書など。
( 行# 36~41 )
2バイトアクセス用ライト関数。
ショートバイトで受け取ったデータのポインタを バイトデータのポインタをとして
Wire.write() に与える。 length は 2
( 行# 43~53 )
2バイトアクセス用リード関数。
Wire.requestFrom(address, count) ; の count を 2 で実行後、2回 Wire.read() を実行。
( 行# 81,96 )
2バイトライト実行。
ライトデータは、
[15:8] に IOB (アドレス ***1),
[7:0] に IOA(アドレス ***0)
の値をセット。
( 行# 89~92, 104~107 )
2バイトリード実行。
シリアルモニタに出力。
0 件のコメント:
コメントを投稿