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

基于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
9 }  y4 s7 Z: d$ N8 T{0 A+ x4 N; ]$ U* h
    HAL_StatusTypeDef  status =HAL_OK;8 V9 q( x: s& M0 N* L) o( i% v
    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed
4 }: \2 J# a& j9 x' h5 F0 D    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);
6 m  ^( Y7 T, s* m) m    if (HAL_OK != status)
: V3 d/ g" H) Q    {
4 D1 s# G  @5 o& l, p        printf("I2C Write Fail:%d\n\r",status);
8 @1 R+ h8 B  q& W  N        return status;
8 _9 E  H6 O) z1 w    }
+ J2 E# x1 B5 Y7 r    return HAL_OK;
7 N: q& _. Z  g: j7 I( M}
- o3 i( @" r- h7 \0 a0 I2 l1 A/ D5 U  j/ E
int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function% D- B5 ]& d4 U/ r4 |7 p0 a7 I
{4 V3 ?4 P2 g: n) Q  J
    HAL_StatusTypeDef  status =HAL_OK;/ w' r7 X2 G2 Y
   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed) G& L" {. N3 s' w! R
      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   
1 ]2 q' N- v3 _  {* Y/ Z$ h   uint8_t regAddr = reg_addr;
+ l9 a; m* Y7 N) ~5 p6 w8 ?         
% F- q/ ]5 U0 @0 J status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT);
5 X* g1 \& `. K0 t  }% G   % |6 J1 j7 o+ z
if (HAL_OK != status)
2 \* \" e; [& ~- E    {; A( f; n  _! d- R1 `0 f
        printf("I2C readreg Fail:%d\n\r",status);
4 ?' f' ^& x( t! w# f& |9 o& Z        return status;
0 s' u2 l! a2 X: R( E    }    3 `8 J$ R% }, E; {. l

( {' o6 q! W' P" f2 I2 D    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); //
/ R& g9 g9 V* D    if (HAL_OK != status)0 c/ W0 m8 N$ ^4 q* w- Q
    {
; }8 \  y" ~, c& h$ p$ H        printf("I2C Read1 Fail:%d\n\r",status);( h" b/ F- u  D9 l0 p1 d" e
        return status;0 H8 E& Z& c7 T* }/ Z) z
    }
' w& ]0 R" a, Y) m% O4 [" C    return HAL_OK;
- v0 K! A& _! h }
3 t; j- Z; ~/ g* {+ J) O' D
- @: L- H. A" f! K写是用HAL_I2C_Mem_Write() 重新打包;
1 N) N' ^  r5 g- _读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.: u; K8 E4 u/ i# q
如上改过后,单字节,多字节 读写稳定。. X( f8 Q5 p) Y; g, u
HAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。
" p/ o+ @, s( Q% q# a" V$ ?我是在STM32L4系列使用的。( |  M2 N" l; D; G
我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html
3 r3 Y4 X0 R( T; g" A
赞 收藏 评论0 发布时间:2019-7-20 15:47

举报

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