Commit e687fdbc authored by blmorris's avatar blmorris
Browse files

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
parent 2097c8b1
...@@ -453,7 +453,7 @@ STATIC mp_obj_t pyb_i2c_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_arg ...@@ -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); 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: /// 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); ...@@ -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 /// - `addr` is the I2C device address
/// - `memaddr` is the memory location within the I2C device /// - `memaddr` is the memory location within the I2C device
/// - `timeout` is the timeout in milliseconds to wait for the read /// - `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. /// Returns the read data.
/// This is only valid in master mode. /// This is only valid in master mode.
...@@ -469,6 +470,7 @@ STATIC const mp_arg_t pyb_i2c_mem_read_args[] = { ...@@ -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_addr, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
{ MP_QSTR_memaddr, 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_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) #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 ...@@ -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 // get the addresses
mp_uint_t i2c_addr = vals[1].u_int << 1; mp_uint_t i2c_addr = vals[1].u_int << 1;
mp_uint_t mem_addr = vals[2].u_int; 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) { if (status != HAL_OK) {
// TODO really need a HardwareError object, or something // 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 ...@@ -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); 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: /// 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); ...@@ -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 /// - `addr` is the I2C device address
/// - `memaddr` is the memory location within the I2C device /// - `memaddr` is the memory location within the I2C device
/// - `timeout` is the timeout in milliseconds to wait for the write /// - `timeout` is the timeout in milliseconds to wait for the write
/// - `memaddr_use_16b` selects width of memaddr: 8 or 16 bits
/// ///
/// Returns `None`. /// Returns `None`.
/// This is only valid in master mode. /// 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 ...@@ -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 // get the addresses
mp_uint_t i2c_addr = vals[1].u_int << 1; mp_uint_t i2c_addr = vals[1].u_int << 1;
mp_uint_t mem_addr = vals[2].u_int; 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) { if (status != HAL_OK) {
// TODO really need a HardwareError object, or something // TODO really need a HardwareError object, or something
......
...@@ -160,6 +160,7 @@ Q(baudrate) ...@@ -160,6 +160,7 @@ Q(baudrate)
Q(gencall) Q(gencall)
Q(data) Q(data)
Q(memaddr) Q(memaddr)
Q(memaddr_use_16b)
Q(timeout) Q(timeout)
Q(init) Q(init)
Q(deinit) Q(deinit)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment