I2C实践一LM75A温度传感器图文.docx
《I2C实践一LM75A温度传感器图文.docx》由会员分享,可在线阅读,更多相关《I2C实践一LM75A温度传感器图文.docx(18页珍藏版)》请在冰点文库上搜索。
I2C实践一LM75A温度传感器图文
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
实验四、I2C实践
(一)-LM75A温度传感器
实验目的:
在这一课里,我们一起来学习I2C协议,以及I2C驱动的编写方法,并通过FPGA/CPLD来驱动LM75A温度传感器,读出当前温度信息。
实验原理:
(1I2C串行总线概述
采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。
同时,系统的更改和扩充极为容易。
常用的串行扩展总线有:
I2C(InterICBUS)总线、单总线(1-WIREBUS)、SPI(SerialPeripheralInterface)总线及Microwire/PLUS等。
本课仅讨论I2C串行总线。
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
I2C总线只有两根双向信号线。
一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
每个接到I2C总线上的器件都有唯一的地址。
主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
机即为发送器,总线上接收数据的器件则为接收器。
在多主机系统中,可能同时有几个主机企图启动总线传送数据,为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。
在FPGA/CPLD应用系统的串行总线扩展中,我们经常遇到的是以FPGA/CPLD为主机,其它接口器件为从机的单主机情况。
(2I2C总线的数据传送
1)、数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
2)、起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。
接收器收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。
直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。
3)、数据传送格式
1、字节传送与应答
每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。
如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。
当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。
这个信号是由对从机的“非应答”来实现的。
然后,从机释放SDA线,以允许主机产生终止信号。
2、数据帧格式
I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
每次数据传送总是由主机产生的终止信号结束。
但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传送过程中,可以有以下几种组合方式:
a、主机向从机发送数据,数据传送方向在整个传送过程中不变:
注:
有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。
A表示应答,A非表示非应答(高电平)。
S表示起始信号,P表示终止信号。
b、主机在第一个字节后,立即从从机读数据
c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。
4)总线的寻址
I2C总线协议有明确的规定:
采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
D7~D1位组成从机的地址。
D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。
从机的地址由固定部分和可编程部分组成。
在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。
如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
(4)LM75A温度传感器简介
LM75A是一个使用了内置带隙温度传感器和Σ-△模数转换技术的温度-数字转换器。
它也是一个温度检测器,可提供一个过热检测输出。
LM75A包含许多数据寄存器:
配置寄存器(Conf),用来存储器件的某些配置,如器件的工作模式、OS工作模式、OS极性和OS故障队列等(在功能描述一节中有详细描述);温度寄存器(Temp),用来存储读取的数字温度;设定点寄存器(Tos&Thyst),用来存储可编程的过热关断和滞后限制,器件通过2线的串行I2C总线接口与控制器通信。
LM75A还包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。
LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。
LM75A可配置成不同的工作条件。
它可设置成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。
OS输出有2种可选的工作模式:
OS比较器模式和OS中断模式。
OS输出可选择高电平或低电平有效。
故障队列和设定点限制可编程,为了激活OS输出,故障队列定义了许多连续的故障。
温度寄存器通常存放着一个11位的二进制数的补码,用来实现0.125℃的精度。
这个高精度在需要精确地测量温度偏移或超出限制范围的应用中非常有用。
正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后75℃,这时,LM75A就可用作一个具有以上预定义温度设定点的独立的温度控制器。
其功能框图如下:
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
1)LM75A管脚描述
LM75A的管脚描述见下图。
LM75A管脚描述
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
LM75A与FPGA的接口电路如图所示,由于SDA,OS与SCL为开漏输出,必须加上拉电阻。
2)LM75A的功能特点
●
提供环境温度对应的数字信息,直接表示温度;●
可以对某个特定温度作出反应,可以配置成中断或者比较器模式(OS输出);●
高速I2C总线接口,有A2-A0地址线,一条总线上最多可同时使用8个LM75A;●
低功耗设计,工作电流典型值为250uA,掉电模式为3.5uA;●
测量的温度最大范围为-55℃~+125℃;●
宽工作电压范围:
2.8V~5.5V;●
提供了良好的温度精度(0.125℃);●
可编程温度阈值和滞后设定点。
(5)LM75A内部寄存器
●指针寄存器
指针寄存器包含一个8位的数据字节,低2位是其它4个寄存器的指针值,高6位等于0,见指针寄存器表格和指针值表格。
指针寄存器对于用户来说是不可访问的,但通过将指针数据字节包含到总线命令中可选择进行读/写操作的数据寄存器。
由于当包含指针字节的总线命令执行时指针值被锁存到指针寄存器中,因此读LM75A操作的语句中可能包含,也可能不包含指针字节。
如果要再次读取一个刚被读取且指针已经预置好的寄存器,指针值必须重新包含。
要读取一个不同寄存器的内容,指针字节也必须包含。
但是,写LM75A操作的语句中必须一直包含指针字节。
总线通信协议详见数据通信一节。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
上电时,指针值等于0,选择Temp寄存器;这时,用户无需指定指针字节就可以读取Temp数据。
除了指针寄存器外,LM75A包含4个数据寄存器,见下表。
表中给出了寄存器的指针值、读/写能力和上电时的默认值。
温度寄存器Temp(地址0x00)
温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。
这两个字节中只有11位用来存放分辨率为0.125℃的Temp数据(以二进制补码数据的形式),如表1所示。
对于8位的I2C总线来说,只要从LM75A的“00地址”连续读两个字节即可(温度的高8位在前)。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
根据11位的Temp数据来计算Temp值的方法:
1.若D10=0,温度值(℃)=+Temp数据)×0.125℃;
2.若D10=1,温度值(℃)=-Temp数据的二进制补码)×0.125℃。
下表给出了一些Temp数据和温度值的例子。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
配置寄存器(地址0x01)配置寄存器为8位可读写寄存器,其位功能分配如下表所示。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
以上OS配置后面会详细介绍。
●
滞后寄存器Thyst(0x02)滞后寄存器是读/写寄存器,也称为设定点寄存器,提供了温度控制范围的下限温度。
每次转换结束后,Temp数据(取其高9位)将会与存放在该寄存器中的数据相比较,当环境温度低于此温度的时候,LM75A将根据当前模式(比较、中断)控制OS引脚做出相应反应。
该寄存器都包含2个8位的数据字节,但2个字节中,只有9位用来存储设定点数据(分辨率为0.5℃的二进制补码),其数据格式如下表所示,默认为75℃。
●
过温关断阈值寄存器Tos(0x03)过温关断寄存器提供了温度控制范围的上限温度。
每次转换结束后,Temp数据(取其高9位)将会与存放在该寄存器中的数据相比较,当环境温度高于此温度的时候,LM75A将根据当前模式(比较、中断)控制OS引脚做出相应反应。
其数据格式如表4所示,默认为80℃。
Tos和Thyst表给出了一些限制数据和限制温度值的例子。
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
OS输出为开漏输出口。
为了观察到这个输出的状态,需要接一个外部上拉电阻,其阻值应当足够大(高达200kΩ),以减少温度读取误差。
OS输出可通过编程配置寄存器的B2位设置为高或低有效。
如图所示,为LM75A在不同模式下OS引脚对温度做出的响应。
OS设为低有效。
*=OS可通过读寄存器或使器件进入关断状态来复位。
假设故障队列在每个Tos和Thyst交叉点处都被满足。
可以看出,当LM75A工作在比较器模式时,当温度高于Tos时,OS输出低电平。
此时采取了降温措施,启动降温设备(如风扇),直到温度再降到Thyst,则停止降温,因此在这种模式下,LM75A可以直接控制外部电路来保持环境温度;而在中断模式,则在温度高于Tos或低于Thyst时产生中断。
注意:
在中断模式下,只有当MCU对LM75A进行读操作后,其中断信号才会消失(图中OS变为高电平)。
2)LM75A的I2C串行接口
在主控器的控制下,LM75A可以通过SCL和SDA作为从器件连接到I2C总线上。
主控器必须提供SCL时钟信号,可以通过SDA读出器件数据或将数据写入到器件中。
注意:
必须在SCL和SDA端分别连接一个外部上拉电阻,阻值大约为10kΩ。
LM75A在I2C总线的从地址的一部分由应用到器件地址管脚A2、A1和A0的逻辑来定义。
这3个地址管脚连接到GND(逻辑0)或Vcc(逻辑1)。
它们代表了器件7位地址中的低3位。
地址的高4位由LM75A内部的硬连线预先设置
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
为„1001‟。
表1给出了器件的完整地址,从表中可以看出,同一总线上可连接8个器件而不会产生地址冲突。
由于输入管脚SCL、SDA、A2-A0内部无偏置,因此在任何应用中它们都不能悬空(这一点很重要)。
主机和LM75A之间的通信必须严格遵循I2C总线管理定义的规则。
LM75A寄存器读/写操作的协议通过下列描述之后的各个图来说明:
1.通信开始之前,I2C总线必须空闲或者不忙。
这就意味着总线上的所有器件都必须释放SCL和SDA线,SCL和SDA线被总线的上拉电阻拉高。
2.由主机来提供通信所需的SCL时钟脉冲。
在连续的9个SCL时钟脉冲作用下,数据(8位的数据字节以及紧跟其后的1个应答状态位)被传输。
3.在数据传输过程中,除起始和停止信号外,SDA信号必须保持稳定,而SCL信号必须为高。
这就表明SDA信号只能在SCL为低时改变。
4.S:
起始信号,主机启动一次通信的信号,SCL为高电平,SDA从高电平变成低电平。
5.RS:
重复起始信号,与起始信号相同,用来启动一个写命令后的读命令。
6.P:
停止信号,主机停止一次通信的信号,SCL为高电平,SDA从低电平变成高电平。
然后总线变成空闲状态。
7.W:
写位,在写命令中写/读位=0。
8.R:
读位,在读命令中写/读位=1。
9.A:
器件应答位,由LM75A返回。
当器件正确工作时该位为0,否则为1。
为了使器件获得SDA的控制权,这段时间内主机必须释放SDA线。
10.A‟:
主机应答位,不是由器件返回,而是在读2字节的数据时由主控器或主机设置的。
在这个时钟周期内,为了告知器件的第一个字节已经读走,并要求器件将第二个字节放到总线上,主机必须将SDA线设为低电平。
11.NA:
非应答位。
在这个时钟周期内,数据传输结束时器件和主机都必须释放SDA线,然后由主机产生停止信号。
12.在写操作协议中,数据从主机发送到器件,由主机控制SDA线,但在器件将应答信号发送到总线的时钟周期内除外。
13.在读操作协议中,数据由器件发送到总线上,在器件正在将数据发送到总线和控制SDA线的这段时间内,主机必须释放SDA线,但在主器件将应答信号发送到总线的时间周期内除外。
详细的读/写寄存器协议如下:
写配置寄存器(1字节数据)
FPGA/CPLD开发套件实验教程——PERI2-4DI篇
读包含指针字节的配置寄存器(1字节数据)
读预置指针的配置寄存器(1字节数据)
FPGA/CPLD开发套件实验教程——PERI2-4DI篇写Tos戒Thyst寄存器(2字节数据)读包吨指针字节的Temp、Tos戒Thyst寄存器(2字节数据)图读预置指针的Temp、Tos戒Thyst寄存器(2字节数据)实验结果:
此实验需要PERI1-8KD外设板配合共同完成,将LM75A的温度寄存器TEMP的数据读出,显示在数码管上。
15
FPGA/CPLD开发套件实验教程——PERI2-4DI篇具体实现:
程序实现了FPGA/CPLD编写I2C协议读叏LM75A的温度寄存器TEMP的数据读出,并显示在数码管。
程序的过程大致如前面所述,器件默认工作在正常模式,FPGA/CPLD首先収送器件地址"10100010"最后一位0代表写,再収送器件字地址,即TEMP寄存器指针地址“00H”,然后再次収送器件地址"10100011"最后一位1代表读,然后就可以连续读叏两次,分别得到读叏的温度信息高位和低位,屏蔽无效位后送给数码管显示出来。
这里还有一点需要注意的,就是在inout口读叏数据之前,一定要设为三态释放总线,然后才能读叏数据。
详细实现参加程序代码不注释。
实验总结:
通过以上的讲解,相信各位已经掌握了FPGA使用HDL诧言实现读叏LM75A温度传感器的方法了吧,其实可以看出,FPGA操作I2C还是有些啰嗦的。
丌过有了这节课的基础,下节的实时时钟就轻松多了,因为也是I2C的通讯协议。
课后作业:
在本节课的基础上,添加代码,设置Tos不Thyst寄存器,读叏OS实现高温报警功能(LED闪烁,蜂鸣器鸣叨)。
16