[PIC®/AVR®/dsPIC®产品] 关于PIC单片机的I2C协议

[复制链接]
 楼主| Rain_King 发表于 2014-4-23 10:59 | 显示全部楼层 |阅读模式
本帖最后由 Rain_King 于 2014-4-24 09:19 编辑

      用PIC单片机普通的IO口模拟I2C通信,怎么每次通信的时候,会使单片机整个电压都会有10mv变化的脉冲啊......这个是什么原因???还是需要特殊的端口才可以???
huangxz 发表于 2014-4-23 22:42 | 显示全部楼层
总线工作的时候,电源电压如果会有脉冲,说明电源的负载能力比较差
yewuyi 发表于 2014-4-24 08:21 | 显示全部楼层
1、IIC总线需要的电流很小,如果这都能明显影响你的电源,你必须要好好检查。
2、检查IIC总线的两个上拉电阻,不建议太小,一般在1K~10K之间,多数都是用4.7K即可。
tozxq 发表于 2014-4-24 08:28 | 显示全部楼层
PIC单片机用普通脚模拟I2C总线时,请注意下IO口的输入输出切换,因PIC单片机输出是推挽方式,所以接受数据时需将引脚切换为输入方式,这里是与51单片机不同的地方,当未切换时,PIC单片机接收状态输出为高电平,相当于总线短接到VCC,这时,其它总线IC发送数据对地拉低脉冲,等于短路脉冲,所以可能会过流影响供电电压。
 楼主| Rain_King 发表于 2014-4-24 09:14 | 显示全部楼层
huangxz 发表于 2014-4-23 22:42
总线工作的时候,电源电压如果会有脉冲,说明电源的负载能力比较差

这或许是个原因......
 楼主| Rain_King 发表于 2014-4-24 09:15 | 显示全部楼层
yewuyi 发表于 2014-4-24 08:21
1、IIC总线需要的电流很小,如果这都能明显影响你的电源,你必须要好好检查。
2、检查IIC总线的两个上拉电 ...

或许真的是电源负载的问题,上拉电阻是必须有的.....
 楼主| Rain_King 发表于 2014-4-24 09:17 | 显示全部楼层
tozxq 发表于 2014-4-24 08:28
PIC单片机用普通脚模拟I2C总线时,请注意下IO口的输入输出切换,因PIC单片机输出是推挽方式,所以接受数据 ...

输入输出方向我肯定改了的,我就问下,如果设置方向后,需要延时多长时间就可以立马使用....比如我设置输出,赋值为高电平,这两个语句中间需要延时么.....
huangxz 发表于 2014-4-24 10:26 | 显示全部楼层
Rain_King 发表于 2014-4-24 09:17
输入输出方向我肯定改了的,我就问下,如果设置方向后,需要延时多长时间就可以立马使用....比如我设置输 ...

主要看是何种方式驱动,如果是推挽的,时间可以不计,如果是oc的,还是要点时间的,这个要实测比较好
ayb_ice 发表于 2014-4-24 11:32 | 显示全部楼层
总线中间串个电阻,如果还有变化,说明电源不行
 楼主| Rain_King 发表于 2014-4-24 11:48 | 显示全部楼层
huangxz 发表于 2014-4-24 10:26
主要看是何种方式驱动,如果是推挽的,时间可以不计,如果是oc的,还是要点时间的,这个要实测比较好 ...

PIC单片机有设置这种方式么.....我怎么没有见到,不是只有输入输出,B口是否上拉,模拟还是数字....就只有这个吧...
 楼主| Rain_King 发表于 2014-4-24 11:50 | 显示全部楼层
ayb_ice 发表于 2014-4-24 11:32
总线中间串个电阻,如果还有变化,说明电源不行

中间串了一个100欧姆的,还有我单片机是工作在5.0V,从机只能工作在3.8V,所以在I2C通信的时候,不知道这个是否也是个原因.....
ayb_ice 发表于 2014-4-24 11:58 | 显示全部楼层
Rain_King 发表于 2014-4-24 11:50
中间串了一个100欧姆的,还有我单片机是工作在5.0V,从机只能工作在3.8V,所以在I2C通信的时候,不知道这 ...

如果PIC输出只能是推挽模式,那确实有问题,会引起太电流

理论上电流表(5-3.8)/100R

 楼主| Rain_King 发表于 2014-4-25 08:37 | 显示全部楼层
ayb_ice 发表于 2014-4-24 11:58
如果PIC输出只能是推挽模式,那确实有问题,会引起太电流

理论上电流表(5-3.8)/100R

昨天我把PIC换成了硬件I2C通信,中间的那个电阻去掉,上拉换成5V,可是结果依然有脉冲.....总觉得某个地方有问题....
tozxq 发表于 2014-4-25 09:17 | 显示全部楼层
Rain_King 发表于 2014-4-24 09:17
输入输出方向我肯定改了的,我就问下,如果设置方向后,需要延时多长时间就可以立马使用....比如我设置输 ...

写两个子程序,一个IO口置高电平,将IO口设置为输入即可;一个IO口置低电平,将IO口设置为输出,在将IO口写低电平;I2C总线程序调用这两个子程序即可,至于停顿时间,一般加几个空指令即可
ayb_ice 发表于 2014-4-25 09:23 | 显示全部楼层
方法1:

上拉还是要的,然后在SCL,SDA中间串K级电阻,简单,但可能对通信速度有些影响

2:
去NXP官网,有官方的解决方法,专门解决电平不同的器件之间的连接
 楼主| Rain_King 发表于 2014-4-25 15:42 | 显示全部楼层
tozxq 发表于 2014-4-25 09:17
写两个子程序,一个IO口置高电平,将IO口设置为输入即可;一个IO口置低电平,将IO口设置为输出,在将IO口 ...

这个方法还真是犀利,换句话说,就是数据线用两个,一根输出,一根输入对吧.......哎,脚位不够啊,现在脚位刚好,一个不多,一个不少......
 楼主| Rain_King 发表于 2014-4-25 16:09 | 显示全部楼层
ayb_ice 发表于 2014-4-25 09:23
方法1:

上拉还是要的,然后在SCL,SDA中间串K级电阻,简单,但可能对通信速度有些影响

我去官网好好找找....貌似好东西很多
tozxq 发表于 2014-4-26 08:07 | 显示全部楼层
Rain_King 发表于 2014-4-25 15:42
这个方法还真是犀利,换句话说,就是数据线用两个,一根输出,一根输入对吧.......哎,脚位不够啊,现在 ...

误解我的意思了,我I2C总线自然使用两个IO口,指示总线置高电平时设置为输入即可,因外部有上拉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:努力学习,积极回复,只为申请版主.......

29

主题

784

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:努力学习,积极回复,只为申请版主.......

29

主题

784

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部