随着微控制器的价格越来越低,功能越来越强大,电气设计人员发现在单板和多板系统中都使用多个小型控制器是一种更加经济高效的方法。这种辅助处理器能够减轻主处理器在耗时任务上面的处理开销,例如扫描键盘、显示控制器和电机控制。这些控制器也可以配置为各种各样的专用外设。
最近,我接受了一项任务:开发一种能够方便地适用于多种应用的接口(软/硬件),且要符合嵌入式处理器中常用的行业标准。在分析了一些典型应用之后,我们列出了一些针对该硬件接口的设计需求:常用于32位和8位处理器;能够得到常用外设器件的支持;外设接口代码量低于0.5kB;引脚数量少;数据带宽可达10kBps;RAM用量少;一条总线上支持多种外设;方便使用API;不需要外部接口驱动硬件。
由于要求引脚数量少,所以必须采用串行接口。目前处理器中常见的串行接口包括SPI、I2C、USB和RS-232。通过从不同方面权衡比较这些接口,我最终选择了I2C,因为它接口简单,灵活性好,得到了大多数低成本控制器的支持。在不需要很高传输速度的情况下,较少的引脚数和流量控制功能还使得I2C接口相比SPI接口具有更大的优势。
I2C的工作原理
I2C是一种双线双向接口,包括一个时钟信号和一个数据信号(SCL和SDA)。在不增加任何其他信号的情况下,一条I2C总线就可以支持多达12个设备。I2C接口规范包括三种工作速度:100kbps、400kbps和3.4Mbps。大多数常见的控制器只支持100-和400kbps两种模式。I2C总线支持一个主设备多个从设备,或者多个主设备的配置结构。
I2C一个非常重要的特性就是它支持流量控制。如果某个从设备无法保持连续的字节传输,它可以将总线挂起,直到能够跟上主设备的传输速度。这对于包含最小规模的I2C硬件并且必须在固件上支持部分传输协议的从设备来说是非常有用的。I2C总线规范支持7b和10b两种寻址协议。我发现7b寻址模式在大部分应用中的效率更高。
在开始编写代码之前,我们需要很好地了解I2C总线的工作原理。任何情况下I2C总线至少要包含一个主设备,至少要挂有一个或多个从设备。主设备总是由主到从发起数据传输操作。无论有多少个外设挂接在总线上,I2C接口只有两个信号。
两个信号都是集电极开路的,通过大小为2.7k左右的上拉电阻接Vcc电源。SDA信号是双向的,可以由主设备或从设备驱动。SCL信号是由主设备驱动的,但是在一个数据字节的末尾从设备必须保持SCL信号为低,以延迟总线直到从设备开始处理数据。主设备在数据字节的最后一位传输完之后释放SCL信号,然后检查SCL信号是否变高。如果SCL没有变高,那么主设备认为从设备正在请求主设备延迟,直到其开始处理数据。
当通过I2C总线发送数据时,只有当SCL为低电平时才能进行数据变换。当SCL信号为高时,任何方向的数据都应该是稳定的.
当总线空闲时,主设备和从设备都不下拉SDA和SCL信号。在发起一次数据传输时,主设备驱动SDA信号从高电平变成低电平,同时SCL信号为高。一般地,当SCL信号为高电平时,SDA信号的状态保持不变,但启动或停止条件下除外。当SCL信号为高并且SDA信号从低变高时,是传输停止的情况(如图2所示)。
I2C总线以8b为单位传输数据。每传输一个字节时,必须得到数据接收方的确认。所有的数据都是从MSB(最高有效位)开始传输的。