diff --git a/inc/LDC1612.h b/inc/LDC1612.h index 615e13f..d919afb 100644 --- a/inc/LDC1612.h +++ b/inc/LDC1612.h @@ -15,6 +15,7 @@ #include #define LDC1612_ADDR (0x2B << 1) +#define TMP112A_ADDR (0x49 << 1) /*Register Rddr*/ /***************************************************************************/ @@ -119,4 +120,6 @@ uint8_t ldc1612_iic_read_16bits(uint8_t reg_addr, uint8_t *data); uint8_t ldc1612_iic_write_16bits(uint8_t reg_addr, uint8_t data[2]); +uint32_t TMP112A_ReadTemperature(void); + #endif //LDC1612_H diff --git a/src/LDC1612.c b/src/LDC1612.c index 66c2282..bf05668 100644 --- a/src/LDC1612.c +++ b/src/LDC1612.c @@ -646,3 +646,113 @@ uint8_t ldc1612_iic_write_16bits(uint8_t reg_addr, uint8_t data[2]) { } return I2C_END; } + +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; +} 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 diff --git a/src/main.c b/src/main.c index 472d74f..61854a4 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,7 @@ int main(void) { delay_ms(500); raw_value = ldc1612_get_raw_channel_result(CHANNEL_0); printf("data:%ld\r\n",raw_value); + g_temperature_uint32 = TMP112A_ReadTemperature(); } }