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

基于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
0 a' G( M- g3 ^; z6 u{
# ?: c3 V+ t2 p4 y$ |    HAL_StatusTypeDef  status =HAL_OK;
; J, p1 F; o/ q1 X8 [# c& W    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed
# N4 m# I; a0 b    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);
0 d1 x' Y- \& I& Z0 i* Z; L    if (HAL_OK != status)( ?6 [- g7 M) E( h8 ?
    {! m8 q4 s' A! |0 U- l" n% R
        printf("I2C Write Fail:%d\n\r",status); & I9 D( |* Y& |$ w9 O7 [
        return status;3 M3 E2 T, k: A: C0 V
    }
' p9 [' e/ W3 `) F7 @2 I    return HAL_OK;
7 a! Z' g2 H$ h7 W6 f6 N}# [9 L# i1 b( b  q& j3 Z

: p3 K3 y% g' V* ] int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function$ J7 y# P: ?5 k, }
{& P- x& x2 a& l5 d! V: q; _
    HAL_StatusTypeDef  status =HAL_OK;5 ]: ~9 Z0 h: |' W! D
   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed! q* D8 P) Y( A0 F- Z" w; X& W9 c
      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   : a/ [2 [: v- [1 T
   uint8_t regAddr = reg_addr;, _0 V' ?8 q7 n0 T# a
         
' [  J3 ^, z% }# R status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT);
% ~7 ?5 _' u/ w) F( W! v5 a   
( c. `( \& @( x- i% ?6 ^ if (HAL_OK != status)
  _5 R8 X. l) j/ X3 O+ a    {
: C2 L$ D. x  F        printf("I2C readreg Fail:%d\n\r",status);8 j0 V5 p( h+ c2 N$ M
        return status;0 N0 V# C8 _/ d. D/ S8 i
    }    # N- w% s( `7 B9 h( T3 q& P+ }1 \
5 y# z0 I4 ^; ?: w& B
    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); //
$ R/ U2 R, }1 Y    if (HAL_OK != status); s9 b/ J+ b: l7 m- [
    {
& k; t+ h  f; R        printf("I2C Read1 Fail:%d\n\r",status);0 P6 e7 k" w% D6 ^5 [
        return status;9 N, f4 _9 S- h: L& V
    }
) i& X- {8 v9 Y    return HAL_OK;! h; z  y; E; p8 _5 o) F
}
4 D5 d7 v, W/ V) E' j8 y0 F! P: Q& n& _9 y) v6 r3 i
写是用HAL_I2C_Mem_Write() 重新打包;+ z. R  E! B4 n% S9 k
读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.
- d& ~8 Q  a  ?# ^1 I如上改过后,单字节,多字节 读写稳定。% F, R% k& w( n
HAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。
6 z6 Y( \9 ^! K7 w我是在STM32L4系列使用的。. E1 q; X) m$ s4 Z7 f. V: R/ f* w
我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html
; |. w5 G% L6 Z
收藏 评论0 发布时间:2019-7-20 15:47

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版