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

基于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 function0 u: j+ b; v* {6 o* x% h7 h! v
{; V  }& D8 x5 m6 U2 b
    HAL_StatusTypeDef  status =HAL_OK;4 Q. `+ t/ J# e' O/ t
    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed$ A' U7 S7 u8 W, o0 F
    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);# P1 ^: s7 _6 x5 k: O& ^
    if (HAL_OK != status)( Z! j+ d; W' j' D# @9 N) f
    {
8 n. l. X2 Y% X, i! l        printf("I2C Write Fail:%d\n\r",status);   \: p) \' ]% O# O- M
        return status;
8 l+ B, n' L  @3 j6 ^    }1 l7 `! A% z  c5 A$ x% d9 T
    return HAL_OK;
3 w5 X5 O& Y, d, `}+ u+ s/ b/ O2 X- a+ {$ [4 X& m
; y: G6 O$ A  r$ e) g
int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function
+ J- O) g5 e) X% j, ]4 s. p- |0 V{/ |, F& J6 J& B1 d" v
    HAL_StatusTypeDef  status =HAL_OK;, H+ p/ Y. E& Q+ N" i% D! S1 q
   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed
; b! S4 k& \4 i9 z5 A1 m, j$ F      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   
' m% `& ]3 M5 s+ ]   uint8_t regAddr = reg_addr;+ b; ]( D7 Y+ l2 }7 W
         
9 V9 p6 w& \3 J" e# y9 A* d status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT);
$ u" H* N! B+ X   5 o5 d! P  V9 B# a: Z& Q6 J
if (HAL_OK != status)4 n% M/ X$ S5 U2 x6 z  P2 ]; N! U
    {
# W8 y+ O, G: U( `        printf("I2C readreg Fail:%d\n\r",status);- z0 N" R6 \1 u* o, ]8 Y+ G$ {
        return status;
1 e- a. t, t0 w5 E# P    }    . q& H0 A6 k  i
+ a+ g# {6 W2 k) G6 T4 c7 p
    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); // : W& ?' G; L# Q4 g
    if (HAL_OK != status)! U- N/ w* Q7 i& i
    {
: ~5 E  V3 _: b5 |5 y, @        printf("I2C Read1 Fail:%d\n\r",status);3 u, w  A6 ?* Z8 A8 _: r/ `8 O
        return status;
+ _/ e' T9 e& ~2 Q' p    }
' v& p" O8 U+ F! q; X9 M    return HAL_OK;
1 p& {1 B2 n( @ }+ X- T* e5 K: d% a' T

# @0 w: b/ |! {- B写是用HAL_I2C_Mem_Write() 重新打包;
, y0 v' t& m; f1 }读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.4 A6 Z$ s8 o: K* g  ]8 I% o4 G
如上改过后,单字节,多字节 读写稳定。
( ~! I2 i) Y$ ], NHAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。5 W% o9 u7 L9 [  y9 J- {0 l  m
我是在STM32L4系列使用的。- Y& x' `1 e' Y8 R2 X
我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html1 `2 |# Y' A; i' y9 l
收藏 评论0 发布时间:2019-7-20 15:47

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版