164 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by dell on 24-9-26.
//
#include "mlx90614.h"
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
/**
* @brief This function configure the I2C peripheral & GPIO
* @param[in] none
* @param[out] none
* @retval None
*/
void MLX90614_I2CConfig(void) {
rcu_periph_clock_enable(RCU_IR_GPIO);
rcu_periph_clock_enable(RCU_I2C);
gpio_af_set(I2C_SCL_PORT, I2C_GPIO_AF, I2C_SCL_PIN);
gpio_af_set(I2C_SDA_PORT, I2C_GPIO_AF, I2C_SDA_PIN);
gpio_mode_set(I2C_SCL_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN);
gpio_output_options_set(I2C_SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN);
gpio_mode_set(I2C_SDA_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SDA_PIN);
gpio_output_options_set(I2C_SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
i2c_clock_config(IR_I2C, I2C_SPEED, I2C_DTCY_2);
i2c_mode_addr_config(IR_I2C, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, SLAVE_ADDR);
i2c_enable(IR_I2C);
i2c_ack_config(IR_I2C, I2C_ACK_ENABLE);
}
/**
* @brief This function read object temperature
* @param[in] none
* @param[out] temp_raw: object temperature
* @retval None
*/
uint16_t MLX90614_GetObjectTemperature(void) {
uint8_t data[3] = {0};
uint16_t temp_raw = 0;
uint16_t timeout = 0;
i2c_ack_config(IR_I2C, I2C_ACK_ENABLE);
while (i2c_flag_get(IR_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) //判断IIC总线是否忙发送起始信号
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_start_on_bus(IR_I2C);
timeout = 0;
} else {
printf("err\r\n");
return -4100; // 超时返回错误
}
while (!i2c_flag_get(IR_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) //判断起始位是否发送设置sensor地址并设置为写
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_master_addressing(IR_I2C, SLAVE_ADDR, I2C_TRANSMITTER);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
while (!i2c_flag_get(IR_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT))
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_flag_clear(IR_I2C, I2C_FLAG_ADDSEND);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
while (!i2c_flag_get(IR_I2C, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) //判断地址是否发送完成,然后发送寄存器地址
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_data_transmit(IR_I2C, REG_ADDR_OBJ_TEMP);
timeout = 0;
// i2c_start_on_bus(IR_I2C);
} else {
return -4100; // 超时返回错误
}
while (i2c_flag_get(IR_I2C, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) //判断发送缓冲器是否为空,为空后(发送完毕)重新发送开始信号
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_start_on_bus(IR_I2C);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
while (!i2c_flag_get(IR_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if (timeout < I2C_TIME_OUT) {
i2c_master_addressing(IR_I2C, SLAVE_ADDR, I2C_RECEIVER);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
while (!i2c_flag_get(IR_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT))
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_flag_clear(IR_I2C, I2C_FLAG_ADDSEND);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
// 读取第一个字节的数据
while (!i2c_flag_get(IR_I2C, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if (timeout < I2C_TIME_OUT) {
data[0] = i2c_data_receive(IR_I2C);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
// 读取第二个字节的数据
while (!i2c_flag_get(IR_I2C, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if (timeout < I2C_TIME_OUT) {
data[1] = i2c_data_receive(IR_I2C);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
i2c_ack_config(IR_I2C, I2C_ACK_DISABLE); // 关闭发送ACK它会在下一个字节完成后发送NAK
// 读取第三个字节的数据
while (!i2c_flag_get(IR_I2C, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if (timeout < I2C_TIME_OUT) {
data[2] = i2c_data_receive(IR_I2C);
timeout = 0;
} else {
return -4100; // 超时返回错误
}
i2c_stop_on_bus(IR_I2C);
temp_raw = ((uint16_t) (data[1] << 8) | data[0]) * 2 - 27315;
// (Data[1] << 8) | data[0] * 0.02 -273.15 为避免浮点运算直接放大100倍
if (temp_raw > 8500) {
temp_raw = 8500;
}
if (temp_raw < -4000) {
temp_raw = -4000;
}
return temp_raw;
}