From 0910a260729fd4ace0a5a15fddef52b1024e134a Mon Sep 17 00:00:00 2001 From: yelvlab Date: Mon, 16 Dec 2024 14:19:10 +0800 Subject: [PATCH 1/3] finish tmp112a --- src/RS485.c | 5 ++++- src/gd32e23x_it.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/RS485.c b/src/RS485.c index 2db76b7..557f9c9 100644 --- a/src/RS485.c +++ b/src/RS485.c @@ -4,6 +4,8 @@ #include "RS485.h" +extern uint32_t g_temperature_uint32; + void RS485_config(void) { rcu_periph_clock_enable(RS485_GPIO_RCU); rcu_periph_clock_enable(RS485_RCU); @@ -35,7 +37,8 @@ void process_command(char *cmd) { if (strncmp(cmd, "M1", 2) == 0) { printf("M1 -=-=- OK!\r\n"); } else if (strncmp(cmd, "M2", 2) == 0) { - printf("M2 -=-=- OK!\r\n"); + // printf("M2 -=-=- OK!\r\n"); + printf("Temperature: %lu\r\n", g_temperature_uint32); // } else if (strncmp(cmd, "M3", 2) == 0) { // char *param_str = cmd + 2; // Skip "M3" // int param = atoi(param_str + 1); // Skip "S" and convert to integer diff --git a/src/gd32e23x_it.c b/src/gd32e23x_it.c index fd03276..604c5cf 100644 --- a/src/gd32e23x_it.c +++ b/src/gd32e23x_it.c @@ -36,6 +36,10 @@ OF SUCH DAMAGE. #include "main.h" #include "systick.h" #include "LDC1612.h" +#include "RS485.h" + +char rx_buffer[RX_BUFFER_SIZE]; +uint8_t rx_index = 0; /*! \brief this function handles NMI exception @@ -120,4 +124,24 @@ void TIMER16_IRQHandler(void) { } led_status = !led_status; } +} + +void USART0_IRQHandler(void) { + if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) + { + usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE); + uint8_t received_data = (uint8_t)usart_data_receive(USART0); + + // 将接收到的数据存储到缓冲区 + if(rx_index < RX_BUFFER_SIZE - 1) { + rx_buffer[rx_index++] = received_data; + } + + // 检查是否接收到换行符,表示指令结束 + if(received_data == '\n') { + rx_buffer[rx_index] = '\0'; // 添加字符串结束符 + process_command(rx_buffer); // 处理指令 + rx_index = 0; // 重置缓冲区索引 + } + } } \ No newline at end of file From de211abf4ee3e44fadb2cdd9733d15452176d37b Mon Sep 17 00:00:00 2001 From: yelvlab Date: Mon, 16 Dec 2024 14:23:14 +0800 Subject: [PATCH 2/3] finish tmp112a --- inc/LDC1612.h | 2 + src/LDC1612.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 4 ++ 3 files changed, 116 insertions(+) diff --git a/inc/LDC1612.h b/inc/LDC1612.h index 0ba7392..bfd6cec 100644 --- a/inc/LDC1612.h +++ b/inc/LDC1612.h @@ -60,4 +60,6 @@ void I2C_scan(void); int LDC1612_IIC_read_16bits(void); +uint32_t TMP112A_ReadTemperature(void); + #endif //LDC1612_H diff --git a/src/LDC1612.c b/src/LDC1612.c index b14e252..a362f46 100644 --- a/src/LDC1612.c +++ b/src/LDC1612.c @@ -185,4 +185,114 @@ int LDC1612_IIC_read_16bits(void) { printf("device id = %x\r\n", (data[0] <<8 | data[1])); return 0; +} + +uint32_t TMP112A_ReadTemperature(void) { + uint8_t data[2] = {0}; + uint16_t raw_temp = 0; + uint16_t timeout = 0; + uint32_t temperature = 0; + + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + + while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) //判断IIC总线是否忙,发送起始信号 + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_start_on_bus(I2C0); + timeout = 0; + } else { + printf("err\r\n"); + return -1; // 超时返回错误 + } + + while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) //判断起始位是否发送,设置sensor地址并设置为写 + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_master_addressing(I2C0, TMP112A_ADDR, I2C_TRANSMITTER); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + while (!i2c_flag_get(I2C0, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) //判断地址是否发送完成,然后发送寄存器地址 + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_data_transmit(I2C0, 0x00); + timeout = 0; + // i2c_start_on_bus(I2C0); + } else { + return -1; // 超时返回错误 + } + + while (i2c_flag_get(I2C0, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) //判断发送缓冲器是否为空,为空后(发送完毕)重新发送开始信号 + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_start_on_bus(I2C0); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) { + timeout++; + } + if (timeout < I2C_TIME_OUT) { + i2c_master_addressing(I2C0, TMP112A_ADDR, I2C_RECEIVER); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) + timeout++; + if (timeout < I2C_TIME_OUT) { + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + // 读取第一个字节的数据 + while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) { + timeout++; + } + if (timeout < I2C_TIME_OUT) { + data[0] = i2c_data_receive(I2C0); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + i2c_ack_config(I2C0, I2C_ACK_DISABLE); // 关闭发送ACK,它会在下一个字节完成后发送NAK + + // 读取第二个字节的数据 + while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) { + timeout++; + } + if (timeout < I2C_TIME_OUT) { + data[1] = i2c_data_receive(I2C0); + timeout = 0; + } else { + return -1; // 超时返回错误 + } + + i2c_stop_on_bus(I2C0); + + // printf("data[0]: %x, data[1]: %x\r\n", data[0], data[1]); + raw_temp = ((uint16_t) (data[0] << 4) | (data[1]>>4)); + // printf("raw_temp: %x\r\n", raw_temp); + // printf("raw_temp(dec): %d\r\n", raw_temp); + temperature = raw_temp * 625; + // printf("temperature: %d\r\n", temperature); + + return temperature; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1d6c352..9830b05 100644 --- a/src/main.c +++ b/src/main.c @@ -12,6 +12,8 @@ #include "RS485.h" #include "LDC1612.h" +uint32_t g_temperature_uint32; + void led_config(void) { rcu_periph_clock_enable(LED_RCU); @@ -64,6 +66,8 @@ int main(void) delay_ms(1000); while(1){ + g_temperature_uint32 = TMP112A_ReadTemperature(); + delay_ms(500); } } From f279251ff702c94146f28cbaaf85dfa737aa4776 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Mon, 16 Dec 2024 14:48:25 +0800 Subject: [PATCH 3/3] finish tmp112a --- inc/LDC1612.h | 1 + src/LDC1612.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/LDC1612.h b/inc/LDC1612.h index bfd6cec..c7f55ad 100644 --- a/inc/LDC1612.h +++ b/inc/LDC1612.h @@ -14,6 +14,7 @@ #include #define LDC1612_ADDR (0x2B << 1) +#define TMP112A_ADDR (0x49 << 1) /*Register Rddr*/ /***************************************************************************/ diff --git a/src/LDC1612.c b/src/LDC1612.c index a362f46..898157f 100644 --- a/src/LDC1612.c +++ b/src/LDC1612.c @@ -86,7 +86,6 @@ void I2C_scan(void) { int LDC1612_IIC_read_16bits(void) { uint8_t data[2] = {0}; - uint16_t raw_temp = 0; uint16_t timeout = 0; i2c_ack_config(I2C0, I2C_ACK_ENABLE);