Skip to content

Commit 8ad377a

Browse files
ShuopengDengKyle Kearney
authored andcommitted
Fix I2C handling of 1 byte external memory address
1 parent 459666f commit 8ad377a

File tree

1 file changed

+26
-4
lines changed
  • targets/TARGET_Cypress/TARGET_PSOC6/psoc6csp/hal/src

1 file changed

+26
-4
lines changed

targets/TARGET_Cypress/TARGET_PSOC6/psoc6csp/hal/src/cyhal_i2c.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,19 @@ cy_rslt_t cyhal_i2c_slave_config_read_buff(cyhal_i2c_t *obj, uint8_t *data, uint
400400
cy_rslt_t cyhal_i2c_master_mem_write(cyhal_i2c_t *obj, uint16_t address, uint16_t mem_addr, uint16_t mem_addr_size, const uint8_t *data, uint16_t size, uint32_t timeout)
401401
{
402402
uint8_t mem_addr_buf[2];
403-
mem_addr_buf[0] = (uint8_t)(mem_addr >> 8);
404-
mem_addr_buf[1] = (uint8_t)mem_addr;
403+
if (mem_addr_size == 1)
404+
{
405+
mem_addr_buf[0] = (uint8_t)mem_addr;
406+
}
407+
else if (mem_addr_size == 2)
408+
{
409+
mem_addr_buf[0] = (uint8_t)(mem_addr >> 8);
410+
mem_addr_buf[1] = (uint8_t)mem_addr;
411+
}
412+
else
413+
{
414+
return CYHAL_I2C_RSLT_ERR_INVALID_ADDRESS_SIZE;
415+
}
405416

406417
cy_rslt_t status = cyhal_i2c_master_write(obj, address, mem_addr_buf, mem_addr_size, timeout, false);
407418

@@ -427,8 +438,19 @@ cy_rslt_t cyhal_i2c_master_mem_write(cyhal_i2c_t *obj, uint16_t address, uint16_
427438
cy_rslt_t cyhal_i2c_master_mem_read(cyhal_i2c_t *obj, uint16_t address, uint16_t mem_addr, uint16_t mem_addr_size, uint8_t *data, uint16_t size, uint32_t timeout)
428439
{
429440
uint8_t mem_addr_buf[2];
430-
mem_addr_buf[0] = (uint8_t)(mem_addr >> 8);
431-
mem_addr_buf[1] = (uint8_t)mem_addr;
441+
if (mem_addr_size == 1)
442+
{
443+
mem_addr_buf[0] = (uint8_t)mem_addr;
444+
}
445+
else if (mem_addr_size == 2)
446+
{
447+
mem_addr_buf[0] = (uint8_t)(mem_addr >> 8);
448+
mem_addr_buf[1] = (uint8_t)mem_addr;
449+
}
450+
else
451+
{
452+
return CYHAL_I2C_RSLT_ERR_INVALID_ADDRESS_SIZE;
453+
}
432454

433455
cy_rslt_t status = cyhal_i2c_master_write(obj, address, mem_addr_buf, mem_addr_size, timeout, false);
434456
if (status == CY_RSLT_SUCCESS)

0 commit comments

Comments
 (0)