打印

MSP430模拟IIC通讯的弊端与改进

[复制链接]
5037|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
witant|  楼主 | 2013-6-24 11:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
经测试,改进后的输出方式可以避免上述问题,增加系统的稳定性。
评分
参与人数 1威望 +2 收起 理由
hjl240 + 2 很给力!

相关帖子

沙发
acer4736| | 2013-6-24 23:23 | 只看该作者
了解一下 呵呵

使用特权

评论回复
板凳
angerbird| | 2013-6-24 23:39 | 只看该作者
IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由菲利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。

使用特权

评论回复
地板
angerbird| | 2013-6-24 23:40 | 只看该作者
楼主总的姐蛮好的,模拟IIC总线的关键是需要注意时序的

使用特权

评论回复
5
jinpaidianzi| | 2013-6-24 23:49 | 只看该作者
学习一下吧

使用特权

评论回复
6
i1mcu| | 2013-6-24 23:53 | 只看该作者
宏定义的使用还是很广泛的。

使用特权

评论回复
7
i1mcu| | 2013-6-24 23:53 | 只看该作者
修改代码还是宏定义方便的。

使用特权

评论回复
8
teabottle| | 2013-6-25 00:27 | 只看该作者
学习学习

使用特权

评论回复
9
wangjinlili| | 2013-6-25 00:48 | 只看该作者
很有用,谢谢分享

使用特权

评论回复
10
jekey| | 2013-6-25 09:30 | 只看该作者
本帖最后由 jekey 于 2013-6-25 09:32 编辑

想法不错,但是,还是会有冲突。 当输出为低时,若由于器件错误(或命令错误),器件来个NACK,一样会出现楼主说的电平冲突。
在没有开漏输出的情况下,可以串入100欧电阻。

使用特权

评论回复
11
lz80650904| | 2013-6-25 10:42 | 只看该作者
学习了

使用特权

评论回复
12
witant|  楼主 | 2013-6-25 16:39 | 只看该作者
jekey 发表于 2013-6-25 09:30
想法不错,但是,还是会有冲突。 当输出为低时,若由于器件错误(或命令错误),器件来个NACK,一样会出现 ...

冲突应该是不会的,因为IIC器件发送NACK时SDA引脚为开漏,发送ACK时是低电平,IIC协议的器件是不会主动输出高电平的

使用特权

评论回复
13
smilingangel| | 2013-6-25 23:16 | 只看该作者
弊端在于当MSP430发送一个完整的字节后,相应芯片会拉低SDA,即回复一个ACK信号,而此时MSP430的SDA引脚还没有及时切换为输入状态,若单片机输出为高电平,则会与器件发出的ACK信号冲突,即发生“短路”现象

使用特权

评论回复
14
smilingangel| | 2013-6-25 23:17 | 只看该作者
这个问题的我还真没怎仔细的分析过的,很是感谢楼主的

使用特权

评论回复
15
sra098| | 2014-3-2 15:51 | 只看该作者
nice ~~~困扰了好久

使用特权

评论回复
16
bobde163| | 2014-3-3 21:06 | 只看该作者
谢谢,很有意义的分析

使用特权

评论回复
17
Jarvan| | 2014-3-6 16:46 | 只看该作者
我做的波形也有一个毛刺,但是从来东没有发生冲突。

使用特权

评论回复
18
强仔00001| | 2014-3-7 10:11 | 只看该作者
楼主牛

使用特权

评论回复
19
logn| | 2014-3-10 10:07 | 只看该作者
谢谢分享

使用特权

评论回复
20
lkl0305| | 2014-3-10 10:18 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

2

粉丝