内容 第10页

i2c信号的ACK与NACK

阅读(27)

我们平时在调试I2C的时候可能很少去关注NACK信号,只知道如果Master发送数据,MSB先发,LSB后发,连续发送一个字节(8个bit),之后Slave会回复一个ACK信号,但是有时I2C slave可能会发出NACK信号,下面让我们来看看NACK信号存在的情况。
1、从spec下摘取一段:



2、翻译:
每个字节后会跟随一个ACK信号。ACK bit使得接收者通知发送者已经成功接收数据并准备接收下一个数据。所有的时钟脉冲包括ACK信号对应的时钟脉冲都是由master产生的。
ACK信号:发送者在ACK时钟脉冲期间释放SDA线,接收者可以将SDA拉低并在时钟信号为高时保持低电平。
NACK信号:当在第9个时钟脉冲的时候SDA线保持高电平,就被定义为NACK信号。Master要么产生STOP条件来放弃这次传输,或者重复START条件来发起一个新的开始。
3、实例:
可以看到如下波形,Master发送01101100(0x6c,MSB先发),在第9个时钟的时候SDA为高电平,表示Slave发送了NACK信号,之后整个I2C通信就结束了。这是一次失败的I2C通信,原因可能是I2C设备那边出的问题,或者访问I2C设备的地址与I2C设备实际的地址不对应,导致没接收到Master的数据从而返回NACK。

下面我拿一个OV8825 Sensor的I2C来说明,
OV8825的Slave Write Address为0x6c,OV8825的ID register Address为0x300a,0x300b,ID register里面存的Value是0x88,0x25
正常的I2C波形如下:
1)设定I2C写的地址:01101100(0x6c) 00110000(0x30) 00001010(0x0a)
Slave Write Address:0x6c,ID register address:0x300a

2)设定I2C读的地址:01101101(0x6d) 10001000(0x88)
Slave Read Address:0x6d,ID register value:0x88

20150716看到这里有点奇怪,i2c write是以ack+stop结束通信,而i2c read是以nack+stop结束通信的,原因如下:
i2c write的时候,master在写完最后一个字节之后slave会回ACK,然后master发送stop信号结束通信
i2c read的时候,master在接收完slave发送的最后一个字节之后会回NAK,因为这个时候master已经接收到足够的字节,NAK告诉slave不要在发送数据了。
3)设定I2C写的地址:01101100(0x6c) 00110000(0x30) 00001011(0x0b)
Slave Write Address:0x6c,ID register address:0x300b

4)设定I2C读的地址:01101101(0x6d) 00100101(0x25)
Slave Read Address:0x6d,ID register value:0x25

数据传输I2C协议讲解

阅读(10)

1  I2C总线物理拓扑结构


I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart为双工。

2  I2C总线特征

I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高,可以从I2C器件的数据手册得知,如TVP5158芯片,7位地址依次bit6~bit0:x101 1xxx, 最低三位可配,如果全部物理接地,则该设备地址为0x58, 而之所以7bit因为1个bit要代表方向,主向从和从向主),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

3  I2C总线协议

I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生(意味着从设备不可以主动通信?所有的通信都是主设备发起的,主可以发出询问的command,然后等待从设备的通信)。

起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件

在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。

起始和结束如图所示

在了解起始条件和停止条件后,我们再来看看在这个过程中数据的传输是如何进行的。前面我们已经提到过,数据传输以字节为单位。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位, 此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否 定应答位。

数据传输的过程如图所示:

在前面我们还提到过,I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。

向指定设备发送数据的格式如图所示:(每一最小包数据由9bit组成,8bit内容+1bit ACK, 如果是地址数据,则8bit包含1bit方向)

下图是完整的一帧I2C数据

4  I2C总线操作

对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况

  •     主设备往从设备中写数据。数据传输格式如下:

  •     主设备从从设备中读数据。数据传输格式如下:

  •     主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

数字温度传感器ADT75的原理及应用

阅读(4)

引 言
ADT75是ADI公司生产的集温度传感器、12位A/D转换器、可编程的温度过限报警器和SMBus/I2C总线接口于一体的新型数字温度传感器。其额定工作温度范围为-55~+125℃,能准确、灵敏地检测数字化温度,温度误差最大为±1℃,测温分辨率可达0.062 5℃;工作电压范围为3~5.5 V,3.3 V时典型的功耗为79μW,在关断模式下其典型工作电流值仅为3μA。

1 ADT75的引脚及结构原理
ADT75的引脚排列如图1所示,引脚说明如表1所列。

    ADT75采用8引脚的MOSP和SOIC封装,其内部结构如图2所示。

    ADT75的工作过程为:片上的温度传感器采集温度后,产生一个与绝对温度成比例的精确电压,并与内部参考电压进行比较;然后输入到精确的数字式调节器中,转换为有效精度为12位的数据。将该数据与限定值比较,如果测量值超限,则OS/ALERT引脚输出超限信息。
