本帖最后由 witant 于 2013-6-24 11:46 编辑
IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由菲利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。现在许多器件如A/D转换、E2PROM等都采用IIC接口,若电路设计时受到引脚或其它原因的限制,则多会采用模拟IIC的方式与其通讯。但常见的模拟IIC通讯机制在电气特性上存在弊端,本文就对模拟IIC通讯的常见用法进行分析。 标准IIC中SCL时钟引脚和SDA数据引脚为漏极开路输出,因此均应接上拉电阻。由于一般应用中只有单片机一个主机,因此SCL引脚可用推挽输出代替。针对SDA引脚,同样应设置成不具有驱动能力的开漏输出,但部分MSP430引脚无开漏输出模式,因此常见的做法是在输出数据时将SDA引脚设置成输出模式、读取数据时再将其设置为输入模式。 该方法的弊端在于当MSP430发送一个完整的字节后,相应芯片会拉低SDA,即回复一个ACK信号,而此时MSP430的SDA引脚还没有及时切换为输入状态,若单片机输出为高电平,则会与器件发出的ACK信号冲突,即发生“短路”现象,如图所示,那个不高不低的电平就是冲突信号。
===>>
注:左图中上方波形为SCL引脚电压 下方波形为SDA引脚电压
这样会对器件及周边电路产生不良影响,最明显的现象是对供电能力不强的电路产生电压波动现象,引脚驱动能力越强,电压波动越明显。如图所示:
注:图中上方波形为芯片电源电压 下方波形为SDA引脚电压
为避免上述弊端,可以利用MSP430引脚在输入状态下为高阻态这一特性来改进:在需要输出高电平时将SDA脚设置为输入状态,此时由于上拉电阻,总线为高电平;需要输出低电平时将SDA设置为输出状态并将输出寄存器设置为输出低电平即可,这样既可以正常通讯又能够避免总线短路的问题。 假设采用P1.0作为IIC通讯的时钟脚,P2.0作为IIC通讯的数据脚,则初始化函数为: void Init_IIC(void) { P1DIR |= BIT0; P1OUT |= BIT0; P2DIR &= ~BIT0; P2OUT &= ~BIT0; } 对应IO输出代码为 #define IIC_SCL_1 P1OUT |= BIT0 #define IIC_SCL_0 P1OUT &= ~BIT0 #define IIC_SDA_1 P2DIR &= ~BIT0 #define IIC_SDA_0 P2DIR |= BIT0 经测试,改进后的输出方式可以避免上述问题,增加系统的稳定性。 |