基于STM32实现模拟3个I2C口操作2个SHT20和1个DS3231,并通过串口输出数据的解决方案。结合了软件I2C的灵活性和硬件I2C的稳定性,适用于需要多设备通信的场景。
#include "stm32f1xx_hal.h"
#define IIC_DELAY_TIME 1
typedef struct {
GPIO_TypeDef* SCL_GPIO;
uint16_t SCL_Pin;
GPIO_TypeDef* SDA_GPIO;
uint16_t SDA_Pin;
} IIC_TypeDef;
void IIC_Init(IIC_TypeDef* iic) {
// GPIO初始化代码
}
void IIC_Start(IIC_TypeDef* iic) {
// 软件I2C起始信号
}
void IIC_Stop(IIC_TypeDef* iic) {
// 软件I2C停止信号
}
void IIC_SendByte(IIC_TypeDef* iic, uint8_t dat) {
// 发送字节
}
uint8_t IIC_ReadByte(IIC_TypeDef* iic) {
// 读取字节
return 0;
}
uint8_t IIC_Sack(IIC_TypeDef* iic) {
// 等待应答
return 0;
}#define SHT20_ADDR 0x80
float SHT20_ReadTemperature(IIC_TypeDef* iic) {
uint8_t cmd = 0xF3;
IIC_Start(iic);
IIC_SendByte(iic, SHT20_ADDR);
IIC_SendByte(iic, cmd);
IIC_Stop(iic);
HAL_Delay(85); // 等待测量完成
IIC_Start(iic);
IIC_SendByte(iic, SHT20_ADDR | 1); // 读模式
uint8_t data[2];
data[0] = IIC_ReadByte(iic);
IIC_Ack(iic, 1);
data[1] = IIC_ReadByte(iic);
IIC_Ack(iic, 0);
IIC_Stop(iic);
float temp = -46.85 + 175.72 * (((uint16_t)data[0] << 8) | data[1]) / 65536.0;
return temp;
}#define DS3231_ADDR 0x68
void DS3231_ReadTime(I2C_HandleTypeDef* hi2c, uint8_t* time) {
HAL_I2C_Master_Transmit(hi2c, DS3231_ADDR, 0x00, 1, 1000);
HAL_I2C_Master_Receive(hi2c, DS3231_ADDR, time, 7, 1000);
}参考代码 stm32 模拟3个IIC口操作2个SHT20和1个DS3231,串口输出数据 youwenfan.com/contenttea/56853.html
int main(void) {
HAL_Init();
// 初始化硬件I2C和USART
IIC_TypeDef iic1 = {GPIOA, GPIO_PIN_0, GPIOA, GPIO_PIN_1}; // SHT20_1
IIC_TypeDef iic2 = {GPIOA, GPIO_PIN_2, GPIOA, GPIO_PIN_3}; // SHT20_2
IIC_Init(&iic1);
IIC_Init(&iic2);
I2C_HandleTypeDef hi2c1; // 硬件I2C1
DS3231_Init(&hi2c1);
while (1) {
float temp1 = SHT20_ReadTemperature(&iic1);
float temp2 = SHT20_ReadTemperature(&iic2);
uint8_t time[7];
DS3231_ReadTime(&hi2c1, time);
// 通过串口输出数据
printf("SHT20_1 Temp: %.2f C\n", temp1);
printf("SHT20_2 Temp: %.2f C\n", temp2);
printf("DS3231 Time: %02d:%02d:%02d\n", time[2], time[1], time[0]);
HAL_Delay(1000);
}
}通过上述代码,可以实现STM32模拟多个I2C口操作多个设备,并通过串口输出数据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。