尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

I2C IIC

I2C IIC I2C简介I2C前置需求 实现单片机读写外部模块寄存器的功能I2C定义I2C引脚线 时钟线SCL 数据线SDA工作模式 同步半双工stm32f103c8t6资源 I2C1 I2C2配置 SCL与SDA复用引脚都配置成开漏输出模式通信速率 标志100KHZ 高速400KHZ协议帧格式 指定地址写起始 7位从机地址1位写位 1位应答位 8位寄存器地址 1位应答位 写入1字节数据 1位应答位 结束 指定地址读起始 7位从机地址1位写位 1位应答位 8位寄存器地址 1位应答位 起始 7位从机地址1位读位 1位应答位 写入1字节数据 1位非应答位 结束注意每往寄存器写入或读出一个字节寄存器地址指针加1时序 SCL起始高电平 数据传输高电平期间读取数据 低电平期间变换数据 停止低电平 SDA:起始:SCL时钟线高电平期间SDA产生一个下降沿 数据传输SCL指导下高低电平翻转 应答拉高或拉低 结束:SCL时钟线高电平期间SDA产生一个上升沿注意SCL时序单片机控制 SDA时序单片机与外挂模块共同控制 SCL控制数据收发SCL停了时序就暂停了数据传输就停止了而USART按双方约定波特率进行数据收发时序要求严格软件模拟被中断打断就会出问题一方停了另一方不会停数据交换还在进行 主机和从机始终处于接收模式谁想发送就去获得SDA控制权数据传输 高位先行I2C函数I2C初始化函数函数使用 函数I2C_Init 入参I2C 结构体指针 返回值无I2C_InitTypedef结构体成员变量 I2C_DutyCycle时钟频率 100kHZ的标准时钟频率时SCL波形占空比固定50%时钟频率 100kHZ的标准时钟频率时,可配置参数I2C_DutyCycle_16_9 I2C_DutyCycle_2 低电平高电平 169 / 2:1I2C_AcknowledgedAddress单片机作为从机时的地址位数 I2C_OwnAddress1单片机作为从机时的地址函数调用示例​I2C使能函数函数使用 函数I2C_Cmd 入参 I2C ENABLE / DISABLE 返回值无函数调用示例I2C_Cmd(I2C2, ENABLE);I2C起始条件生成函数函数使用 函数I2C_GenerateStart 入参 I2C ENABLE / DISABLE 返回值无函数调用示例I2C_GenerateStart(I2C2, ENABLE);I2C结束条件生成函数函数使用 函数I2C_AcknowledgeConfig 入参 I2C ENABLE / DISABLE 返回值无函数调用示例I2C_AcknowledgeConfig(I2C2, ENABLE);I2C等待事件函数函数使用 函数I2C_CheckEvent 入参 I2C 事件 返回值SUCCESS / ERROR函数调用示例//发送一个字节的时序 I2C_GenerateSTART(I2C2, ENABLE); //硬件I2C生成起始条件 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); //等待EV5 ​ I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter); //硬件I2C发送从机地址方向为发送 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); //等待EV6 ​ I2C_SendData(I2C2, RegAddress); //硬件I2C发送寄存器地址 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING); //等待EV8 ​ I2C_SendData(I2C2, Data); //硬件I2C发送数据 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); //等待EV8_2 ​ I2C_GenerateSTOP(I2C2, ENABLE); //硬件I2C生成终止条件 ​ *注意* 数据间隔之间等待EV6事件 发送的最后一个数据得等待EV8_2事件 ​ //接收一个字节的时序 I2C_GenerateSTART(I2C2, ENABLE); //硬件I2C生成起始条件 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); //等待EV5 I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter); //硬件I2C发送从机地址方向为发送 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); //等待EV6 I2C_SendData(I2C2, RegAddress); //硬件I2C发送寄存器地址 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); //等待EV8_2 I2C_GenerateSTART(I2C2, ENABLE); //硬件I2C生成重复起始条件 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); //等待EV5 I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Receiver); //硬件I2C发送从机地址方向为接收 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); //等待EV6 I2C_AcknowledgeConfig(I2C2, DISABLE); //在接收最后一个字节之前提前将应答失能 I2C_GenerateSTOP(I2C2, ENABLE); //在接收最后一个字节之前提前申请停止条件 I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED); //等待EV7 Data I2C_ReceiveData(I2C2); //接收数据寄存器 I2C_AcknowledgeConfig(I2C2, ENABLE); //将应答恢复为使能为了不影响后续可能产生的读取多字节操作 ​ *注意* 读取单个字节在EV6事件后给非应答并产生结束条件读取多个字节需在EV7_1事件之前给非应答并产生结束 ​ *总注意* 发送一个数据后产生EV8事件发送最后一个数据产生EV8_2事件EV8_1无需理会 接收一个数据后产生EV7事件接收最后一个数据产生EV7_1事件EV6_1无需理会I2C应答使能函数函数使用 函数I2C_GenerateStop 入参 I2C ENABLE / DISABLE 返回值无函数调用示例I2C_GenerateStop(I2C2, ENABLE);I2C寻址函数函数使用 函数I2C_Send7bitAddress 入参I2C 地址 方向 返回值单字节数据函数调用示例uint8_t data I2C_ReceiveData(I2C2);注意内部自带应答过程I2C发送单字节数据函数函数使用 函数I2C_SendData 入参I2C 单字节数据 返回值无函数调用示例uint8_t a 0x88; I2C_SendData(I2C2, a);注意写入DR硬件自动清除TXE标志位I2C接收单字节数据函数函数使用 函数I2C_ReceiveData 入参I2C 返回值单字节数据函数调用示例uint8_t data I2C_ReceiveData(I2C2);注意读出DR硬件自动清除RXNE标志位I2C标志位I2C模块函数iic_init:RCC_APB1PeriphClockCmd RCC_APB2PeriphClockCmd GPIO_Init I2C_Init I2C_Cmdiic_sendbyte_resgister:I2C_GenerateSTART I2C_CheckEvent//等待EV5 I2C_Send7bitAddress I2C_CheckEvent//等待EV6 I2C_SendData I2C_CheckEvent//等待EV8 I2C_SendData I2C_CheckEvent//等待EV8_2 I2C_GenerateSTOPiic_readbyte_resgister:I2C_GenerateSTART I2C_CheckEvent//等待EV5 I2C_Send7bitAddress I2C_CheckEvent//等待EV6 I2C_SendData I2C_CheckEvent//等待EV8_2 I2C_GenerateSTART I2C_CheckEvent//等待EV5 I2C_Send7bitAddress I2C_CheckEvent//等待EV6 I2C_AcknowledgeConfig(I2C2, DISABLE); //在接收最后一个字节之前提前将应答失能 I2C_GenerateSTOP(I2C2, ENABLE); //在接收最后一个字节之前提前申请停止条件 I2C_CheckEvent//等待EV7 Data I2C_ReceiveData I2C_AcknowledgeConfig //将应答恢复为使能
返回列表