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

基于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 function6 d& [- u" B: O, ]. \
{
' n9 @2 P9 N* h' `' s    HAL_StatusTypeDef  status =HAL_OK;
0 T& y+ z$ R; J    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed' C7 ]  Z. G+ c  I
    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);8 |( e# O' r7 y
    if (HAL_OK != status): v/ s+ I) R1 v. S3 K: `& e
    {
, i0 r) g5 h* I* c4 m) w9 {        printf("I2C Write Fail:%d\n\r",status);
; N. z$ r" H1 D& i        return status;
4 H+ u8 l- T5 a( O6 a    }
% k2 c8 Q7 f9 g3 e" k! x    return HAL_OK;/ @5 [+ k: ?& y0 q" ^" P% ?7 y
}
4 }1 ]# r; B$ r; j4 S
2 e, ]9 y- i8 E' c0 D" G# ` int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function
. {0 c  H& U. H4 I{  p, Y! |- Y1 r$ d5 b- g$ b( c
    HAL_StatusTypeDef  status =HAL_OK;
, B2 g7 r1 P; r# b/ G6 h   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed
& q+ G; B& }" Z8 u1 p  X      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   
$ I5 g0 o% G) Q9 @- M* D0 _   uint8_t regAddr = reg_addr;- a$ \/ d. I, S$ m1 v0 o
         
% w7 z4 X, o$ z: z% C status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT); " [; d6 Q) {, J% m& ~; n5 a4 P
   
- r& ~+ S! |- S& V( R: r if (HAL_OK != status)
2 E8 e! g% q+ {& K! D  o    {) E! b. S! A& K* C2 B$ A
        printf("I2C readreg Fail:%d\n\r",status);
; C+ }: m. z2 X  l: B        return status;
' r4 |4 {8 o/ C+ r    }    ) d1 F( \% y( ?. t" w
6 ^& t2 {( ^* u
    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); //
' d& O- n' ~- p7 y  Q3 ]. r! b; U    if (HAL_OK != status)' p* T# J# u' ^
    {
! V' a( {; d2 n# k6 f9 C        printf("I2C Read1 Fail:%d\n\r",status);
' l8 \7 o1 W/ Y( e8 r( W        return status;
! T) j- e7 d+ L( u    }
1 W* G1 H! D4 O5 S    return HAL_OK;
3 K, H8 `" E" w) I: u3 h }0 T+ M& W; ?2 |' c: A- m

# Y0 U: T- D# f5 l% X/ p8 o写是用HAL_I2C_Mem_Write() 重新打包;
8 C. ?! ]: T2 a" w读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.
! I! V, C# w0 R( r5 d如上改过后,单字节,多字节 读写稳定。
- F, j% j4 E* ], NHAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。5 k2 w, ~6 T. R- v% L8 o* I
我是在STM32L4系列使用的。
; k3 f) ?& A8 l4 j, Y) @, E我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html
: u' n9 v/ r3 |/ |
赞 收藏 评论0 发布时间:2019-7-20 15:47

举报

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