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

基于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% H# A, k, y; a
{5 L+ ^, b3 D3 H; R( l+ z8 t
    HAL_StatusTypeDef  status =HAL_OK;
. J$ ]9 Y/ |; O3 N    uint16_t deviceWriteAddr = (addr << 1);    //7 bit write address shall be pre-processed- G( g5 o7 b* M
    status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT);# G+ l. o2 l1 h
    if (HAL_OK != status)
! E3 K# H! h' m/ f9 S$ N    {- h6 @/ f* w9 D
        printf("I2C Write Fail:%d\n\r",status); 9 `# a+ I1 ?. Y$ t7 B& T3 {
        return status;
4 L6 I3 L( ?! E  s    }9 u/ H$ a. [2 t) R6 M! c
    return HAL_OK;, }) }( a$ h6 q; \5 V4 O: J
}
# l$ e9 t# y: E5 W, x1 _2 t6 b
5 V  F- w7 E# ?& } int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len)  //re packet function
" ?5 C8 c0 ]& n, O" }4 Q2 L{
% N- Z( S8 f, u! \1 T; J    HAL_StatusTypeDef  status =HAL_OK;
" ]% `, S5 F& }: w   uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed
: s0 W* O$ L* E0 D4 \      uint16_t deviceReadAddr = (addr << 1)|0x01;   //7 bit read address shall be pre-processed   
$ e/ M0 V1 F( Q3 ?   uint8_t regAddr = reg_addr;! z0 R) Z& K: V8 S7 w. Z
         
9 r3 r) B7 s; _2 t( s8 f. j8 a8 s status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,&regAddr,1,I2C_READ_TIMEOUT); 2 B, S% p% w* d6 L% [5 m
   - u! q- K; {- ?6 \, h$ q
if (HAL_OK != status)
6 Z# [5 ~# I  g6 O+ R* s7 [    {; o2 j( G7 I& F2 x  _% J
        printf("I2C readreg Fail:%d\n\r",status);
1 H+ P  ~% K0 O2 G/ J: A3 J# r8 b        return status;8 }+ U& g+ K# u$ q
    }    + w  B! l& ]3 h* j, i
: h3 H. w4 T$ _  [. \; }- h
    status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); //
; O0 b1 ]; {7 S# e7 z    if (HAL_OK != status)1 k9 f+ I; ~0 D# f% B" s" w
    {! u* w, V; S: T$ x8 m
        printf("I2C Read1 Fail:%d\n\r",status);+ b" `! C0 i1 E2 I
        return status;
+ w- d0 v' W5 X% r/ }5 R! M    }9 {& a  ]# u  Q* Z6 f2 q
    return HAL_OK;, R+ R7 X  o  I! N
}
" _! e! z# _8 [8 p
% V2 X5 p3 k( q3 O# {# v写是用HAL_I2C_Mem_Write() 重新打包;% m$ M3 l* q5 |! Y% j* m
读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error.
+ T9 x9 \% `+ q, \如上改过后,单字节,多字节 读写稳定。
7 z" r4 d% `( Y7 ^HAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。* F* u2 S/ @% R, C
我是在STM32L4系列使用的。
: C9 K  o: R7 g2 S. X0 z" }我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html9 K- J, @6 W* j7 S1 G: S
收藏 评论0 发布时间:2019-7-20 15:47

举报

0个回答

所属标签

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