8000 fix #1422 correct i2c max xfer len (size in bits) · tannewt/circuitpython@a4ee808 · GitHub
[go: up one dir, main page]

Skip to content

Commit a4ee808

Browse files
committed
fix micropython#1422 correct i2c max xfer len (size in bits)
1 parent e699d10 commit a4ee808

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

ports/nrf/common-hal/busio/I2C.c

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,21 @@
3737
#include "nrfx_spim.h"
3838
#include "nrf_gpio.h"
3939

40+
// all TWI instances have the same max size
41+
// 16 bits for 840, 10 bits for 810, 8 bits for 832
42+
#define I2C_MAX_XFER_LEN ( 1UL << TWIM0_EASYDMA_MAXCNT_SIZE)
43+
4044
STATIC twim_peripheral_t twim_peripherals[] = {
4145
#if NRFX_CHECK(NRFX_TWIM0_ENABLED)
4246
// SPIM0 and TWIM0 share an address.
4347
{ .twim = NRFX_TWIM_INSTANCE(0),
44-
.in_use = false,
45-
.max_xfer_size = TWIM0_EASYDMA_MAXCNT_SIZE,
48+
.in_use = false
4649
},
4750
#endif
4851
#if NRFX_CHECK(NRFX_TWIM1_ENABLED)
4952
// SPIM1 and TWIM1 share an address.
5053
{ .twim = NRFX_TWIM_INSTANCE(1),
51-
.in_use = false,
52-
.max_xfer_size = TWIM1_EASYDMA_MAXCNT_SIZE,
54+
.in_use = false
5355
},
5456
#endif
5557
};
@@ -198,49 +200,51 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
198200
}
199201

200202
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool stopBit) {
201-
if(len == 0)
203+
if(len == 0) {
202204
return common_hal_busio_i2c_probe(self, addr) ? 0 : MP_ENODEV;
205+
}
203206

204-
const uint32_t max_xfer_size = self->twim_peripheral->max_xfer_size;
205-
const uint32_t parts = len / max_xfer_size;
206-
const uint32_t remainder = len % max_xfer_size;
207207
nrfx_err_t err = NRFX_SUCCESS;
208208

209209
nrfx_twim_enable(&self->twim_peripheral->twim);
210210

211-
for (uint32_t i = 0; i < parts; ++i) {
212-
err = nrfx_twim_tx(&self->twim_peripheral->twim, addr, data + i * max_xfer_size, max_xfer_size, !stopBit);
213-
if (err != NRFX_SUCCESS)
211+
// break into MAX_XFER_LEN transaction
212+
while ( len ) {
213+
const size_t xact_len = MIN(len, I2C_MAX_XFER_LEN);
214+
215+
if ( NRFX_SUCCESS != (err = nrfx_twim_tx(&self->twim_peripheral->twim, addr, data, xact_len, !stopBit)) ) {
214216
break;
215-
}
217+
}
216218

217-
if ((remainder > 0) && (err == NRFX_SUCCESS))
218-
err = nrfx_twim_tx(&self->twim_peripheral->twim, addr, data + parts * max_xfer_size, remainder, !stopBit);
219+
len -= xact_len;
220+
data += xact_len;
221+
}
219222

220223
nrfx_twim_disable(&self->twim_peripheral->twim);
221224

222225
return twi_error_to_mp(err);
223226
}
224227

225228
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) {
226-
if(len == 0)
229+
if(len == 0) {
227230
return 0;
231+
}
228232

229-
const uint32_t max_xfer_size = self->twim_peripheral->max_xfer_size;
230-
const uint32_t parts = len / max_xfer_size;
231-
const uint32_t remainder = len % max_xfer_size;
232233
nrfx_err_t err = NRFX_SUCCESS;
233234

234235
nrfx_twim_enable(&self->twim_peripheral->twim);
235236

236-
for (uint32_t i = 0; i < parts; ++i) {
237-
err = nrfx_twim_rx(&self->twim_peripheral->twim, addr, data + i * max_xfer_size, max_xfer_size);
238-
if (err != NRFX_SUCCESS)
237+
// break into MAX_XFER_LEN transaction
238+
while ( len ) {
239+
const size_t xact_len = MIN(len, I2C_MAX_XFER_LEN);
240+
241+
if ( NRFX_SUCCESS != (err = nrfx_twim_rx(&self->twim_peripheral->twim, addr, data, xact_len)) ) {
239242
break;
240-
}
243+
}
241244

242-
if ((remainder > 0) && (err == NRFX_SUCCESS))
243-
err = nrfx_twim_rx(&self->twim_peripheral->twim, addr, data + parts * max_xfer_size, remainder);
245+
len -= xact_len;
246+
data += xact_len;
247+
}
244248

245249
nrfx_twim_disable(&self->twim_peripheral->twim);
246250

ports/nrf/common-hal/busio/I2C.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
typedef struct {
3535
nrfx_twim_t twim;
3636
bool in_use;
37-
uint8_t max_xfer_size;
3837
} twim_peripheral_t;
3938

4039
typedef struct {

0 commit comments

Comments
 (0)
0