-
Notifications
You must be signed in to change notification settings - Fork 5.3k
[bsp][nxp][i2c]:fix nxp i2c addr #10037
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| if (msg->flags & RT_I2C_RD) | ||
| { | ||
| xfer.slaveAddress = msg->addr; | ||
| xfer.slaveAddress = msg->addr >> 1; |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
那其他的mcx的drv_i2c是不是也改一下
There was a problem hiding this comment.
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的
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RTT I2C框架默认输入就是7bit地址,靠 flag 里的 RD 和 WR 区分方向,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);//发送起始信号和从设备地址 |
rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_hard_i2c.c
Lines 258 to 306 in 8adae07
| 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; | |
| } | |
| } |
rt-thread/bsp/stm32/libraries/STM32F1xx_HAL/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c
Lines 1784 to 1793 in 8adae07
| * @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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RTT I2C框架默认输入就是7bit地址,靠
flag里的RD和WR区分方向,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);//发送起始信号和从设备地址 rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_hard_i2c.c
Lines 258 to 306 in 8adae07
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; } } rt-thread/bsp/stm32/libraries/STM32F1xx_HAL/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c
Lines 1784 to 1793 in 8adae07
* @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
|
@imi415 大佬帮看看 |
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
i2c的地址为7位
你的解决方案是什么 (what is your solution)
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up