Skip to content

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

Open
@ithinuel

Description

@ithinuel

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;
}

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions