stm8 自带I2C终于调试成功。
1,此次调试I2C受益多多,首先证明官方的那个写EEPROM的程序是对的。
2, I2C的GPIO不要配置,我看到有些同仁把GPIO配置了。
3,为了大家用好STM8的I2C,我把程序烤下来。
STM8 I2C代码详解
STM8是一款由意法半导体(STMicroelectronics)推出的8位微控制器系列,它集成了多种功能,包括I2C(Inter-Integrated Circuit)通信接口。I2C是一种多主控、多从机的两线制串行通信协议,常用于设备间的低速数据传输,如传感器、EEPROM、LCD驱动器等。
在STM8中,I2C的初始化是通过设置相关寄存器实现的。从提供的代码片段来看,`IIC_Init()`函数完成了STM8 I2C的初始化工作。以下是对关键步骤的详细解释:
1. 开启I2C时钟:`CLK_PCKENR1 |= 0x01;` 这行代码使能了STM8的I2C时钟。
2. 设置I2C频率:`I2C_FREQR |= 0x10;` 这个操作将I2C的输入时钟频率设置为1MHz。
3. 初始化I2C控制寄存器:`I2C_CR1 = 0x00;` 清除I2C控制寄存器,禁用I2C外设;然后通过设置其他寄存器进行配置。
4. 配置I2C时钟控制寄存器:`I2C_CCRH` 和 `I2C_CCRL` 负责设置I2C的数据传输速率。这里没有具体数值,但通常会根据应用需求调整CCRH和CCRL的值来设定合适的SCL时钟速度。
5. 设置I2C传输使能寄存器:`I2C_TRISER = 0x11;` 这行代码设置了I2C的上升时间。
6. 启用I2C外设:`I2C_CR1 |= 0x01;` 开启I2C外设。
7. 配置其他控制寄存器:`I2C_CR2` 负责控制传输模式,如产生START信号、应答位等。
8. 设置自身I2C地址:`I2C_OARL` 和 `I2C_OARH` 用于设置STM8作为I2C从机时的7位地址。
在`Read_8816()`函数中,可以看到如何使用初始化后的I2C从8816器件读取数据的流程:
1. 等待总线空闲:`while(I2C_SR3 & 0x02);`
2. 产生START信号:`I2C_CR2 |= 0x01;`
3. 发送器件地址:`I2C_DR = 0x8a;`(这里是8816的写地址)
4. 等待传输完成并处理响应:`while(!(I2C_SR1 & 0x02));`
5. 发送数据索引:`I2C_DR = (UCHAR)(index);`
6. 再次产生START信号并切换到读模式:`I2C_CR2 |= 0x01;`,然后发送读地址`I2C_DR = 0x8b;`
7. 循环读取数据:根据剩余字节数读取数据,并根据需要设置是否发送应答位(最后一个字节不发送应答)以及产生STOP信号。
以上就是STM8 I2C的初始化及数据读取过程的基本概念和实现。调试过程中需要注意的是,不要对I2C的GPIO进行额外配置,因为它们已经被内部的I2C模块管理。同时,官方的EEPROM写入程序是正确的,可以作为参考。正确理解和使用这些代码可以帮助开发者在STM8平台上实现与其他I2C设备的有效通信。