当使用GPIO模拟IIC时,数据线SDA对应的GPIO模式应该设置为开漏输出模式(Open-Drain)。这是因为IIC总线是双向的,需要支持数据线的双向传输。 在开漏输出模式下,GPIO引脚可以被设置为输出低电平(0)或者输出高阻抗状态(高电平)。当GPIO引脚处于高阻抗状态时,总线上的上拉电阻会将总线拉高,从而允许其他设备在总线上传输数...
GPIO_Init(GPIOC, &GPIO_InitStructure); IIC_SCL=1;//初始化拉高SCL IIC_SDA=1;//初始化拉高SDA } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 在初始化的时候,SDA和SCL都置为1,表示拉高闲置状态 <2>:产生起始信号 先将SDA和SCL置高,然后在SDA拉低时进行延时,然后将SCL拉低 ...
SDA是高电平, 说明主设备A可以占用总线, 然后主设备A将SDA拉低, 开始通信。 SDA是低电平, 说明有人已经捷足先登了, 主设备A不能占用总线, 结束通信。 因此,模拟IIC一定要将GPIO端口设置为开漏输出并加上上拉电阻,硬件IIC会自动配置为开漏输出。 审核编辑:汤梓红 打开APP阅读更多精彩内容...
iic的两个引脚SDA与SCL都要求既能输出又能输入。这对stm32来说问题不大,由参考手册给出的图来看,引脚是始终连着IDR寄存器的,另外“输出配置”一节还特意讲到,“在开漏模式时,对输入数据寄存器的读访问可得到I/O状态”。所以,模式的问题很好解决。 SDA线是由不同的器件分时控制的,这就造成一个问题:当一个器件...
(1)读取GPIO的输入状态,在配置为什么模式下需要先写1,然后读才能读正确?因为此实验部分代码用的是位带操作,没有使用库函数。 (2)在使用硬件IIC时,到底GPIO模式应该设置为什么模式?其中(7)是从网上看到的,表24摘自《STM32中文参考手册》 (3)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输...
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStruct.GPIO_Pin = IIC_SCL|IIC_SDA; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_Port,&GPIO_InitStruct);//GPIO配置 I2C_InitTypeDef I2C_InitStruct; I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; ...
IIC通信启动 在模拟IIC通信时,首先需要启动IIC通信。这通常涉及将GPIO引脚配置为适当的输出模式,并发送起始信号。起始信号由主设备发出,通过将SDA引脚拉至低电平并保持SCL引脚为高电平来标识IIC通信的起始。一旦起始信号发出,IIC通信便正式开始,后续的数据传输和应答处理将按照IIC协议的规定进行。
// 将IIC SDA的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SDA_GPIO_PIN; GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); // 配置IIC的工作参数 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;//使能应答 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddres...
首先是配置I2C的GPIO,然后配置I2C参数。就是常规配置,按流程来写不会错。 /** * @brief EEPROM IIC 配置 */ void I2C_EE_config(void) { GPIO_InitTypeDef GPIO_InitStruct; I2C_InitTypeDef I2C_InitStruct; // 开启I2C GPIO时钟 EPROM_I2C_GPIO_APBxClkCmd(EEPROM_I2C_SCL_GPIO_CLK | EEPROM_I2C_SDA_...
SDA 输入输出模式改变 方式一 SCL线可以配置推挽输出,开漏输出(有上拉电压存在)都可,因为不用兼具输入扫描功能; SDA线必须配置开漏输出,电路上要外加上拉电阻,因为要兼具输入扫描功能, 方式二 对应的gpio口配置代码的改变 #define SCCB_SDA_IN() {GPIOG->CRH&=0XFF0FFFFF;GPIOG->CRH|=0X00800000;} ...