打印

IO口模拟I2C

[复制链接]
3682|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
erichuolo|  楼主 | 2012-9-12 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次用普通IO口模拟I2C接口。

用pic16F1933单片机的RB5(SDA), RB4(SCL)模拟SDA,SCL。结果调了半天也没调出来。两根线都接了10k的上拉电阻。

最后还是把这两根相应的输出线接到RC4和RC3(单片机定义的I2C输出引脚。)才算是模拟成功。

不知道为什么一定要接在这两个引脚上才能模拟成功?

难道是IO口初始化的问题?我把两根普通IO都设成了输出模式。也有做为SCL的那个引脚设成高电平输出的。试了不少组合。
    ANSELA      = 0b00000000;      
    ANSELB      = 0b00110000;      
    TRISA       = 0b00000000; //output
    TRISB       = 0b00100000;
    TRISC       = 0b00000000; //MSB...LSB
   
    PORTA       = 0b11001110;   
    PORTB       = 0b00000000;   
    PORTC       = 0b00000111;//  
我也把几种可能的情况试了一下,只要不是接在单片机定义的I2C输出引脚,就是不能成功通信。

不知是何道理,还望赐教!谢谢!

相关帖子

沙发
gx_huang| | 2012-9-12 17:41 | 只看该作者
说明你还没有理解I2C的精髓:任何器件都只能拉低总线,拉高总线需要外部的上拉电阻。

当你需要输出0时,设置成OD输出0。
当你需要输出1时,设置成输入。
当你需要读取时,设置成输入。

使用特权

评论回复
板凳
阿南| | 2012-9-13 09:26 | 只看该作者
楼主先要确定设置的IO口是否已经满足你想要出高电平或低电平的信号,用示波器测量是最直接的,一看就知道有无高低电平的变化。如果没有示波器,那么用万用表测量也是可以的,如果可以单步运行最好,没有就将IO口电平变化时间设置长一些。

使用特权

评论回复
地板
zhaoyu2005| | 2012-9-17 16:16 | 只看该作者
如果PIC(做主机)与从机SDA相连的引脚能能配置成OD,并且能读端口状态(时间长记不清了,实际应该是可以的),那就设置成OD,需要输出时正常输出,需要输入时先输出1,然后读端口状态寄存器(也就是输入寄存器)或者端口电平。不用进行输入、输出切换,否则,就得进行切换。
LZ需要明白,SCL的方向是固定的,但是SDA的方向需要切换的

使用特权

评论回复
5
erichuolo|  楼主 | 2012-10-30 17:22 | 只看该作者
多谢各位的支持,等有空试一下。

使用特权

评论回复
6
xiaxiadexiaxia| | 2013-6-25 10:47 | 只看该作者
zhaoyu2005 发表于 2012-9-17 16:16
如果PIC(做主机)与从机SDA相连的引脚能能配置成OD,并且能读端口状态(时间长记不清了,实际应该是可以的 ...

需要输入时先输出1,然后读端口状态寄存器。不用进行输入输出的切换,否则就得进行切换,??这两句话什么意思的?是说我读取应答信号的时候不需要将IO口配置为输入脚,直接给它先赋值位1,然后直接读取吗?

使用特权

评论回复
7
licall| | 2013-6-25 22:24 | 只看该作者
网上有很多例子(51单片机的例子).

使用特权

评论回复
8
金则立则翔| | 2013-6-26 13:32 | 只看该作者
多多实践!

使用特权

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

本版积分规则

个人签名:有心皆苦,无心即乐

9

主题

142

帖子

1

粉丝