OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5116|回复: 7

推挽输出,会不会出现短路的问题

[复制链接]

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-6-24
在线时间
5 小时
发表于 2015-10-16 15:20:32 | 显示全部楼层 |阅读模式
5金钱
void IIC_Init(void)
{                         
     RCC->APB2ENR|=1<<3;//先使能外设IO PORTB时钟                             
    GPIOB->CRH&=0XFFFF00FF;//PB1/11 推挽输出
    GPIOB->CRH|=0X00003300;       
    GPIOB->ODR|=3<<10;     //PB10,11 输出高
}
用软件模拟IIC接口,疑问:这个接口是一个线与的关系,当端口是推挽输出时,如果出现竟争总线时,不就短路了。想不明白,这为什么要用推挽。路过的大神指点一下,分析下整个过程

最佳答案

查看完整内容[请看2#楼]

是可能存在打架的问题. 所以是需要写好了.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-16 15:20:33 | 显示全部楼层
是可能存在打架的问题.
所以是需要写好了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-16 22:21:17 | 显示全部楼层
因为推挽输出可以输出0和1.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-6-24
在线时间
5 小时
 楼主| 发表于 2015-10-17 08:15:40 | 显示全部楼层
这个我知道能输出0和1,但是我不明白,为什么这个地方适合用推挽输出这样的形式。当出现竟争时,怎么办?为什么不会短路呢?求解
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11577
金钱
11577
注册时间
2014-4-1
在线时间
1321 小时
发表于 2015-10-17 10:42:38 | 显示全部楼层
你认为,什么情况会短路呢?
回复

使用道具 举报

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-6-24
在线时间
5 小时
 楼主| 发表于 2015-10-17 11:22:00 | 显示全部楼层
 当有多主机存在的时候,一主机空闲,此时SDA是推挽输出1(打开P-MOS),另一主机开始发送,把SDA推挽输出0(打开N-MOS),在这种情况下,就发生短路了。


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11577
金钱
11577
注册时间
2014-4-1
在线时间
1321 小时
发表于 2015-10-17 13:08:56 | 显示全部楼层
回复【5楼】gao7986130474:
---------------------------------
有道理。 外部设备如果驱动为0,就会冲突了。
所以应当按规则,设置为开漏。

不过,现实中很多人设为推挽,可能芯片有其他保护电路吧。
但确实应当设为开漏。
回复

使用道具 举报

0

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2015-10-16
在线时间
71 小时
发表于 2015-10-17 14:33:04 | 显示全部楼层
回复【5楼】gao7986130474:
---------------------------------
      如果用IO口软件模拟I2C,只在MCU发送数据或器件地址的时候我才将IO口配置成推挽输出,其他情况下应该配置为input。IO口应在外部加上拉电阻。
比如I2C_Init()时,应该将IO口配置为input状态。I2C在空闲时,应该将IO口配置为input状态。在I2C_Start()时再将IO口变为输出。发送完地址后,立马将IO口变输入,读从器件是否响应……,在发送I2C_Stop()后,将MCU的IO口置低。

     I2C经常用的是一主多从。多主的我没用过,也没见过谁用过。

      如果是一主多从的话,模拟SCL的IO口可以一直保持为推挽输出状态,不会来回切。只需要根据不同状态,配置SDA对应的IO口的状态。

     当然将IO口设置为开漏状态就比较简单,不用想啥时候该改变IO口的输入输出状态。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 20:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表