热度 1| |
今天说点很基本的东西。关于IIC总线。
看原理图上有五个器件都用了SCL、SDA这两个信号,说明这五个器件都同时连在了ATmega128的PD0、PD1口上。查下ATmega128的manual中Alternate functions of Port D(在别的IC的manual上见过GPIO Controller Function Multiplexing的说法)原来这两个端口的另一个功能就是SCL、SDA信号。这两根线到底是做什么的呢?
原来就是IIC总线——以后看到N个器件同时与芯片上几个端口相连,首先要想到这可能是一种总线。以前很奇怪TWI——two wire interface是一种什么接口,原来就是IIC,或者是相类似的东西吧(因为看到有文献上说One TWI,400kbit/s I2C-compatible的说法)!所谓两线接口就指SCL、SDA这两根线,一根控制线,一根数据线。所有的东西通过这两根线就可以搞定!至于怎么用这两跟信号线传输地址来选择总线上的设备和与设备进行通讯本文不做讨论。
回到原理图上来。既然看到五个器件都通过这个TWI与ATmega128相连,那么就涉及到每个器件的地址问题。要不然128和设备之间怎么相互辨认是谁发的数据,发给谁的数据呢?
先说远点。这个原理图上有四片24C1024B和一片RS5C372?。24C1024B是1M大小的“Two-wire Serial EEPROM”,而RS5C372?是“I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC”。这两个引号里面的东西都是相应器件manual上的标题。可见这些EEPROM和实时时钟就是为IIC这种总线设计的。而且,每种器件在出厂时都定义了相应的8位地址(之所以是8位是由IIC总线的规则定下的)!例如RS5C372?在IIC上的地址是0110010。原话是这样的:The slave address of the RS5C372A/B are specified at (0110010)。而24C1024B要麻烦点,因为在本文所讨论的系统要用到4M的空间,所以扩展了四片24C1024B。如果每一片都地址相同不就区分不开了嘛!
下面重点说下24C1024B。型号里1024指的就是容量1M。刚开始,由于原理图上写的是24C1024,我就下载了24C1024的manual,结果连管脚都不一样。后来废了好大的劲儿才明白是24C1024B。不过也多亏了这个错误,我把这两份manual对比了下,弄明白了很多东西。24C1024有一个A1管脚可以接高电平或低电平。而24C1024B有两个管脚A2、A1可以接高电平或低电平。A0和A1都是参与器件地址的管脚,占用地址位!这就导致了这样的结果:由于A1的高低不同产生两个地址,那么在同一条总线上就可以同时接两片24C1024。同理由于A2、A1的高低不同产生四个地址,那么在同一条总线上就可以同时接四片24C1024B。24C1024B的8位地址的结构是这样的:
1 | 0 | 1 | 0 | A2 | A1 | P0 | R/W |
P0是另一个选择信号。24C1024B的A2、A1管脚需要低电平时接到VSS(地)上,需要高电平时接到VCC(电源)上。本文的四片24C1024B就通过这样的方法形成了(A2 A1)分别为(0 0)、(0 1)、(1 0)和(1 1)的状况。
现在就好了,我们可以通过上述讨论的五个地址——实时时钟的一个0110010,24C1024B的四个地址——来达成总线上的不同器件的“门牌号”!
写的有点幼稚,不过这确实是我学习的过程。遗憾的是不能拿出我的原理图来直观的表达,所以也不知道说明白了没有。