在正常模式下,温度转换需要60 ms,然后模拟转换电路自动关闭,40 ms后模拟电路上电,开始下一个温度值的转换。所以一次温度转换周期为100 ms。

2 ADT75的寄存器结构
ADT75包含6个寄存器:1个地址指针寄存器,4个数据寄存器和1个单步模式寄存器。数据寄存器中,配置寄存器是唯一的8位寄存器,其他3个都是16位;温度值寄存器是唯一的只读寄存器,其他3个都是可读写的。单步模式寄存器也是可读写的。上电后,地址指针寄存器的初始值为0x00,指针指向温度值寄存器。ADT75的寄存器描述如表2所列。

    (1)地址指针寄存器
该8位只读寄存器存放指向某个数据寄存器的地址,可以选择单步模式。P0位和P1位选择要读/写数据的数据寄存器,向P0、P1和P2位中写入0x04来选择单步模式。地址指针寄存器的其余位都为0。寄存器的地址选择如表3所列。

    (2)温度值寄存器
该16位只读寄存器存储由芯片内部温度传感器测得的温度值。温度以二进制补码形式存储,最高位为符号位。读该寄存器时,先读高8位,后读低8位。
(3)配置寄存器
该8位可读写寄存器为ADT75提供了多种配置模式:关断、过温中断、单步、SMBus报警使能、OS/ALERT引脚极性和过温错误队列。
(4)THYST定值寄存器
该16位可读写寄存器为2个中断模式存放温度滞后限定值。这个限定值以二进制补码形式存储,最高位是温度值符号位。读该寄存器时,先读高8位,后读低8位。限定值THYST的默认值为+75℃。
(5)TOS定值寄存器
该16位可读写寄存器为2个中断模式存放过温限定值。这个温度限定值以二进制补码形式存储,最高位是温度值符号位。读该寄存器时,先读高8位,后读低8位。限定值TOS的默认值为+80℃。

3 ADT75的应用实例
3.1 硬件设计

在外界温度场作用下,光纤延迟线系统中光纤长度、横截面结构、光纤纤芯和包层的折射率分布特性会发生变化,因此在光纤中传播的光载波信号的相位和模式双折射特性就会随温度的改变而变化,从而影响最终解调出的微波信号的延时。为减小温度变化对微波信号延时的影响,需要设计一个温度控制系统,用来控制系统的温度。
硬件设计电路主要包括2部分:数字信号处理器TMS320F2812和数字温度传感器ADT75。
采用TI公司推出的TMS320F2812作为核心控制芯片。其外部晶振频率为30 MHz,通过片内的PLL进行倍频,最高主频可达150 MHz;运行速度快,可以对采集的温度信号进行实时处理。
TMS320F2812没有设计I2C总线,但是有56个GPIO口,所以采用GPIO口模拟I2C总线时序来控制ADT75。这种硬件电路结构简单,功耗较低,实用性强。ADT75与TMS320F2812的接口电路如图3所示。

    TMS320F2812的GPIOB0引脚用作I2C总线的时钟信号线,GPIOB1引脚用作I2C总线的串行数据线。供电电压为5 V,10 kΩ电阻为开漏极的上拉电阻,0.1μF电容起去耦作用。本设计仅实时采集光纤延迟线系统的温度,不需要过温报警,所以OS/ALERT引脚保留。ADT75的地址为7位,高4位为1001,低3位由地址引脚A0~A2决定。由于只有一片ADT75,故可将其3个地址引脚全部接地,则芯片地址可确定为1001000。温控系统根据测得的温度在TMS320F2812内部进行PID运算,然后通过外部的温度控制装置对光纤延迟线内部温度进行调节,使其稳定在某个设定的范围内。

3.2 软件设计
利用死循环等待函数while(1)中的ReadDevice()函数从ADT75中读取温度值。每隔250 ms读取一次温度值,从而实现对系统温度的实时监控。
ReadDevice()函数包括以下函数:Start(),Stop(),SendAddress(),ReadAck(),ReceiveData(),Mack(),MNack()。读取温度的流程如图4所示,读取温度的时序如图5所示。

 

    (1)启动数据传输
在头文件中对TMS320F2812的GPIOB口进行配置。定义GPIOB0为SCL,输出;GPIOB1为SDA,输出。Start()函数模拟I2C总线的起始条件:


至此,完成了I2C总线的启动。

(2)传送ADT75地址
在读取温度值之前必须向从器件发送地址。ADT75的7位地址为0x48。由于是读数据(读/写位为1),所以传送的8位地址命令为0x91。在传送数据时,当SCL为0时,才允许SDA上的数据变化;为1时,SDA上的数据保持不变。8位地址传送结束后,主机释放SDA(令SDA=1),等待从机的应答信号。
(3)检测ADT75的应答位
I2C总线传输完8位数据后由从机给主机一个低电平的应答信号,表示从机正常工作并可以接收下一个字节的数据。检测ADT75的应答位时,应注意把GPIOB1口设置为输入。

 

    EALLOW:
