|
学习安富莱的例程发现,下面代码里,没有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? ********************************************************/
|
|