|
| 1 | +/* |
| 2 | + * Wire_register_manipulations |
| 3 | + * |
| 4 | + * This is example showing how to read and write to registers of I2C devices. |
| 5 | + * |
| 6 | + * The example shows: |
| 7 | + * 1. Writing byte to register |
| 8 | + * 2. Reading byte from register (both blocking and non-blocking) |
| 9 | + * 3. Writing byte to register with verification |
| 10 | + * 4. Writing data block to registers (useful for FIFO buffers) |
| 11 | + * 5. Reading data block from registers (useful for FIFO buffers) |
| 12 | + * |
| 13 | + * Example is writen by Ivan Stefanov on 10 Sep 2023 |
| 14 | + */ |
| 15 | + |
| 16 | +#include <Wire.h> |
| 17 | + |
| 18 | +// Demo is made for USB Type-C port controller IC FUSB302B |
| 19 | +#define FUSB302_ADDR (0x22) // FUSB302B I2C address |
| 20 | +#define FUSB302_REG_R (0x01) // FUSB302B I2C register read-only |
| 21 | +#define FUSB302_REG_RW (0x02) // FUSB302B I2C register read/write |
| 22 | + |
| 23 | +void setup() { |
| 24 | + Wire.begin(); |
| 25 | + Wire.setClock(I2C_FAST_SPEED); |
| 26 | + delay(100); // I2C device power-up delay |
| 27 | + |
| 28 | + Serial.begin(115200); |
| 29 | + Serial.println("Wire library register manipulation functions example"); |
| 30 | + |
| 31 | + uint8_t test = 0; |
| 32 | + bool dev = false; |
| 33 | + |
| 34 | + /* Write and read byte from register */ |
| 35 | + |
| 36 | + // Write byte to device register |
| 37 | + Wire.registerWrite(FUSB302_ADDR, FUSB302_REG_RW, 0x64); |
| 38 | + Serial.print("Write to read/write register: "); |
| 39 | + Serial.println(0x64, HEX); |
| 40 | + |
| 41 | + // Read(blocking) byte from device register |
| 42 | + test = Wire.registerRead(FUSB302_ADDR, FUSB302_REG_RW); |
| 43 | + Serial.print("Read read/write register: "); |
| 44 | + Serial.println((unsigned int)test, HEX); |
| 45 | + |
| 46 | + // Write and verify byte to device register |
| 47 | + dev = Wire.registerWriteVerify(FUSB302_ADDR, FUSB302_REG_R, 0xC8); |
| 48 | + Serial.print("Write 0xC8 to read-only register > success: "); |
| 49 | + Serial.println(dev); |
| 50 | + |
| 51 | + // Read(non-blocking) byte from device register |
| 52 | + test = Wire.registerRead(FUSB302_ADDR, FUSB302_REG_R, false); |
| 53 | + Serial.print("Read read-only register: "); |
| 54 | + Serial.println((unsigned int)test, HEX); |
| 55 | + |
| 56 | + // Data to be writen to register block |
| 57 | + uint8_t arr[4] = {0}, dat[4] = {0x91, 0x64, 0xA4, 0x30}; |
| 58 | + |
| 59 | + /* Write and read 4 byte block */ |
| 60 | + |
| 61 | + // write data starting from read-only register followed by 3 read/write registers |
| 62 | + Wire.registerBlockWrite(FUSB302_ADDR, FUSB302_REG_R, dat, 4); |
| 63 | + Serial.print("Block write data: {0x91, 0x64, 0xA4, 0x30}\n"); |
| 64 | + |
| 65 | + // read data and print to serial monitor |
| 66 | + Wire.registerBlockRead(FUSB302_ADDR, FUSB302_REG_R, arr, sizeof(arr)); |
| 67 | + Serial.print("Block Read: "); |
| 68 | + for (size_t cnt = 0 ; cnt < 4 ; cnt++) { |
| 69 | + Serial.print((unsigned int)arr[cnt], HEX); |
| 70 | + Serial.print(", "); |
| 71 | + } |
| 72 | + Serial.print("\n"); |
| 73 | +} |
| 74 | + |
| 75 | +void loop() { |
| 76 | + // put your main code here, to run repeatedly: |
| 77 | + |
| 78 | +} |
0 commit comments