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

基于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& m* ^+ q! V+ w+ Y6 X% R+ [, k7 y
{% j+ U# Q0 T/ K+ Y& _
    HAL_StatusTypeDef  status =HAL_OK;
4 G" z- ^7 p$ j* v    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed! e0 W: x/ l" S) s
    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);6 i$ M0 z; z$ T: w
    if (HAL_OK != status)" J' |0 E5 s. b; d
    {/ k' ^6 g" _0 e, b; B: z
        printf("I2C Write Fail:%d\n\r",status);
* x2 N7 F# n% i/ ~# e' h  e9 R        return status;
5 `6 {: B* e3 T4 m    }; E/ e! G: u- q% E
    return HAL_OK;. ]7 X8 s" B  ^7 L" T# m
}& O0 d2 p1 X+ Y6 [0 K9 }% a" v6 O
7 D, d# k! c, K* g, Y- v# ^+ F6 x
int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function: w! u# E+ ], c
{4 E  Z- ]& {' q) M/ B5 y% s
    HAL_StatusTypeDef  status =HAL_OK;
" |7 K4 |: X5 ?7 ^3 @   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed
4 m9 h) A+ |4 n      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   5 l' w- v2 H/ k4 j
   uint8_t regAddr = reg_addr;
. i- Z1 n" Z: T) A( Q8 }8 A# L          ( _# K: T3 i% `' X- y) M8 x
status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT); $ _- Z' L, U) t9 M# P# K
   0 U  {4 V4 W, F, I, T
if (HAL_OK != status)
$ |) R! o7 C4 f  W% e/ r    {
1 i2 Y8 O; @2 H+ o) o        printf("I2C readreg Fail:%d\n\r",status);
  I# S8 h8 V  b7 n0 d7 B        return status;2 g1 e1 ]" p" {3 ^( |' n8 v
    }   
6 y9 \$ H' T8 Q7 R * [5 @( r! b1 F( {" h7 H3 l6 `1 T4 O
    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); // $ Y/ R9 f& ^) F: f, f) A; g- X
    if (HAL_OK != status)
- `9 [! n$ k$ Y    {7 s9 [& [! r' |
        printf("I2C Read1 Fail:%d\n\r",status);4 M( n% H7 _# u5 V" v) g( @  ~8 w
        return status;
! Y% j. p* I8 y  P4 D2 u9 N    }
, p- G3 [: L" n) a) u    return HAL_OK;
# C, e. n- ]9 r! d* k# r# }( n5 w }  o4 l7 Z1 i6 I: m* X
5 S# B+ S& Y2 S  ?8 J
写是用HAL_I2C_Mem_Write() 重新打包;
9 N0 x: s+ X( D4 R2 i/ Z, }2 D& f读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.
$ w' G. ~; P  v5 W1 |+ A/ B如上改过后,单字节,多字节 读写稳定。
& b. F3 c9 t6 aHAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。
- @9 x) S" E4 l9 M! L我是在STM32L4系列使用的。
3 H! G6 Y2 w% l我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html
2 |5 f- i4 Q+ F
收藏 评论0 发布时间:2019-7-20 15:47

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版