文档章节

基于I2C的红外体温测量

兔之
 兔之
发布于 2014/03/05 21:36
字数 783
阅读 178
收藏 2

##神奇的I2C## 众所周知,I2C调试是外围设备中调试最为麻烦的事。主要是因为时序和硬件连接等问题。下面是I2C的Wiki定义:

I²C (Inter-Integrated Circuit) is a multimaster serial single-ended computer bus used for attaching low-speed peripherals to a motherboard, embedded system, cellphone, or other digital electronic devices.

这次用MSP430的I2C调试一个含有DSP处理单元的红外体温测量元件MLX90615。里面含有16位的RAM和EEPROM。

##遇到的问题## 1)MLX90615的slave地址是0x5B,这其实是个7位地址(MSBs[7:1])1011011。而在MSP430中需要给定的就是这个7位地址。在STM32中需要给定的是8位地址10110110,最后一位根据write/read进行变化。所以认真读英文文档是非常重要的。

2)我把slave Adderss理解为选通地址。而MLX90615的数据读取地址是用[命令+地址]的方式定义的,便于去区分RAM和EEPROM。

3)时序问题。 读一个地址的正确时序应该是:start信号——> MSP430自动发送写在UCB1I2CSA寄存器中的SLave Address+Wr 然后从机应答——> 等到从机的应答信号之后,发送Word Byte,相当于读写命令。从机又会有一个应答信号——>等到从机的应答信号之后 重新发送一个起始信号,并配置读写方式为读,以便下一个周期硬件设置让从机发数据回主机(*)——> 主机收到从机在地址0x27处的16bit的数据和一个CRC校验字节。

*中等到从机的应答信号之后重新发送一个起始信号,并配置读写方式为读。这一步相当重要。只有设置了这一步,才能正确收到从机发过来的3个数据。

##硬件电路##

下面是硬件电路,SCL和SDA都用一个10K的电阻拉到3.3V上。可以维持SCL和SDA的稳定性。在实验过程中,有几次出现了没有从机应答的情况,后来又自个儿好了。我想是电路问题造成的3.3V被分压了,用示波器看过,电压会时不时跳变到2.3V左右的位置。

在此输入图片描述

##程序##

<!-- lang: cpp -->
void EEPROM_radom(unsigned char high_Address)
{
while (UCB1CTL1 & UCTXSTP);               // Ensure stop condition got sent
UCB1CTL1 |= UCTXSTT + UCTR;         // 发送起始位,确定为写 
UCB1TXBUF = high_Address;           // 发送地址位高位
while((UC1IFG & UCB1TXIFG)==0);           // 判断是否有应答信号

UCB1CTL1 &= ~UCTR;                        // 配置为接收
while (UCB1CTL1 & UCTXSTP);               // 判断总线是否被释放
UCB1CTL1 |=UCTXSTT;                       // 重新发送起始位
while((UCB1CTL1 & UCTXSTT)==1);           // 判断起始位是否发送成功
for(unsigned char i=0x0;i<0x1f;i++);      // 延时确定数据已经被发送出去 
while((UC1IFG & UCB1TXIFG)==0);
UCB1CTL1 &= ~UCTXNACK;  // 不发送停止位,给应答。让RAM返回3byte数据,每个byte返回一个应答。
}

UCB1CTL1 &= ~UCTXNACK; 这一步也非常重要,没有给从机应该的话只能读到0x27这个16bit内存的后8位。所以要配置为在收到数据后返回应答。

最后读出我的室内皮肤表面温度是24度。

##Reference## [1].http://www.eefocus.com/nightseas/blog/2012-03/232785_30cd2.html

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
基于MXL90614设计温度传感器

摘要:提供了一种基于数字式红外传感器MLX90615的多点红外测温方法。STM32微处理器通过SMBus总线协议与MLX90615进行通信,首先分别对每个MLX90615地址进行修改,确保其地址编号在总线上的唯一...

victor790613
2017/04/12
0
0
60秒测量6项生理数据,联发科让手机秒变健康伴侣

随着健康越来越受到人们的重视,各种智能手环,智能手表等设备也被置入了测心率、测卡路里、记录睡眠时间、记录步数等等生理数据的功能。而笔者今天要说的,是记录和处理这些数据,但又常常被...

zabenbrdit36243qnjx1
2017/12/14
0
0
AI传感未来正在发声 红外技术开创智能家居气体监测新纪元

  给予家人最安全的家,是每个人都义不容辞的责任,界定安全气体的界限,必须要依靠多种气体检测设备。   每个人每天要接触1万升空气,但是安全的空气无论在室内还是在室外,在中国都是奢...

镁客网
2018/01/08
0
1
[RK3288][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kris_fei/article/details/85100971 Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 首先我想感谢下Rockc...

KrisFei
2018/12/19
0
0
VL53L0X+stm32激光测距

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/tiramisuL/article/details/89502121 文末有补充 这段时间很忙,一直...

tiramisu_L
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部