Timeout,tickstart)!=HAL_OK){if(hi2c->ErrorCode==HAL_I2C_ERROR_AF){/* Generate Stop */hi2c->Instance->CR1|=I2C_CR1_STOP;returnHAL_ERROR;}else{returnHAL_TIMEOUT;}}/* Write data to DR */hi2c->Instance->
5. 寄存器部分 这部分主要涉及I2C外设的工作状态控制,涉及几个重要的寄存器,例如控制寄存器(I2C_CR1和I2C_CR2),控制寄存器配置I2C的工作方式,例如,开启PEC、SMBus 报警使能、DMA 发送/接收请求使能、数字噪声滤波器设置、中断是能、外设使能等等,此外还有中断和状态寄存器(I2C_ISR),当外设工作时,外设的工作状态修改可...
I2Cx→CR1 |= I2C while(!(I2Cx->SR1 | I2C_SR1_SB)){} 发送device address并且等待地址发送 I2Cx->DR = address << 1 | 0x01 FCSI2C_W_SCL(0) 这一步下拉SCL保证我们在设置寄存器的时候,硬件I2C不会做操作 I2C1->CR1 &= ~(I2C_CR1_ACK) 设置NACK while(!(I2Cx->SR1 | I2C_SR1_ADDR...
3.6 整体控制逻辑 整体控制逻辑负责协调整个I2C外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。在外设工作时, 控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和SR2)”,我们只要读取这些寄存器相关的寄存器位,就可以了解I2C的工作状态。 除此之外,控制逻辑还根据要求,负责控制产生I2C中断...
图例:条纹框:数据由主机传输到从机;白色框:数据由从机传输到主机。 S(传输开始信号):主机向总线广播,说,我要开始通讯了!至于向谁通讯呢?待会再说。 SLAVE_ADDRESS(从机地址):主机现在说,我要访问这个地址所在的设备!这个地址是7位或10位长。 R/W(读写位):接下来主机表示,我的访问操作是向这个设备写入数据...
{ I2C1->SR1; I2C1->CR1 |= 0x1; } } void I2C1_EV_IRQHandler(void) { uint8_t wert; uint32_t event; /* Reading last event */ event = I2C_GetLastEvent(I2C1); /* Event handle */ if(event == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) { // Master has sent the slave address...
5)设置I2C_CR1寄存器的起始位,以生成一个起始条件 外围输入时钟: 在sm mode下,至少2MHZ 在Fm mode下,至少4MHZ SCL主时钟生成 CCR位用于生成SCL时钟的高电平和低电平,分别从上升沿和下降沿的生成开始。当一个从设备可能延伸SCL线路时,外设在被编程的时间结束时检查来自总线的SCL输入,在上升沿生成时。
● 编程I2C_CR1寄存器启动外设 ●置I2C_CR1寄存器中的START位为1,产生起始条件 ●I2C模块的输入时钟频率必须至少是: ● 标准模式下为:1MHz ● 快速模式下为:4MHz 软件工程源代码1.关于工程 本文提供的工程代码是基于前面软件工程“STM8S-A04_UART基本收发数据”增加I2C接口修改而来。读写EEPROM的方式和之前“模...
@reg CR1- >NOSTRETCH */uint32_tLL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx);/* 检测是否启用时钟延长 @retval 1//启用 */ 5.自身地址设置 地址在从模式下由硬件自动比较 voidLL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx,uint32_tOwnAddress1,uint32_tOwnAddrSize);/* ...
5.1 I2C 控制寄存器 1 (I2C_CR1) I2C Control register 1 偏移地址:0x00 复位值:0x0000 5.2 I2C 控制寄存器 2 (I2C_CR2) I2C Control register 2 偏移地址:0x04 复位值:0x0000 5.3 I2C 自有地址寄存器 1 (I2C_OAR1) I2C Own address register 1 ...