硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2978|回复: 10
收起左侧

[I2C] 请教安富莱GT911驱动里I2C端口不需要设置为读,是如何实现功能的?

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2020-6-9 17:44:45 | 显示全部楼层 |阅读模式
学习安富莱的例程发现,下面代码里,没有SDA和SCL引脚从输出改为输入的设置,却能完成I2C的读写,弄不明白了,所以进来请教;
代码如下:
#include "bsp.h"

/*
        安富莱STM32-V7开发板 i2c总线GPIO:
                PB6/I2C1_SCL
                PB9/I2C1_SDA
*/

/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define I2C_SCL_GPIO        GPIOB                        /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_GPIO        GPIOB                        /* 连接到SDA数据线的GPIO */

#define I2C_SCL_PIN                GPIO_PIN_6                        /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN                GPIO_PIN_9                        /* 连接到SDA数据线的GPIO */

#define ALL_I2C_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOB_CLK_ENABLE()

/* 定义读写SCL和SDA的宏 */
#define I2C_SCL_1()  I2C_SCL_GPIO->BSRRL = I2C_SCL_PIN                                /* SCL = 1 */
#define I2C_SCL_0()  I2C_SCL_GPIO->BSRRH = I2C_SCL_PIN                                /* SCL = 0 */

#define I2C_SDA_1()  I2C_SDA_GPIO->BSRRL = I2C_SDA_PIN                                /* SDA = 1 */
#define I2C_SDA_0()  I2C_SDA_GPIO->BSRRH = I2C_SDA_PIN                                /* SDA = 0 */

#define I2C_SDA_READ()  ((I2C_SDA_GPIO->IDR & I2C_SDA_PIN) != 0)        /* 读SDA口线状态 */
#define I2C_SCL_READ()  ((I2C_SCL_GPIO->IDR & I2C_SCL_PIN) != 0)        /* 读SCL口线状态 */


*
*********************************************************************************************************
*        函 数 名: bsp_InitI2C
*        功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
*        形    参:  无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitI2C(void)
{
        GPIO_InitTypeDef gpio_init;

        /* 第1步:打开GPIO时钟 */
        ALL_I2C_GPIO_CLK_ENABLE();
       
        gpio_init.Mode = GPIO_MODE_OUTPUT_OD;        /* 设置开漏输出 */
        gpio_init.Pull = GPIO_NOPULL;                        /* 上下拉电阻不使能 */
        gpio_init.Speed = GPIO_SPEED_FREQ_LOW;        // GPIO_SPEED_FREQ_HIGH;  /* GPIO速度等级 */
       
        gpio_init.Pin = I2C_SCL_PIN;       
        HAL_GPIO_Init(I2C_SCL_GPIO, &gpio_init);       
       
        gpio_init.Pin = I2C_SDA_PIN;       
        HAL_GPIO_Init(I2C_SDA_GPIO, &gpio_init);       

        /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
        i2c_Stop();
}


/***********************上面代码将SDA和SCL都设置成了OUT*******************************************/

。。。

*********************************************************************************************************
*        函 数 名: i2c_ReadByte
*        功能说明: CPU从I2C总线设备读取8bit数据
*        形    参:  无
*        返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
        uint8_t i;
        uint8_t value;

        /* 读到第1个bit为数据的bit7 */
        value = 0;
        for (i = 0; i < 8; i++)
        {
                value <<= 1;
                I2C_SCL_1();
                i2c_Delay();
                if (I2C_SDA_READ())
                {
                        value++;
                }
                I2C_SCL_0();
                i2c_Delay();
        }
        return value;
}


/*******************上面代码如何实现的  I2C_SDA_READ? ********************************************************/




回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-6-9 17:46:39 | 显示全部楼层
代码来源于  :《V7-034_LCD的电阻触摸和电容触摸(电阻触摸支持2点和4点校准)》
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2020-6-9 18:52:43 | 显示全部楼层
GPIO_MODE_OUTPUT_OD  设置的是开漏输出,支持读写。外部必须加上拉电阻。这是IIC总线的标准形式。
回复

使用道具 举报

7

主题

114

回帖

135

积分

初级会员

积分
135
发表于 2020-6-9 20:33:30 | 显示全部楼层
IO口设置为开漏输出就可以
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-6-9 21:22:35 | 显示全部楼层
诚恳求教!版主指点一下吧?
回复

使用道具 举报

17

主题

101

回帖

152

积分

初级会员

积分
152
发表于 2020-6-9 21:54:35 | 显示全部楼层
stm32输出模式也是可以读gpio状态的,比较特殊,其他单片机得设置输入模式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2020-6-10 09:33:03 | 显示全部楼层
设置开漏即可,开漏的优势如下:

7.png
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-6-10 10:00:33 | 显示全部楼层
多谢版主及诸位的解答!!!感谢及佩服版主!!!!
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-6-10 10:01:51 | 显示全部楼层
sanit 发表于 2020-6-9 18:52
GPIO_MODE_OUTPUT_OD  设置的是开漏输出,支持读写。外部必须加上拉电阻。这是IIC总线的标准形式。

太感谢了!
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-6-10 10:02:15 | 显示全部楼层
初晴sama 发表于 2020-6-9 21:54
stm32输出模式也是可以读gpio状态的,比较特殊,其他单片机得设置输入模式

多谢多谢!
回复

使用道具 举报

25

主题

287

回帖

367

积分

高级会员

积分
367
发表于 2020-6-10 12:01:41 | 显示全部楼层
参考手册里描述的很清楚,以参考手册为准
微信截图_20200610120043.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 02:38 , Processed in 0.298686 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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