From 485122c6df8c779b7057f5213a4dd60f6f1b701e Mon Sep 17 00:00:00 2001 From: yelvlab Date: Tue, 8 Oct 2024 16:28:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8gd32e230=E7=9A=84stdlib=E9=87=8D?= =?UTF-8?q?=E5=86=99wbh=E7=9A=84=E5=8F=82=E8=80=83=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=9B=A0=E4=B8=BAstm=E7=9A=84stdlib=E5=92=8C?= =?UTF-8?q?gd32=E7=9A=84stdlib=E6=9C=89=E5=BE=88=E5=A4=A7=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=EF=BC=8C=E8=B6=85=E6=97=B6=E6=9C=BA=E5=88=B6=E4=B8=8E?= =?UTF-8?q?flag=E9=AA=8C=E8=AF=81=E5=B7=AE=E5=BC=82=E8=BE=83=E5=A4=A7?= =?UTF-8?q?=EF=BC=8C=E9=80=9A=E8=BF=87=E5=AF=B9=E6=AF=94=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E7=BC=96=E5=86=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 数据计算方式重新书写,两个8位数据的合并方式修改为位移,并且整体放大100倍(标准数据为((Data[1] << 8) | Data[0]) * 0.02 - 273.15) --- CMakeLists.txt | 2 +- inc/mlx90614.h | 5 +- src/main.c | 2 + src/mlx90614.c | 138 +++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 124 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8d182c..ea3f22e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ set(TARGET_C_SRC ${CMAKE_SOURCE_DIR}/src/systick.c ${CMAKE_SOURCE_DIR}/src/ultrasonic_driver.c ${CMAKE_SOURCE_DIR}/src/mlx90614.c - ${CMAKE_SOURCE_DIR}/src/gd32e23x_hw_i2c.c +# ${CMAKE_SOURCE_DIR}/src/gd32e23x_hw_i2c.c ) add_executable(xlsw_3dp_ultrasonic_300K ${TARGET_C_SRC}) diff --git a/inc/mlx90614.h b/inc/mlx90614.h index cd02d45..b0136e7 100644 --- a/inc/mlx90614.h +++ b/inc/mlx90614.h @@ -5,7 +5,10 @@ #ifndef MLX90614_H #define MLX90614_H -#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)(I2C_FLAG_I2CBSY | I2C_FLAG_MASTER | I2C_FLAG_RBNE)) +// #define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)(I2C_FLAG_I2CBSY | I2C_FLAG_MASTER | I2C_FLAG_RBNE)) +#define SLAVE_ADDR (0x5A << 1) +#define REG_ADDR_OBJ_TEMP 0x07 +#define REG_ADDR_AMB_TEMP 0x06 void i2c_config(void); int read_ir_mlx90614(void); diff --git a/src/main.c b/src/main.c index 5b4f33a..160ad2c 100644 --- a/src/main.c +++ b/src/main.c @@ -55,6 +55,8 @@ int main(void) const char* result = (capture_value <= CAPTURE_VALUE_MAX) ? "Distance: %d\n" : "Over Range\n"; distance_uint16 = calculate_distance(capture_value); printf(result, distance_uint16); + + printf("Temp:%d", read_ir_mlx90614()); } } diff --git a/src/mlx90614.c b/src/mlx90614.c index 96ae00b..67b5898 100644 --- a/src/mlx90614.c +++ b/src/mlx90614.c @@ -9,7 +9,7 @@ void i2c_config(void) { rcu_periph_clock_enable(RCU_I2C0); - rcu_periph_clock_enable(GPIOF); + rcu_periph_clock_enable(RCU_GPIOF); gpio_af_set(GPIOF, GPIO_AF_1, GPIO_PIN_0 | GPIO_PIN_1); gpio_output_options_set(GPIOF, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1); @@ -27,6 +27,7 @@ int read_ir_mlx90614(void) { uint8_t Data[5]; int inttemp_ir = 0; uint32_t TIMEOUT = 0; + // while(TIMEOUT<10000&&I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)) while (TIMEOUT < 10000 && i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) TIMEOUT++; if (TIMEOUT >= 10000) { @@ -37,7 +38,17 @@ int read_ir_mlx90614(void) { // I2C_GenerateSTART(I2C0, ENABLE); i2c_start_on_bus(I2C0); // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT)) - while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_EVENT_MASTER_MODE_SELECT)) + /* 等待发送模式 + * I2C_EVENT_MASTER_MODE_SELECT --> BUSY, MSL and SB flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_SBSEND) + */ + while (TIMEOUT < 10000 + && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR1\r\n"); @@ -46,27 +57,64 @@ int read_ir_mlx90614(void) { // I2C_AcknowledgeConfig(I2C0,DISABLE); TIMEOUT = 0; // I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Transmitter); - i2c_master_addressing(I2C0, 0XB4, I2C_TRANSMITTER); + i2c_master_addressing(I2C0, SLAVE_ADDR, I2C_TRANSMITTER); // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) - while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_TR)) + /* 等待发送地址完成 + * I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED --> BUSY, MSL, ADDR, TXE and TRA flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && + * !i2c_flag_get(I2C0, I2C_FLAG_TBE) && + * !i2c_flag_get(I2C0, I2C_FLAG_TR) + */ + while (TIMEOUT < 10000 && + !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + !i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && + !i2c_flag_get(I2C0, I2C_FLAG_TBE) && + !i2c_flag_get(I2C0, I2C_FLAG_TR)) TIMEOUT++; if (TIMEOUT >= 10000) { printf("ERROR2\r\n"); return -410; } - I2C_SendData(I2C0, 0x07); + // I2C_SendData(I2C0, 0x07); + i2c_data_transmit(I2C0, REG_ADDR_OBJ_TEMP); TIMEOUT = 0; - I2C_GenerateSTART(I2C0, ENABLE); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT)) + // I2C_GenerateSTART(I2C0, ENABLE); + i2c_start_on_bus(I2C0); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT)) + /* 等待发送模式 + * I2C_EVENT_MASTER_MODE_SELECT --> BUSY, MSL and SB flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_SBSEND) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR3\r\n"); return -410; } TIMEOUT = 0; - I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Receiver); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + // I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Receiver); + i2c_master_addressing(I2C0, SLAVE_ADDR, I2C_RECEIVER); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + /* 等待接收完成 + * I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_RBNE) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_RBNE)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR4\r\n"); @@ -74,8 +122,19 @@ int read_ir_mlx90614(void) { } //I2C_AcknowledgeConfig(I2C0,DISABLE); TIMEOUT = 0; - Data[0] = I2C_ReceiveData(I2C0); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + // Data[0] = I2C_ReceiveData(I2C0); + Data[0] = i2c_data_receive(I2C0); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + /* 等待接收完成 + * I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_RBNE) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_RBNE)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR5\r\n"); @@ -83,8 +142,19 @@ int read_ir_mlx90614(void) { } TIMEOUT = 0; - Data[1] = I2C_ReceiveData(I2C0); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + // Data[1] = I2C_ReceiveData(I2C0); + Data[1] = i2c_data_receive(I2C0); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + /* 等待接收完成 + * I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_RBNE) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_RBNE)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR6\r\n"); @@ -92,8 +162,19 @@ int read_ir_mlx90614(void) { } TIMEOUT = 0; - Data[2] = I2C_ReceiveData(I2C0); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + // Data[2] = I2C_ReceiveData(I2C0); + Data[2] = i2c_data_receive(I2C0); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + /* 等待接收完成 + * I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_RBNE) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_RBNE)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR7\r\n"); @@ -101,9 +182,21 @@ int read_ir_mlx90614(void) { } - I2C_AcknowledgeConfig(I2C0, DISABLE); - Data[3] = I2C_ReceiveData(I2C0); - while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + // I2C_AcknowledgeConfig(I2C0, DISABLE); + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + // Data[3] = I2C_ReceiveData(I2C0); + Data[3] = i2c_data_receive(I2C0); + // while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED)) + /* 等待接收完成 + * I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags + * || + * !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && + * !i2c_flag_get(I2C0, I2C_FLAG_MASTER) && + * !i2c_flag_get(I2C0, I2C_FLAG_RBNE) + */ + while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) + && !i2c_flag_get(I2C0, I2C_FLAG_MASTER) + && !i2c_flag_get(I2C0, I2C_FLAG_RBNE)) TIMEOUT++; if (TIMEOUT >= 10000) { //printf("ERROR11\r\n"); @@ -111,10 +204,13 @@ int read_ir_mlx90614(void) { } - I2C_GenerateSTOP(I2C0, ENABLE); - I2C_AcknowledgeConfig(I2C0, ENABLE); + // I2C_GenerateSTOP(I2C0, ENABLE); + i2c_stop_on_bus(I2C0); + // I2C_AcknowledgeConfig(I2C0, ENABLE); + i2c_ack_config(I2C0, I2C_ACK_ENABLE); //printf("data:%x,%x,%x\r\n",Data[0],Data[1],Data[2]); - inttemp_ir = (int) ((Data[0] + Data[1] * 255) * 0.2 - 2731.5); + // inttemp_ir = (int) ((Data[0] + Data[1] * 255) * 0.2 - 2731.5); + inttemp_ir = (((Data[1] << 8) | Data[0]) * 2 - 27315); // printf("temp:%d\r\n",inttemp_ir);