stm32f103c8t6与cjc8988iic通信的例程
时间: 2023-08-23 12:05:40 浏览: 253
下面是一个STM32F103C8T6与CJC8988 IIC通信的例程,使用的是STM32 HAL库:
```c
#include "stm32f1xx_hal.h"
#define SLAVE_ADDRESS 0x28
I2C_HandleTypeDef hi2c1;
void I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
void I2C1_ReadTemperature(void)
{
uint8_t data[4];
uint8_t addr = SLAVE_ADDRESS << 1 | 1; // 读操作时地址需要左移1位并设置最低位为1
HAL_I2C_Master_Receive(&hi2c1, addr, data, 4, 1000); // 读取4个字节的数据
// 处理读取的数据
uint16_t temp_raw = (data[0] << 8) | data[1];
float temp_celsius = (float)temp_raw / 256;
}
void I2C1_WriteControlRegister(uint8_t value)
{
uint8_t addr = SLAVE_ADDRESS << 1; // 写操作时地址不需要左移1位
HAL_I2C_Master_Transmit(&hi2c1, addr, &value, 1, 1000); // 发送一个字节的数据
}
int main(void)
{
HAL_Init();
I2C1_Init();
while (1)
{
I2C1_ReadTemperature();
I2C1_WriteControlRegister(0x01);
HAL_Delay(1000);
}
}
```
在上面的例程中,我们使用了HAL库提供的`HAL_I2C_Master_Receive()`和`HAL_I2C_Master_Transmit()`函数来进行读写操作,其中`HAL_I2C_Master_Receive()`函数用于读取CJC8988的温度数据,`HAL_I2C_Master_Transmit()`函数用于向CJC8988的控制寄存器写入数据。需要注意的是,在读操作时,需要将IIC设备的地址左移1位并设置最低位为1,而在写操作时,只需要将地址左移1位即可。
阅读全文