1.1SN7325概述
SN7325是一种2线串行接口的外设,它有16个I/O端口的,这16个端口划分为8个推挽I/O端口和8个开漏I/O端口。这16个I/O端口中的任何一个都可以配置为输入或是输出。所有I/O端口被配置为输入,可以用来不间断检测端口的电平状态变化,当状态变化时可以通过INT输出端口来捕获到。
开漏端口在0.26V的时候吸收电流的能力达到20mA,能够驱动LEDs。RST输入引脚能够清除串行接口、停止任何对SN7325的I2C读写动作。SN7325有两个地址输入端口,从而决定了可以通过I2C总线挂载4个SN7325从设备,同时,SN7325地址也决定了I/O端口的上电逻辑(也就是上电后默认的电平状态)。
图1
1.2推挽I/O、开漏I/O和高阻态
⑴推挽I/O
可以独立输出高低电平,输出低电平时接地,输出高电平时输出的是IC的电源电源,见SN7325数据手册中推挽I/O的设计功能图:
图2
图2中,当output(注意了,这里的output是内部的,不是图5的output)为0时,下面N型MOSFET的栅极和源极形成的PN结截止,这样漏极和源极断开,而上面P型MOSFET的栅极和源极形成的PN结导通,这样漏极和源极闭合,所以输出高电平;当output为1时,下面N型MOSFET的栅极和源极形成的PN结导通,这样漏极和源极闭合,而上面P型MOSFET的栅极和源极形成的PN结截止,这样漏极和源极断开,所以输出低电平。
⑵开漏I/O
开漏中的“漏”指MOS FET(MOS场效应管)中的漏极,开漏I/O是指以MOS FET的漏极作为输入/输出的引脚,可输出低电平和高阻态(Hi-Z),如要输出高电平,则需要外部上拉电阻接到电源端,见SN7325数据手册中推挽I/O的设计功能图:
图3
图3中,当output为0时, N型MOSFET的栅极和源极形成的PN结截止,这样漏极和源极断开,因为外部接了上拉电阻,所以输出高电平;当output为1时,N型MOSFET的栅极和源极形成的PN结导通,这样漏极和源极闭合,所以输出低电平。
⑶高阻态
指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的电路来定。
我们在电路分析时高阻态可做开路理解,也就是可以把它看作输出(输入)电阻非常大。它的极限可以认为悬空。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态,而实际应用上与引脚的悬空几乎是一样的。
当门电路的输出上拉管导通而下拉管截止时,输出为高电平;反之就是低电平;如上拉管和下拉管都截止时,输出端就相当于浮空(没有电流流动),其电平随外部电平高低而定,即该门电路放弃对输出端电路的控制 。
1.3SN7325上电I/O端口默认的电平逻辑
图4
图4中AD1和AD0电平的状态是由硬件上的设计来决定的,所以可以根据I/O口的需要的功能及电平来设计AD1和AD0,假如要让PP[7:0]输出低电平,就要对寄存器0x03设置的值为0x0,要让PP[7:0]输出高电平,就要对寄存器0x03设置的值为0xFF;同样的道理,要让OD[7:0]输出低电平,就要对寄存器0x03设置的值为0x0,要让OD[7:0]输出高阻态,就要对寄存器0x03设置的值为0xFF
1.4SN7325的命令字节寄存器
图5
SN7325有4种寄存器,分别为输入寄存器、输出寄存器、端口配置寄存器和端口中断控制寄存器,下面来说明这些寄存器的功能:
⑴端口配置寄存器
由图5可知命令字节地址为0x04和0x05寄存器分别用于配置端口A(OD0到OD7)和端口B(PP0到PP7)的功能,举个例子,此寄存器类似于S3C2451的GPDCON寄存器,用于配置I/O的功能的。上电后由图5可知其默认值为0x00,这里0表示对应的端口为输出引脚,而1表示对应的端口为输入引脚,由此可知,SN7325上电后默认为把0D[7:0]和PP[7:0]配置为输出端口。
⑵输入寄存器
由图5可知命令字节地址为0x00和0x01寄存器分别是端口A(0D[7:0])和端口B(PP[7:0])的输入寄存器,通过这两个寄存器可以读取0D[7:0]和PP[7:0]的状态
⑶输出寄存器
由图5可知命令字节地址为0x02和0x03寄存器分别是端口A(0D[7:0])和端口B(PP[7:0])的输出寄存器,通过对这两个寄存器写对应的值来让0D[7:0]和PP[7:0]输出想要的高低电平。
⑷端口中断控制寄存器
在I/O端口作为输入的时候,中断控制寄存器控制了I/O端口的中断功能,设置地址为0x06和0x07寄存器相应位为0,表示使能对应端口的中断功能,设置为1则是禁用对应端口的中断功能。
1.5Initial Power-Up
在对SN7325上电的时候,转变检测(transition detection)逻辑和INT被复位,上电后I/O口默认的状态取决于I2C从地址选择输入引脚AD1和AD0的状态,见图4。
1.6Power-On Reset
SN7325包含一个内置的上电复位电路(POR),可确保所有的寄存器在上电是复位到可知的状态。当VCC电压高于VPOR(最大为2.3V)时,POR电路释放所有的寄存器和使SCL及SDA处于正常操作的状态。当VCC电压低于VPOR时,SN7325复位所有寄存器的内容为POR默认值。
1.7RST输入引脚
RST输入低电平可是任何涉及SN7325的交互无效,迫使SN7325进入I2C停止状态,但复位不会影响中断INT的输出。
1.8待机模式
当串行线空闲的时候,也就是SDA和SLC为逻辑高的时候,SN7325自动进入待机模式(standby mode),降低供电电流以节省功耗。
1.9Serial Addressing(串行处理)
SN7325作为一个从设备,它通过SCL与SDA发送和接受数据。相对于从设备SN7325来说,我们系统的主设备是处理器S3C2451,处理器发起所有发送往或是从SN7325发送过来的数据传输,并且产生SLC时钟来同步数据的传输。
SDA作为输入和开漏输出端口,它需要一个典型值为4.7K的上拉电阻,SLC只能作为输入,如果有多个主设备挂载在这2线接口上,或是在一个单主设备的系统中,且SCL是主设备的开漏输出引脚,那么这两种情况下SCL需要一个典型值为4.7K的上拉电阻。每次传输由主设备发起的START条件、7位SN7325从地址及R/W(读/写)位、一个或是多个数据字节和STOP条件组成,见下图:
图6
1.10 START and STOP Conditions
在SCL和SDA保持在逻辑高的时候表示串行接口处于空闲状态,主设备通过使SDA从高到低且SLC为高来产生一个开始条件,在主设备完成和从设备的通讯后,通过使SDA从低到高且SCL为低来产生一个结束条件,这样总线被释放,为下次数据传输做好准备。
1.11 Bit Transfer
SCL每个时钟脉冲同步一个数据位的传输,在SCL为高电平的时候在SDA上的数据必须保持稳定才能被有效传输,见下面的时序图:
图7
1.12 Slave Address
SN7325有一个7位的从地址,紧接着的第8位是读/写位,此位为0表示向SN7325一个写命令,此位为1表示一个读命令。一个完成的从地址格式如下:
图8
1.13 Data Bus Transaction(数据总线事务)
在一次写操作中,最开始的是主设备通过产生开始位来开始传输,然后是8位从设置地址,接着的第一个字节就是命令字节(比如0x02),其中命令字节用于决定向寄存器(地址为0x02的寄存器)写数据或是从指定的寄存器读取数据。也就是再接着的就是要写入寄存器的数据,见下图:
图9
1.14 Acknowledge(应答)
SN7325每接收到一个字节的数据,在SCL的第9个时钟脉冲时发送应答位表示接收到一个字节的数据,也就是说每个字节的有效传输需要9位。主设备产生第9个时钟脉冲,接收设备在应答时钟脉冲(也就是第9个时钟脉冲)时通过拉低SDA来应答,移植以表示成功接收到此字节数据,所以说如果应答的是逻辑高,那么就表示接收设备没有成功接收到此字节数据,要么是因为地址不对,要么就是其他原因了。
这里处理器S3C2451是主设备,SN7325是从设备,当主设备发送数据给SN7325时,由SN7325产生应答位;如果SN7325发送数据给主设备,那么主设备要产生应答位。
1.15 Writing to Port Registers(向端口寄存器写数据)
见1.13的描述
1.16 Reading Port Registers(读取端口寄存器)
图10
为了从SN7325中读取寄存器数据,I2C总线的主设备必须先发送SN7325的地址和读写位(读时为1),接着是决定了被访问寄存器的命令字节数据(比如要读取0x01寄存器的值,这里的命令字节数据就为0x01),然后就是寄存器的值。
SN7325在收到从地址后产生应答位,并且在应答位的这个时钟脉冲的时候插入INT信号,这是新的快照数据就是当前发送给主设备的端口数据,所以在数据传送的时候如果端口状态改变,就可以检测到。当主设备从SN7325读取一个字节后紧接着产生一个停止条件,然后SN7325发送当前的端口数据,并且清除变化的flag与reset跳变检测。