Skip to content

Conversation

@CYFS3
Copy link
Contributor

@CYFS3 CYFS3 commented Feb 25, 2025

拉取/合并请求描述:(PR description)

[

为什么提交这份PR (why to submit this PR)

PixPin_2025-02-25_17-32-37
i2c的地址为7位

你的解决方案是什么 (what is your solution)

请提供验证的bsp和config (provide the config and bsp)

  • BSP:
  • .config:
  • action:

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 代码是高质量的 Code in this PR is of high quality
  • 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • 如果是新增bsp, 已经添加ci检查到.github/workflows/bsp_buildings.yml 详细请参考链接BSP自查

@CYFS3 CYFS3 requested a review from Rbb666 as a code owner February 25, 2025 09:33
@github-actions github-actions bot added BSP: NXP Code related with NXP BSP labels Feb 25, 2025
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

@Rbb666
Copy link
Member

Rbb666 commented Mar 1, 2025

@imi415 大佬帮看看

@CYFS3 CYFS3 closed this Mar 1, 2025
@CYFS3 CYFS3 deleted the fix_nxp_i2c branch March 1, 2025 07:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BSP: NXP Code related with NXP BSP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants