OpenEdv-开源电子网

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

I2C 传输引脚设置是推挽还是开漏?

[复制链接]

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2010-12-15
在线时间
0 小时
发表于 2011-12-8 13:22:45 | 显示全部楼层 |阅读模式
如题,I2C引脚设置是推挽还是开漏?  
----------------------------------------------------------------------------------------- 
//初始化IIC
void IIC_Init(void)
{         
  RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟        
 GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
 GPIOC->CRH|=0X00033000;   
 GPIOC->ODR|=3<<11;     //PC11,12 输出高
}
----------------------------------------------------------------------------------------- 

我记得我以前设的是开漏,正点程序里的设置的推挽,想在这里求证一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2016-7-22 11:08:16 | 显示全部楼层
虽然过去了几年了,但是还是回复一下,我最近也遇到这个疑问了,原子配置的是推挽,但是网上好多用的是开漏,如你所说开漏输出该怎么读数据呢?我向硬件工程师问过开漏的原理后才明白,开漏输出自己是不能输出高电平,要靠外部上拉电阻,而且自己的管脚能检测到外部电压,配置开漏输出的时候,在receive函数你应该看到一个地方,
u8 I2C_ReceiveByte(void)        //数据从高位到低位//
{
        u8 i=8;
        u8 ReceiveByte=0;

        SDA_H;
        while(i--)
        {
                ReceiveByte<<=1;
                SCL_L;
                I2C_delay();
                SCL_H;
                I2C_delay();
                if(SDA_read)
                {
                        ReceiveByte|=0x01;
                }
        }
        SCL_L;
        return ReceiveByte;
}
if(SDA_read)定义为#define SDA_read        (GPIOB->IDR  & GPIO_Pin_7),就是检测IO口的电平状态,由于开漏的特殊性,当从器件往主器件传输数据的时候,我们检测到的IO状态应该刚好为从器件的输出波形,所以就能读到数据了
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-8 13:37:45 | 显示全部楼层
回复【楼主位】linda_xixi:
---------------------------------
我用的是推挽输出。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2013-12-28 13:11:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
设置成开漏输出后,没有改设置为输入能读数据吗?
为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-28 18:58:00 | 显示全部楼层
回复【3楼】unciauncia:
---------------------------------
读到的是错误的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2013-12-28 21:11:21 | 显示全部楼层

这个函数里也没有配置管脚为读模式直接就读了啊


为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2013-12-28 21:17:43 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
这个也没有配置为读模式啊,只有初始化时配置为开漏输出,然后又定义#define SDA_read  Cin(5)
#define SDA  Cout(5)         #define SCL  Cout(4)       就没有别的了,这个不是直接实现的吗?下图是STM32参考手册里108页 的图,上面说输出配置的时候施密特触发输入被激活,管脚数据会被采样到输入寄存器,你说读出的有数据有错误是因为开漏输出,外部不能讲IO口拉低或拉高是吗?
为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

6

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2013-1-11
在线时间
107 小时
发表于 2013-12-28 21:19:27 | 显示全部楼层

我是新手,刚接触STM32,还望原子大哥不吝赐教。O(∩_∩)O谢谢

为啥还要考试啊。。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-28 21:35:16 | 显示全部楼层
你看代码能看全一点么?
别摘一个函数,就长篇大论一翻,动笔千言,离题万里.

在执行这个函数之前,肯定有代码将PC5设置为输入。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-7-22 11:29:43 | 显示全部楼层

1、单主机的情况下,SCL可以用开漏,也可以用推挽;

2、无论什么情况,SDA必须开漏。


回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
发表于 2016-7-22 15:16:35 | 显示全部楼层
zhang00956 发表于 2016-7-22 11:08
虽然过去了几年了,但是还是回复一下,我最近也遇到这个疑问了,原子配置的是推挽,但是网上好多用的是开漏 ...

感谢,昨晚刚碰到问题,今早就看到您的回复就解决了,谢谢
本人交流群:136045527,欢迎各位大佬和萌新
回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
发表于 2016-7-22 15:16:47 | 显示全部楼层
xuande 发表于 2016-7-22 11:29
1、单主机的情况下,SCL可以用开漏,也可以用推挽;

2、无论什么情况,SDA必须开漏。

感谢,昨晚刚碰到问题,今早就看到您的回复就解决了,谢谢
本人交流群:136045527,欢迎各位大佬和萌新
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-7-23
在线时间
21 小时
发表于 2016-8-9 13:16:45 | 显示全部楼层
正点原子 发表于 2013-12-28 18:58
回复【3楼】unciauncia:
---------------------------------
读到的是错误的。

感觉还是该将SDA设置为开漏输出,在SDA发送数据结束后,等待应答的这个过程中,使用推挽模式,有明显的短路风险,虽然时间很短立刻切换为了输入模式,但在单步执行测试的过程中,着实吓了一跳。
回复 支持 反对

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2016-8-9 13:28:41 | 显示全部楼层
试一下 就好了 。反正实践出真知。
自己选择的路,成家前走完。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 20:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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