你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32 HAL库的I2C 兼容单字节多字节读写例程

[复制链接]
慎微 发布时间:2019-7-20 15:47
int8_t I2C_write(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  // packet function
{
    HAL_StatusTypeDef  status =HAL_OK;
    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed
    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);
    if (HAL_OK != status)
    {
        printf("I2C Write Fail:%d\n\r",status);
        return status;
    }
    return HAL_OK;
}

int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function
{
    HAL_StatusTypeDef  status =HAL_OK;
   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed
      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   
   uint8_t regAddr = reg_addr;
         
status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT);
   
if (HAL_OK != status)
    {
        printf("I2C readreg Fail:%d\n\r",status);
        return status;
    }   

    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); //
    if (HAL_OK != status)
    {
        printf("I2C Read1 Fail:%d\n\r",status);
        return status;
    }
    return HAL_OK;
}

写是用HAL_I2C_Mem_Write() 重新打包;
读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.
如上改过后,单字节,多字节 读写稳定。
HAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。
我是在STM32L4系列使用的。
我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html
收藏 评论0 发布时间:2019-7-20 15:47

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版