RP2040: Only bitbang 0-byte writes

The I2C.c for RP2040 included a special case for writes <=2 bytes to match the MicroPython implementation,
however RP2040 does support 1 and 2 byte reads, with only 0 bytes being the exception.

Signed-off-by: Philip Howard <phil@pimoroni.com>
This commit is contained in:
Phil Howard 2021-03-10 19:58:09 +00:00
parent bfc8c89536
commit b8d4f9655f

View File

@ -98,7 +98,12 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
} }
#endif #endif
// Create a bitbangio.I2C object to do short writes. // Create a bitbangio.I2C object to do 0 byte writes.
//
// These are used to non-invasively detect I2C devices by sending
// the address and confirming an ACK.
// They are not supported by the RP2040 hardware.
//
// Must be done before setting up the I2C pins, since they will be // Must be done before setting up the I2C pins, since they will be
// set up as GPIO by the bitbangio.I2C object. // set up as GPIO by the bitbangio.I2C object.
// //
@ -157,9 +162,9 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
} }
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
const uint8_t *data, size_t len, bool transmit_stop_bit) { const uint8_t *data, size_t len, bool transmit_stop_bit) {
if (len <= 2) { if (len == 0) {
// The RP2040 I2C peripheral will not do writes 2 bytes or less long. // The RP2040 I2C peripheral will not perform 0 byte writes.
// So use bitbangio.I2C to do the write. // So use bitbangio.I2C to do the write.
gpio_set_function(self->scl_pin, GPIO_FUNC_SIO); gpio_set_function(self->scl_pin, GPIO_FUNC_SIO);