Merge pull request #746 from blmorris/master
Enable 16-bit memory addresses for i2c.mem_read and i2c_mem_write
This commit is contained in:
commit
7cfae9693b
21
stmhal/i2c.c
21
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, addr_size=8)
|
||||
///
|
||||
/// 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
|
||||
/// - `addr_size` 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_addr_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8} },
|
||||
};
|
||||
#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; default is 8 bits, entering any other value gives 16 bit width
|
||||
mp_uint_t mem_addr_size = I2C_MEMADD_SIZE_8BIT;
|
||||
if (vals[4].u_int != 8) {
|
||||
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, addr_size=8)
|
||||
///
|
||||
/// 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
|
||||
/// - `addr_size` 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; default is 8 bits, entering any other value gives 16 bit width
|
||||
mp_uint_t mem_addr_size = I2C_MEMADD_SIZE_8BIT;
|
||||
if (vals[4].u_int != 8) {
|
||||
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
|
||||
|
@ -161,6 +161,7 @@ Q(baudrate)
|
||||
Q(gencall)
|
||||
Q(data)
|
||||
Q(memaddr)
|
||||
Q(addr_size)
|
||||
Q(timeout)
|
||||
Q(init)
|
||||
Q(deinit)
|
||||
|
Loading…
x
Reference in New Issue
Block a user