GpioMuxRegs.GPBDIR.bit.GPIOB1=0;
EDIS;
如果SDA=0,则TMSS20F2812开始从ADT75中读取数据的高字节;SDA=1,表示ADT75忙或者损坏,结束数据读取。
(4)读取数据
当检测到ADT75的应答信号为0时,开始读取温度值。I2C总线的数据传输是以字节为单位的,首先读取温度值的高字节(温度值的整数部分,最高位为符号位),读取的数据存放在retc中。每接收1位数据,retc左移1位。若SDA=1,retc加1;SDA=0,retc不变。

    
高8位数据传输完后,TMS320F2812传给ADT75一个低电平的应答信号,由Mack()函数完成。此时,需要将GPIOB1端口的数据传输方向改为输出:
EALLOW:
GpioMuxRegs.GPBDIR.bit.GPIOB1=1;
EDIS:
然后开始接收温度值的低字节(温度值的小数部分),读取成功后由TMS320F2812发送一个非应答位,表示本次温度值的读取结束,进入停止状态。
(5)结束数据传输
结束数据传输由Stop()函数完成,结束条件如下:

    

    Delay(50);
至此,读取一个温度值的全过程结束。在程序调试过程中发现,当设置断点单步运行时,无法检测到ADT75发出的低电平应答信号,应答信号始终为1;若不设断点连续执行时,则可以检测到低电平应答信号。这点是ADT75和其他I2C总线器件(如E2PROM芯片AT24C256)的不同之处,在调试程序的过程中要注意该细节。
ADT75的温度转换周期为100 ms。在本设计中,每隔大约250 ms读取一次温度值,可以实现监测光纤延迟线系统温度的变化。

结 语
在光纤延迟线系统的硬件设计中,ADT75完全能够满足实时温度采集的要求,而且测温准确,灵敏度高。由于使用了I2C总线接口,所以温度检测电路结构简单,占用空间小,串行接口占用TMS320F2812的资源少,可靠性高,功耗低,不易受环境干扰。实验证明,设计和运行都达到了令人满意的效果。

网站改版路径改变的解决方法

阅读(8)

网站改版,目录发生改变,为改变出现404情况,将新路径和老路径一致可通过nginx重定向来解决如:

方法一:配置文件修改

location ~* ^/code_post/(.*) {
    return 301 https://www.abc.com/$1;
    access_log off;
} 方法二:rewrite
location ~* ^/code_post/ {
    rewrite ^/code_post/(.*)$ https://www.abc.com/$1 permanent;
    access_log off;
}

这两种实现方式,在不同域名之间的301跳转时同样适用。

侠侣联盟达人注册教程

阅读(14)

侠侣联盟是一个不错遛娃平台,景点门票非常丰富,注册侠侣联盟达人自己购买返佣金,分享购买成功还可以赚取佣金.

侠侣联盟达人注册方法如下:

微信识别侠侣联盟达人邀请码,填写信息一步注册即可成为侠侣联盟分享达人,享有达人的福利.如

侠侣联盟达人注册码

趣鸭分享达人分享达人注册教程?

阅读(10)

趣鸭注册方法:

微信识别下图趣鸭分享达人邀请码注册即可.

趣牙分享达人注册

注册后分享购买成功即可获得产品佣金

旅划算达人注册教程?怎么加入旅划算平台

阅读(10)

2.4亿人选择本地生活服务平台,怎么加入旅划算达人

给消费者最优惠的价格

旅划算社交电商模式的开创者,2.4亿人选择的本地生活服务平台,旅划算为消费者提供最优惠的价格,共享内部价格,通过分享还可以获得佣金.实实在在为消费者带来好处.

旅划算的注册方法

微信识别旅划算官方达人码注册即可销售优惠的价格,分享获得佣金.

旅划算达人招募

享库存达人注册教程

阅读(26)

享库存是一款大众社交抢购平台,享库存为本地商户创建的一个爆款抢购平台,平台为白领,宝妈,学生等提供海量爆款低价货源,一键分享,轻松赚钱。

目前享库存开通上海,杭州,南京,苏州,等城市

加入享库存的2个方法

1、微信识别下图邀请注册码一步加入

享库存达人招募

 

2、在手机应用中下载享库存APP,安装后点击注册,根据提示输入信息及邀请码r4z8z5(长按复制)即可注册完成!

联联周边游达人注册教程

阅读(12)

很多朋友询问联联周边游如何注册?

联联周边游采用邀请方式注册,所以一般小朋友找不到注册地址,想注册的朋友可以通过下面邀请码进行注册,如

联联周边游达人邀请注册码

注册后可立即成为分享达人,自购和分享购买产品可以获得相应的佣金.