From e687fdbcbcd2c01e2617e2c519d0bc1183371cad Mon Sep 17 00:00:00 2001 From: blmorris Date: Fri, 11 Jul 2014 16:14:01 -0400 Subject: [PATCH] Add keyword argument 'memaddr_use_16b' to i2c.mem_read and mem_write methods to allow these methods to transmit 16 bit addresses to an i2c device Add 'memaddr_use_16b' to qstrdefsport.h --- stmhal/i2c.c | 21 +++++++++++++++++---- stmhal/qstrdefsport.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/stmhal/i2c.c b/stmhal/i2c.c index 9a616c6d62..604572c0f4 100644 --- a/stmhal/i2c.c +++ b/stmhal/i2c.c @@ -453,7 +453,7 @@ STATIC mp_obj_t pyb_i2c_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_arg } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_recv_obj, 1, pyb_i2c_recv); -/// \method mem_read(data, addr, memaddr, timeout=5000) +/// \method mem_read(data, addr, memaddr, timeout=5000, memaddr_use_16b=False) /// /// Read from the memory of an I2C device: /// @@ -461,6 +461,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_recv_obj, 1, pyb_i2c_recv); /// - `addr` is the I2C device address /// - `memaddr` is the memory location within the I2C device /// - `timeout` is the timeout in milliseconds to wait for the read +/// - `memaddr_use_16b` selects width of memaddr: 8 or 16 bits /// /// Returns the read data. /// This is only valid in master mode. @@ -469,6 +470,7 @@ STATIC const mp_arg_t pyb_i2c_mem_read_args[] = { { MP_QSTR_addr, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_memaddr, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 5000} }, + { MP_QSTR_memaddr_use_16b, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; #define PYB_I2C_MEM_READ_NUM_ARGS MP_ARRAY_SIZE(pyb_i2c_mem_read_args) @@ -490,8 +492,13 @@ STATIC mp_obj_t pyb_i2c_mem_read(uint n_args, const mp_obj_t *args, mp_map_t *kw // get the addresses mp_uint_t i2c_addr = vals[1].u_int << 1; mp_uint_t mem_addr = vals[2].u_int; + // determine width of mem_addr + mp_uint_t mem_addr_size = I2C_MEMADD_SIZE_8BIT; + if( vals[4].u_bool ) { + mem_addr_size = I2C_MEMADD_SIZE_16BIT; + } - HAL_StatusTypeDef status = HAL_I2C_Mem_Read(self->i2c, i2c_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, bufinfo.buf, bufinfo.len, vals[3].u_int); + HAL_StatusTypeDef status = HAL_I2C_Mem_Read(self->i2c, i2c_addr, mem_addr, mem_addr_size, bufinfo.buf, bufinfo.len, vals[3].u_int); if (status != HAL_OK) { // TODO really need a HardwareError object, or something @@ -507,7 +514,7 @@ STATIC mp_obj_t pyb_i2c_mem_read(uint n_args, const mp_obj_t *args, mp_map_t *kw } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_mem_read_obj, 1, pyb_i2c_mem_read); -/// \method mem_write(data, addr, memaddr, timeout=5000) +/// \method mem_write(data, addr, memaddr, timeout=5000, memaddr_use_16b=False) /// /// Write to the memory of an I2C device: /// @@ -515,6 +522,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_mem_read_obj, 1, pyb_i2c_mem_read); /// - `addr` is the I2C device address /// - `memaddr` is the memory location within the I2C device /// - `timeout` is the timeout in milliseconds to wait for the write +/// - `memaddr_use_16b` selects width of memaddr: 8 or 16 bits /// /// Returns `None`. /// This is only valid in master mode. @@ -537,8 +545,13 @@ STATIC mp_obj_t pyb_i2c_mem_write(uint n_args, const mp_obj_t *args, mp_map_t *k // get the addresses mp_uint_t i2c_addr = vals[1].u_int << 1; mp_uint_t mem_addr = vals[2].u_int; + // determine width of mem_addr + mp_uint_t mem_addr_size = I2C_MEMADD_SIZE_8BIT; + if( vals[4].u_bool ) { + mem_addr_size = I2C_MEMADD_SIZE_16BIT; + } - HAL_StatusTypeDef status = HAL_I2C_Mem_Write(self->i2c, i2c_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, bufinfo.buf, bufinfo.len, vals[3].u_int); + HAL_StatusTypeDef status = HAL_I2C_Mem_Write(self->i2c, i2c_addr, mem_addr, mem_addr_size, bufinfo.buf, bufinfo.len, vals[3].u_int); if (status != HAL_OK) { // TODO really need a HardwareError object, or something diff --git a/stmhal/qstrdefsport.h b/stmhal/qstrdefsport.h index 6bf7c52d8a..e4f7228bc0 100644 --- a/stmhal/qstrdefsport.h +++ b/stmhal/qstrdefsport.h @@ -160,6 +160,7 @@ Q(baudrate) Q(gencall) Q(data) Q(memaddr) +Q(memaddr_use_16b) Q(timeout) Q(init) Q(deinit)