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

【经验分享】STM32H7使用硬件I2C读取LM75温度

[复制链接]
STMCU小助手 发布时间:2021-12-28 22:00
前言
% u4 d$ m  n' d, m$ ?$ D$ j网上能搜索到关于STM32的I2C总线文章基本都是使用软件模拟的方式实现的,这应该是F1系列留下的问题,在F4、H7系列中应该已经排除了。使用软件模拟的方式实现I2C通讯的问题在于通讯的速度和效率比较低。1 T$ P0 U: f. U7 E* D- @

# a8 V0 N& V9 M& J本文就以CubeMX+HAL库+硬件I2C的方式,去实现一个最普通的LM75BD温度IC的读取,I2C使用阻塞式通讯,日后再更改为DMA方式。. a; Q, W4 Q' l* P
: I; {6 s0 X- \' W. V
一、STM32CubeMx的配置
3 _- H+ u2 y2 R9 LLM75BD的原理图如下:
- ?2 ^1 R! X) S1 Z- x' Y! z+ Q# {1 \7 z& v
f71c3be960234c73bf15a103e87809d3.png

4 H, x4 J3 L; ~! r
bb4a0c094e164b13aba44c7e4a7b6db2.png
1 Y+ f) J9 s. ~7 Z# W6 D& Q0 g

' O* w1 O& K2 Q2 P/ b  A 通讯地址根据手册的说明,在A2、A1、A0均拉高的情况下,读地址为0x9F。3 z8 r2 x, d% N6 t
" D" ~1 }$ w7 |6 r4 s% H7 Q
98585b4b9b2c4f5b9c0ac3db711180d6.png
; v( n) U/ Y$ k. k5 Z! E

" W$ @4 |5 n# f7 d
90794b9bc3a441a79296abd2b5f26198.png
4 u8 w! E! X2 m5 k2 |2 F
I2C通讯使用了第I2C3,通讯速率100K,不开中断,两个管脚均为开漏上拉。
* \% s  c! ?, r* h, c+ x) V7 J3 N0 {1 i* `1 l8 m, q) s# O% ?: c* O

4 u' x+ k  w7 N9 P二、代码实现/ t1 h) q/ M  p1 u; k) W2 H
LM75BD的温度寄存器地址为0,数据为16位,其中低5位为无效数据,最高位为符号,所以在代码中要先右移5位,再做处理。% G! [/ P8 G; g* H' J- o

% m& u. n& s0 W# ]- V! e
e526e76e7671492db44d8c836bcaea87.png

3 k& u- w1 Q6 d: K: D' B! [' D$ C! z- D$ N
: M. W  M2 j0 h" |8 o, P! t 代码如下:
$ W; d) W: y" f, [& \1 [, m7 |% g* ?9 _" O
  1. <p>/*</p><p>*********************************************************************************************************</p><p>*<span style="white-space:pre">        </span>函 数 名: bsp_Lm75bdReadTemp</p><p>*<span style="white-space:pre">        </span>功能说明: 从LM75BD中读取温度数据</p><p>*<span style="white-space:pre">        </span>形    参: 无</p><p>*<span style="white-space:pre">        </span>返 回 值: 浮点温度值</p><p>*********************************************************************************************************</p><p>*/</p><p>float bsp_Lm75bdReadTemp(void)</p><p>{</p><p><span style="white-space:pre">        </span>HAL_StatusTypeDef status = HAL_OK;</p><p><span style="white-space:pre">        </span></p><p><span style="white-space:pre">        </span>uint8_t RawVal[2];//元数据</p><p><span style="white-space:pre">        </span>int16_t RawTemp;</p><p><span style="white-space:pre">        </span>float Lm75Temp;</p><p><span style="white-space:pre">                </span></p><p><span style="white-space:pre">        </span>status=HAL_I2C_Mem_Read(LM75_I2C_Handle,LM75BD_ADDRESS,0, I2C_MEMADD_SIZE_8BIT, RawVal, 2,1000);</p><p><span style="white-space:pre">        </span></p><p><span style="white-space:pre">        </span>if (status!=HAL_OK)//读取失败</p><p><span style="white-space:pre">                </span>return 0;</p><p><span style="white-space:pre">        </span>else</p><p><span style="white-space:pre">        </span>{<span style="white-space:pre">        </span></p><p><span style="white-space:pre">                </span>RawTemp=RawVal[0]<<8 | RawVal[1];</p><p><span style="white-space:pre">                </span>RawTemp= RawTemp>>5;</p><p><span style="white-space:pre">                </span>if((RawTemp & 0x0400) != 0 )//负温度</p><p><span style="white-space:pre">                        </span>Lm75Temp = ((float)(-((~(RawTemp & 0x03FF))+1)))*0.125;<span style="white-space:pre">                </span></p><p><span style="white-space:pre">                </span>else //正温度</p><p><span style="white-space:pre">                        </span>Lm75Temp = 0.125*(float)RawTemp;</p><p><span style="white-space:pre">                </span>return Lm75Temp;</p><p><span style="white-space:pre">        </span>}</p><p> </p><p>}</p><p></p>
复制代码

# R, g7 x: M; s
9 f% s" j$ {& L$ [' _( W9 ^: j
收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版