pico-examples icon indicating copy to clipboard operation
pico-examples copied to clipboard

The pio_i2c example's write operation corrupt every subsequent transaction.

Open ithinuel opened this issue 4 years ago • 2 comments

Tested using an NXP LM75B temperature sensor.

Minimal code to reproduce:

#include <stdio.h>

#include "pico/stdlib.h"
#include "pio_i2c.h"

#define PIN_SDA 20
#define PIN_SCL 21

// data must be at least 2 bytes long.
void print_temperature(uint8_t *data) {
    int16_t data_i16 = ((int16_t)data[0]) << 8 | (data[1] & 0xE0);
    float temp = (float)data_i16 * 0.125;
    printf("%0.2fC\n", temp);
}

int main() {
    stdio_init_all();

    PIO pio = pio0;
    uint sm = 0;
    uint offset = pio_add_program(pio, &i2c_program);
    i2c_program_init(pio, sm, offset, PIN_SDA, PIN_SCL);

    uint8_t data[2] = {0};
    // LM75B's default pointer is to temperature register.
    pio_i2c_read_blocking(pio, sm, 0x48, data, 2);
    print_temperature(data);

    // Set pointer register to Temperature register.
    data[0] = 0x0;
    pio_i2c_write_blocking(pio, sm, 0x48, data, 1);

    // Read again temperature now corrupted
    pio_i2c_read_blocking(pio, sm, 0x48, data, 2);
    print_temperature(data);

    printf("Done.\n");
    return 0;
}

ithinuel avatar Oct 19 '21 17:10 ithinuel

The issue seems to lie in the ISR's state after a write operation (where autopush is disabled but the ISR isn't cleared).

ithinuel avatar Oct 19 '21 21:10 ithinuel