武汉大学计算机系武汉,430072
黄天戍 郝蕾 陈健 任清珍
I2C总线是一种连接简单、 使用方便的总线方式,更重要的是对于LONWORK现场控制来说,需要测量的物理量很多,而它的I/O输入出口是有限的,如果用这种两线制的总线方式无疑是可以节省I/O引脚的使用,减少了节点数,节约了开支。
1、LONWORKS神经元芯片
神经元芯片选用的是 TOSHIBA的64脚的TMPN3150B1AF,它通过11只I/O引脚与指定的外部硬件相连,这11只引脚可配置多种工作方式,从而借助于最小的外接电路实现灵活的输入输出功能。其中I2C属串行I/O 对象,它可以应用的引脚是IO-8(14脚)和IO-9(15脚),IO-8用作时钟总线,IO-9用作数据总线。
2、I2C总线
I2C(Inter Intergrated Circuit)总线是由Philips 公司开发并获得专利的一种用于IC器件之间连接的二线制总线,它通过两根线:一根串行数据线(SDA)和一根串行时钟线(SCL)在连到总线上的器件之间传送信息,它通过对器件进行软件寻址来识别每个器件,而避免了硬件片选寻址, 节省了通信线数目,根据器件的功能可以工作于发送或接收方式。SDA和SCL都是双向I/O线,通过上拉电阻接正电源,当总线空闲时,2根线都是高电平。连接总线器件的输出级必须是开路或集电极开路,以具有线"与"功能。I2C总线上数据传送的最高速率为100Kb/s,连到总线上器件数量仅受总线电容400pF的限制 。送到 SDA线上的每个字节必须为8位,每次传送的字节数不限,每个字节后面必须跟1个响应位。数据传送过程中,确认数据是必须的。I2C总线控制完全由竞争的主器件送出的地址和数据决定。
3、 LONWORKS神经元芯片与AD7416利用I2C总线进行数据通信的硬件连接
AD7416是低功耗10位数字温度传感器,它包括一个带隙温度传感器、一个10位AD 转换器和一个门限可编程的用来比较测量温度的比较器。 AD7416有5个内部寄存器,其中四个是数字寄存器(我们用到了温度寄存器),一个是地址指针寄存器。 地址指针寄存器是一个8位寄存器,它储存指向四个数据寄存器之一的地址。 对于每一次串行写操作的第一个数据字节是数据寄存器的地址,这就是随后的数据字节要写入的地址。
为实现LONWORKS神经元芯片与AD7416之间进行I2C总线数据通信,将神经元芯片上特许的I2C总线引脚IO-9与AD7416的SDA相接,IO-8与AD7416的SCL相接,通过编程产生操作时序从而实现Neuron芯片对AD7416有关寄存器的写入和读出,完成对AD7416工作参数的设定以及温度值的读取。AD7416串行总线地址的最低三位是可选的,这就可以在一条总线上连接多达8个AD7416,这里只用到了一个AD7416片子,因此把A0、A1、A2全接地,如果不止一个AD7416,那么就要把A0~A2接不同的信号来选择要通信的片子。如所有的兼容器件一样,有一个7 位串行地址,这个地址的高4位设定为1001,而低三位就是由A2~A0来设置。要特别注意的是:为了避免端口吸收太大的电流,使芯片发热而影响温度读数,数据总线和时钟总线一定要接足够大的上拉电阻。
其硬件连接原理图如图1所示。

图1 Neuron芯片3150与AD7416进行数据通信的硬件连接图
4、 LONWORKS神经元芯片与AD7416利用I2C总线进行数据通信的软件编程
AD7416是作为I2C总线上的从设备,在对 AD7416 寄存器进行写操作时,Neuron芯片为主设备发送器, AD7416为从设备接收器;在对AD7416 寄存器进行读操作时,Neuron 芯片为主设备接收器, AD7416 为从设备发送器,Neuron芯片对AD7416 读写操作的地址分别为48H、C8H, 内部四个数字寄存器的地址为00H~04H, 在进行操作时作为子地址使用。
Neuron芯片与AD7416 进行数据通信的软件编程语言是Neuron C。
Neuron C是专门为Neuron 芯片设计的编程语言,它是从ANSIC中派生出来的并进行了增删, 使其直接支持的固件,Neuron C 编程主要是Neuron芯片的事件调度、I/O对象、 网络变量以及显示消息。LONWORKS神经元芯片和AD7416的通信过程如下:首先通过完成一个单字节的写操作向地址指针寄存器写入温度寄存器的地址,然后通过两个字节的读操作从温度寄存器中读取10位温度值。
LONWORKS神经元芯片通过对AD7416进行读写操作的源程序如下:
#define AD7416 0x48
#define AD7416_1 0xc8
#define C_TO_K 2740
network output SNVT_temp returnvalue;
IO_8 i2c io_i2c_bus;
boolean retval;
unsigned long int dbuff[2];
stimer repeating timer1;
when(timer_expires(timer1))
{
unsigned int control2;
control2=0x00;
//读A/D之前,首先写一个控制字到AD7416的地址指针寄存器
retval=io_out
(io_i2c_bus,&control2,AD7416,1);
//从温度寄存器中读取数据
retval=io_in(io_i2c_bus,dbuff,AD7416_1,2);
returnvalue=(dbuff[0]*10)/256+
C_TO_K;
}
when(reset)
{
timer1=1;
}
5、 结束语
本文论述的虽然是针对Neuron 芯片的I2C总线的编程方法,但可作为在单片机、微处理器及PC 机等多种应用系统中对I2C总线编程的详细参考。
本文摘自《电子查询网》