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);