OpenEdv-开源电子网

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

软件模拟iic时,GPIO口设置成开漏还是推挽,为什么 开漏可以成功,推挽就不行

[复制链接]

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-9-4
在线时间
21 小时
发表于 2020-1-14 14:07:06 | 显示全部楼层 |阅读模式
#define GPIO_PORT_I2C        GPIOA                             // GPIO端口A
#define I2C_SCL_PIN                GPIO_PIN_0                         // 连接到SCL时钟线的GPIO 0
#define I2C_SDA_PIN                GPIO_PIN_1                         // 连接到SDA数据线的GPIO 1
/*
* debug yhn: 软件模拟iic GPIO口配置为开漏输出OUT_OD,否则会出现 无法读取的情况 原因可能是 GPIO_PORT_I2C->IDR & I2C_SCL_PIN 读端口位
*/

/* 定义读写SCL和SDA的宏 */
#define I2C_SCL_1()  HAL_GPIO_WritePin(GPIO_PORT_I2C,I2C_SCL_PIN,GPIO_PIN_SET)                         // SCL = 1
#define I2C_SCL_0()  HAL_GPIO_WritePin(GPIO_PORT_I2C,I2C_SCL_PIN,GPIO_PIN_RESET)                // SCL = 0

#define I2C_SDA_1()   HAL_GPIO_WritePin(GPIO_PORT_I2C,I2C_SDA_PIN,GPIO_PIN_SET)                   // SDA = 1
#define I2C_SDA_0()   HAL_GPIO_WritePin(GPIO_PORT_I2C,I2C_SDA_PIN,GPIO_PIN_RESET)                  // SDA = 0

#define I2C_SDA_READ()  (GPIO_PORT_I2C->IDR & I2C_SDA_PIN)                                                // 读SDA口线状态
#define I2C_SCL_READ()  (GPIO_PORT_I2C->IDR & I2C_SCL_PIN)                                                // 读SCL口线状态



  /*Configure GPIO pins : PA0 PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-9-4
在线时间
21 小时
 楼主| 发表于 2020-1-14 14:10:13 | 显示全部楼层
读eeprom m24c64  3.3v    硬件上拉4.7k至3.3v
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-1-14 15:39:37 | 显示全部楼层
IIC 模拟一般用开漏比较多,ST官方的好像用的就是开漏
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-1-15
在线时间
0 小时
发表于 2020-1-15 12:34:31 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2020-1-16 06:31:21 | 显示全部楼层
时钟线推挽应该没啥问题,因为一般情况下时钟线只由主机控制
数据线用推挽的话 怎么判断从机发送的数据是高还是低?难不成还要切回到输入模式,另外你用推挽输出肯定不会在外部做上拉的,如果从机内部再不带上拉,只是用上拉输入不太确定能不能行……
有开漏这么省事的方式,为啥要搞那么复杂……本身I2C的特点就是都用开漏模式接在一条线上 谁拉低谁说了算嘛
回复 支持 反对

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2020-1-16 06:32:06 | 显示全部楼层
咦?我刚才发的没显示出来???
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-10-12
在线时间
30 小时
发表于 2020-1-30 23:25:55 来自手机 | 显示全部楼层
因为i2c的工作原理就要求必须开漏,否则你读取ack信号的时候,从器件无法拉低电位。
回复 支持 反对

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
668
金钱
668
注册时间
2019-7-28
在线时间
60 小时
发表于 2020-2-5 19:19:46 | 显示全部楼层
物理链路要求OC/OD,否则无法有“网络”!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 14:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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