Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bsp/nxp/imx/imx6ull-smart/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ static rt_ssize_t imx6ull_i2c_mst_xfer(struct rt_i2c_bus_device *bus, struct rt_
if(msgs[i].flags & RT_I2C_RD)
{
xfer.flags = kI2C_TransferNoStartFlag;
xfer.slaveAddress = msgs[i].addr;
xfer.slaveAddress = msgs[i].addr >> 1;
xfer.direction = kI2C_Read;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down Expand Up @@ -107,7 +107,7 @@ static rt_ssize_t imx6ull_i2c_mst_xfer(struct rt_i2c_bus_device *bus, struct rt_
else
{
xfer.flags = kI2C_TransferNoStartFlag;
xfer.slaveAddress = msgs[i].addr;
xfer.slaveAddress = msgs[i].addr >> 1;
xfer.direction = kI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down
10 changes: 5 additions & 5 deletions bsp/nxp/imx/imxrt/libraries/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
{
if ((imxrt_i2c->msg[i].flags & RT_I2C_NO_START) != RT_I2C_NO_START)
{
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr, kLPI2C_Write) != kStatus_Success)
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr >> 1, kLPI2C_Write) != kStatus_Success)
{
i = 0;
break;
Expand All @@ -279,15 +279,15 @@ static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
{
}

if (LPI2C_MasterRepeatedStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr, kLPI2C_Read) != kStatus_Success)
if (LPI2C_MasterRepeatedStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr >> 1, kLPI2C_Read) != kStatus_Success)
{
i = 0;
break;
}
}
else
{
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr, kLPI2C_Read) != kStatus_Success)
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr >> 1, kLPI2C_Read) != kStatus_Success)
{
i = 0;
break;
Expand All @@ -298,7 +298,7 @@ static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
}
}

if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr, kLPI2C_Read) != kStatus_Success)
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr >> 1, kLPI2C_Read) != kStatus_Success)
{
i = 0;
break;
Expand All @@ -316,7 +316,7 @@ static rt_ssize_t imxrt_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
}
else
{
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr, kLPI2C_Write) != kStatus_Success)
if (LPI2C_MasterStart(imxrt_i2c->I2C, imxrt_i2c->msg[i].addr >> 1, kLPI2C_Write) != kStatus_Success)
{
i = 0;
break;
Expand Down
2 changes: 1 addition & 1 deletion bsp/nxp/lpc/lpc54114-lite/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ static rt_ssize_t master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg m
if (!(msg->flags & RT_I2C_NO_START))
{
/* Start condition and slave address. */
result = I2C_MasterStart(lpc_i2c->base, msg->addr, direction);
result = I2C_MasterStart(lpc_i2c->base, msg->addr >> 1, direction);
}

if (result == kStatus_Success)
Expand Down
4 changes: 2 additions & 2 deletions bsp/nxp/lpc/lpc54608-LPCXpresso/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus,

if (msg->flags & RT_I2C_RD)
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Read;
xfer.subaddress = 1;
xfer.subaddressSize = 1;
Expand All @@ -175,7 +175,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus,
}
else
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 1;
Expand Down
4 changes: 2 additions & 2 deletions bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus,

if (msg->flags & RT_I2C_RD)
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Read;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand All @@ -120,7 +120,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus,
}
else
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down
4 changes: 2 additions & 2 deletions bsp/nxp/mcx/mcxa/Libraries/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg

if (msg->flags & RT_I2C_RD)
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)direction);
我看库里面是不是做了处理了?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)direction);

我看库里面是不是做了处理了?

(addr>>1)<<1=addr

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那其他的mcx的drv_i2c是不是也改一下

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那其他的mcx的drv_i2c是不是也改一下

好像不止mcx系统是七bit地址,我看lpc系列好像也是,不知道是不是nxp的库i2c的地址都是七bit的

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RTT I2C框架默认输入就是7bit地址,靠 flag 里的 RDWR 区分方向,driver层接收到的 stuct i2c_msg 也是包含7bit地址和flag的。因此接收7bit地址的bsp不需要对地址做处理,反而是需要自行添加R/W bit的bsp(如STM32,ESP32等)在接收到7bit地址的 i2c_msg 时需要左移一位根据 flag 添加R/W bit。
在MCUXpresso驱动中地址也会根据 direction 中的 kI2C_Read / kI2C_Write 左移添加R/W bit,与RTT传入的地址是相符的,因此我认为不需要进行额外右移操作。

Ref:

result = i2c_master_write_byte(cmd, msg->addr << 1 | WRITE_BIT, ACK_CHECK_EN);//发送起始信号和从设备地址

if (msg->flags & RT_I2C_RD)
{
LOG_D("xfer rec msgs[%d] hal mode=%s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
: mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
: "nuknown mode");
if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
{
ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
else
{
ret = HAL_I2C_Master_Seq_Receive_IT(handle,(msg->addr<<1), msg->buf, msg->len, mode);
}
if (ret != RT_EOK)
{
LOG_D("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
goto out;
}
if (rt_completion_wait(completion, timeout) != RT_EOK)
{
LOG_D("receive time out");
goto out;
}
}
else
{
LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
: mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
: "nuknown mode");
if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
{
ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
else
{
ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
if (ret != RT_EOK)
{
LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
goto out;
}
if (rt_completion_wait(completion, timeout) != RT_EOK)
{
LOG_D("transmit time out");
goto out;
}
}

* @brief Receive in master mode an amount of data in non-blocking mode with Interrupt
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for the specified I2C.
* @param DevAddress Target device address: The device 7 bits address value
* in datasheet must be shifted to the left before calling the interface
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @retval HAL status
*/
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

Copy link
Contributor Author

@CYFS3 CYFS3 Mar 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RTT I2C框架默认输入就是7bit地址,靠 flag 里的 RDWR 区分方向,driver层接收到的 stuct i2c_msg 也是包含7bit地址和flag的。因此接收7bit地址的bsp不需要对地址做处理,反而是需要自行添加R/W bit的bsp(如STM32,ESP32等)在接收到7bit地址的 i2c_msg 时需要左移一位根据 flag 添加R/W bit。 在MCUXpresso驱动中地址也会根据 direction 中的 kI2C_Read / kI2C_Write 左移添加R/W bit,与RTT传入的地址是相符的,因此我认为不需要进行额外右移操作。

Ref:

result = i2c_master_write_byte(cmd, msg->addr << 1 | WRITE_BIT, ACK_CHECK_EN);//发送起始信号和从设备地址

if (msg->flags & RT_I2C_RD)
{
LOG_D("xfer rec msgs[%d] hal mode=%s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
: mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
: "nuknown mode");
if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
{
ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
else
{
ret = HAL_I2C_Master_Seq_Receive_IT(handle,(msg->addr<<1), msg->buf, msg->len, mode);
}
if (ret != RT_EOK)
{
LOG_D("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
goto out;
}
if (rt_completion_wait(completion, timeout) != RT_EOK)
{
LOG_D("receive time out");
goto out;
}
}
else
{
LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
: mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
: "nuknown mode");
if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
{
ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
else
{
ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1), msg->buf, msg->len, mode);
}
if (ret != RT_EOK)
{
LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
goto out;
}
if (rt_completion_wait(completion, timeout) != RT_EOK)
{
LOG_D("transmit time out");
goto out;
}
}

* @brief Receive in master mode an amount of data in non-blocking mode with Interrupt
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for the specified I2C.
* @param DevAddress Target device address: The device 7 bits address value
* in datasheet must be shifted to the left before calling the interface
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @retval HAL status
*/
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

accept

xfer.direction = kLPI2C_Read;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand All @@ -86,7 +86,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg
}
else
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kLPI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down
4 changes: 2 additions & 2 deletions bsp/nxp/mcx/mcxc/Libraries/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ static int mcx_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg

if (msg->flags & RT_I2C_RD)
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Read;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand All @@ -84,7 +84,7 @@ static int mcx_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg
}
else
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down
4 changes: 2 additions & 2 deletions bsp/nxp/mcx/mcxn/Libraries/drivers/drv_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg

if (msg->flags & RT_I2C_RD)
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kLPI2C_Read;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand All @@ -112,7 +112,7 @@ static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg
}
else
{
xfer.slaveAddress = msg->addr;
xfer.slaveAddress = msg->addr >> 1;
xfer.direction = kLPI2C_Write;
xfer.subaddress = 0;
xfer.subaddressSize = 0;
Expand Down