From 569d99cbf310e01b58e1b84dd74d7f181fb12061 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Wed, 25 Dec 2024 00:28:29 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E4=B8=8E=E9=94=99=E8=AF=AF=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=9C=A8vofa=E4=B8=8A=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=A5=BD=E5=90=84=E4=B8=AA=E6=B5=8B=E8=AF=95=E9=A2=84=E8=AE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/rs485.h | 26 +++++++--- src/gd32e23x_it.c | 21 +++----- src/main.c | 3 +- src/peripheral.c | 63 ---------------------- src/rs485.c | 130 +++++++++++++++++++++++++++++++++------------- 5 files changed, 121 insertions(+), 122 deletions(-) delete mode 100644 src/peripheral.c diff --git a/inc/rs485.h b/inc/rs485.h index efea633..1607e48 100644 --- a/inc/rs485.h +++ b/inc/rs485.h @@ -24,19 +24,29 @@ #define RS485_EN_PIN GPIO_PIN_1 -#define RX_BUFFER_SIZE 64 +#define RX_BUFFER_SIZE 32 -typedef enum { +#define LDC1612_PACKAGE_HEADER 0xD5 +#define LDC1612_BOARD_TYPE 0x03 +#define LDC1612_PACKAGE_LENGTH 0x02 + +typedef enum +{ VALIDATION_SUCCESS = 0, - VALIDATION_CRC_ERROR = 1 + VALIDATION_CRC_ERROR = 1, + VALIDATION_HEADER_ERROR = 2, + VALIDATION_TYPE_ERROR = 4, + VALIDATION_LENGTH_ERROR = 8 } validation_result_t; void rs485_config(void); -void process_command(uint8_t *cmd, size_t length); -uint8_t calculate_crc(uint8_t data[], size_t data_length); -validation_result_t validate_package_header(uint8_t *data); -validation_result_t validate_package_type(uint8_t *data); +void process_command(uint8_t* cmd, size_t length); +uint8_t calculate_crc(uint8_t data[], uint8_t data_length); +validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length); +validation_result_t validate_package_header(uint8_t* data); +validation_result_t validate_package_type(uint8_t* data); +validation_result_t validate_data_length(uint8_t* data); void eddy_current_value_report(void); void tempture_value_report(void); -#endif //RS485_H \ No newline at end of file +#endif //RS485_H diff --git a/src/gd32e23x_it.c b/src/gd32e23x_it.c index b22650e..44c7960 100644 --- a/src/gd32e23x_it.c +++ b/src/gd32e23x_it.c @@ -129,21 +129,14 @@ void USART0_IRQHandler(void) { if (rx_index < RX_BUFFER_SIZE - 1) { rx_buffer[rx_index++] = received_data; } + } - // 检查是否接收到换行符,表示指令结束 - if (received_data == '\n') { - if (calculate_crc(rx_buffer, rx_index - 2) == rx_buffer[rx_index - 2]) { - // printf("CRC check success\r\n"); - // rx_buffer[rx_index] = '\0'; // 添加字符串结束符 - process_command(rx_buffer, rx_index); // 处理指令 - rx_index = 0; // 重置缓冲区索引 - } else { - // printf("CRC check failed\r\n"); - printf("%c%c%c%c\r\n", 0xB5, 0xF2, 0x00, 0xF2); - rx_index = 0; // 重置缓冲区索引 - return; - } + if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) { + usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE); - } + process_command(rx_buffer, rx_index); // 处理指令 + + rx_index = 0; // 重置缓冲区索引 + return; } } diff --git a/src/main.c b/src/main.c index 8ee1449..30bb31b 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,7 @@ uint32_t g_eddy_current_value_uint32; \retval none */ int main(void) { + setbuf(stdout, NULL); /* configure systick */ systick_config(); /* configure USART */ @@ -35,7 +36,7 @@ int main(void) { i2c_gpio_config(); i2c_config(); - ldc1612_iic_get_sensor_infomation(); + // ldc1612_iic_get_sensor_infomation(); /* configure LDC1612 */ ldc1612_single_ch0_config(); diff --git a/src/peripheral.c b/src/peripheral.c deleted file mode 100644 index 7b0b1af..0000000 --- a/src/peripheral.c +++ /dev/null @@ -1,63 +0,0 @@ -// -// Created by yelv1 on 24-9-22. -// -#include "peripheral.h" -#include "gd32e23x.h" - -void usart_config(void) -{ - rcu_periph_clock_enable(RCU_GPIOA); - rcu_periph_clock_enable(RCU_USART0); - - gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); - gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); - - gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); - gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); - - usart_deinit(USART0); - usart_baudrate_set(USART0, 115200U); - usart_receive_config(USART0, USART_RECEIVE_ENABLE); - usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); - - usart_enable(USART0); - - gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); - - gpio_bit_write(GPIOA, GPIO_PIN_4, SET); -} - -/*! - \brief led blink configuration - \param[in] none - \param[out] none - \retval none -*/ -void led_blink_config(void) -{ - rcu_periph_clock_enable(RCU_GPIOB); - - gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); - gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_1); - gpio_bit_write(GPIOB, GPIO_PIN_1, SET); - - rcu_periph_clock_enable(RCU_TIMER13); - timer_deinit(RCU_TIMER13); - - timer_parameter_struct timer_initpara; - timer_struct_para_init(&timer_initpara); - timer_initpara.prescaler =7199; - timer_initpara.alignedmode =TIMER_COUNTER_EDGE; - timer_initpara.counterdirection =TIMER_COUNTER_UP; - timer_initpara.period =999; - timer_initpara.clockdivision =TIMER_CKDIV_DIV1; - timer_init(TIMER13, &timer_initpara); - - timer_auto_reload_shadow_enable(TIMER13); - timer_interrupt_enable(TIMER13, TIMER_INT_UP); - nvic_irq_enable(TIMER13_IRQn, 0); - timer_enable(TIMER13); -} diff --git a/src/rs485.c b/src/rs485.c index 93d0499..35fe966 100644 --- a/src/rs485.c +++ b/src/rs485.c @@ -10,7 +10,8 @@ extern uint32_t g_eddy_current_value_uint32; uint8_t package_header[3] = {0xB5, 0xF0, 0x04}; uint8_t package_data[4] = {0}; -void rs485_config(void) { +void rs485_config(void) +{ rcu_periph_clock_enable(RS485_GPIO_RCU); rcu_periph_clock_enable(RS485_RCU); @@ -35,64 +36,120 @@ void rs485_config(void) { nvic_irq_enable(USART0_IRQn, 0); usart_interrupt_enable(RS485_PHY, USART_INT_RBNE); + usart_interrupt_enable(RS485_PHY, USART_INT_IDLE); } -void process_command(uint8_t *cmd, size_t length) { +void process_command(uint8_t* cmd, size_t length) +{ char combined_str[3]; + validation_result_t status = VALIDATION_SUCCESS; - if (cmd[0] == 0xD5) { - if (cmd[1] == 0x03) { - if (cmd[2] == 0x02) { - sprintf(combined_str, "%c%c", cmd[3], cmd[4]); - if (strcmp(combined_str, "M1") == 0) { + status = (validate_package_header(cmd) | validate_package_type(cmd) | validate_data_length(cmd) | validate_package_crc(cmd, length)); - eddy_current_value_report(); - } else if (strcmp(combined_str, "M2") == 0) { - tempture_value_report(); - } else { - printf("%c%c%c%c%c%c%c\r\n", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3C); - return; - } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF1, 0x00, 0xF1); - } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF5, 0x00, 0xF5); + switch (status) + { + case VALIDATION_SUCCESS: + // printf("%d", length); + sprintf(combined_str, "%c%c", cmd[3], cmd[4]); + if (strcmp(combined_str, "M1") == 0) + { + eddy_current_value_report(); } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); + else if (strcmp(combined_str, "M2") == 0) + { + tempture_value_report(); + } + else + { + printf("%c%c%c%c%c%c%c", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3C); + return; + } + break; + case VALIDATION_CRC_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_HEADER_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF3, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_TYPE_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF4, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_LENGTH_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF2, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + default: + break; } } -uint8_t calculate_crc(uint8_t data[], size_t data_length) { +uint8_t calculate_crc(uint8_t data[], uint8_t data_length) +{ uint8_t crc = 0; - for (size_t i = 1; i < data_length; i++) { + // printf("%d", data_length); + + for (uint8_t i = 1; i < data_length - 1; i++) + { crc += data[i]; } return (uint8_t)(crc & 0xFF); } -validation_result_t validate_package_header(uint8_t *data) { - if (data[0] == 0xD5) { +validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length) +{ + if (data[data_length - 1] == calculate_crc(data, data_length) && data_length == 3 + data[2] + 1) + { return VALIDATION_SUCCESS; - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_CRC_ERROR; } } -validation_result_t validate_package_type(uint8_t *data) { - if (data[1] == 0x03) { +validation_result_t validate_package_header(uint8_t* data) +{ + if (data[0] == LDC1612_PACKAGE_HEADER) + { return VALIDATION_SUCCESS; - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); - return VALIDATION_CRC_ERROR; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_HEADER_ERROR; } } -void eddy_current_value_report(void) { +validation_result_t validate_package_type(uint8_t* data) +{ + if (data[1] == LDC1612_BOARD_TYPE) + { + return VALIDATION_SUCCESS; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_TYPE_ERROR; + } +} + +validation_result_t validate_data_length(uint8_t* data) +{ + if (data[2] == LDC1612_PACKAGE_LENGTH) + { + return VALIDATION_SUCCESS; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_LENGTH_ERROR; + } +} + +void eddy_current_value_report(void) +{ // package_header[1] = 0xF0; //eddy current package_data[0] = (g_eddy_current_value_uint32 >> 24) & 0xFF; @@ -107,10 +164,11 @@ void eddy_current_value_report(void) { // printf("EddyCurrent: %x\r\n", g_eddy_current_value_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); - printf("%c\r\n", calculate_crc(combined_data, 7)); + printf("%c", calculate_crc(combined_data, 7)); } -void tempture_value_report(void) { +void tempture_value_report(void) +{ // package_header[1] = 0xF1; //temperature package_data[0] = (g_temperature_uint32 >> 24) & 0xFF; @@ -125,5 +183,5 @@ void tempture_value_report(void) { // printf("Temperature: %x\r\n", g_temperature_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); - printf("%c\r\n", calculate_crc(combined_data, 7)); + printf("%c", calculate_crc(combined_data, 7)); } From f081fdac63f1c12a57ce6fbd05b8290e7cbe60c4 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Wed, 25 Dec 2024 00:29:24 +0800 Subject: [PATCH 2/5] update version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7e54e5..05b94d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(xlsw_3dp_LDC1612) set(VERSION_MAJOR 0) set(VERSION_MINOR 1) -set(VERSION_PATCH 0) +set(VERSION_PATCH 1) set(VERSION "V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") From 23a8e1d9784ae4feb917fe94c5309940e5385ff0 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Wed, 25 Dec 2024 00:37:19 +0800 Subject: [PATCH 3/5] change update date time to 100ms --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 30bb31b..e15137c 100644 --- a/src/main.c +++ b/src/main.c @@ -41,7 +41,7 @@ int main(void) { ldc1612_single_ch0_config(); while (1) { - delay_ms(500); + delay_ms(100); g_eddy_current_value_uint32 = 0; g_temperature_uint32 = 0; g_eddy_current_value_uint32 = ldc1612_get_raw_channel_result(CHANNEL_0); From ed8b6b3f6d7d213268fc92cb00dcdf8fb8ce0823 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Wed, 25 Dec 2024 00:37:39 +0800 Subject: [PATCH 4/5] change value name --- src/rs485.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/rs485.c b/src/rs485.c index 35fe966..d0fd84b 100644 --- a/src/rs485.c +++ b/src/rs485.c @@ -42,11 +42,14 @@ void rs485_config(void) void process_command(uint8_t* cmd, size_t length) { char combined_str[3]; - validation_result_t status = VALIDATION_SUCCESS; + validation_result_t validate = VALIDATION_SUCCESS; - status = (validate_package_header(cmd) | validate_package_type(cmd) | validate_data_length(cmd) | validate_package_crc(cmd, length)); + validate = (validate_package_header(cmd) | + validate_package_type(cmd) | + validate_data_length(cmd) | + validate_package_crc(cmd, length)); - switch (status) + switch (validate) { case VALIDATION_SUCCESS: // printf("%d", length); From 6702703031188db8ed1a4cf01ccc842ad6d0ee96 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Wed, 25 Dec 2024 00:37:53 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BE=8E=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/i2c.h | 8 ++++++++ inc/ldc1612.h | 1 + inc/led.h | 4 ++++ inc/rs485.h | 11 +++++++++-- inc/tmp112.h | 4 ++++ src/rs485.c | 12 ------------ 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/inc/i2c.h b/inc/i2c.h index d285e4c..db43602 100644 --- a/inc/i2c.h +++ b/inc/i2c.h @@ -14,6 +14,8 @@ #include #include +/******************************************************************************/ + #define I2C_SPEED 20000 #define RCU_GPIO_I2C RCU_GPIOF #define RCU_I2C RCU_I2C0 @@ -23,11 +25,15 @@ #define I2C_SDA_PIN GPIO_PIN_0 #define I2C_GPIO_AF GPIO_AF_1 +/******************************************************************************/ + #define I2C_TIME_OUT (uint16_t)(10000) #define I2C_OK 1 #define I2C_FAIL 0 #define I2C_END 1 +/******************************************************************************/ + typedef enum { I2C_START = 0, I2C_SEND_ADDRESS, @@ -36,6 +42,8 @@ typedef enum { I2C_STOP } i2c_process_enum; +/******************************************************************************/ + void i2c_gpio_config(void); void i2c_config(void); diff --git a/inc/ldc1612.h b/inc/ldc1612.h index 595020d..6722785 100644 --- a/inc/ldc1612.h +++ b/inc/ldc1612.h @@ -19,6 +19,7 @@ /*Register Rddr*/ /***************************************************************************/ + #define CONVERTION_RESULT_REG_START 0X00 #define SET_CONVERSION_TIME_REG_START 0X08 #define SET_CONVERSION_OFFSET_REG_START 0X0C diff --git a/inc/led.h b/inc/led.h index 09f9b26..b3fb0c9 100644 --- a/inc/led.h +++ b/inc/led.h @@ -14,6 +14,8 @@ #include #include +/******************************************************************************/ + #define LED_PORT GPIOA #define LED_PIN GPIO_PIN_7 #define LED_RCU RCU_GPIOA @@ -21,6 +23,8 @@ #define LED_TIMER TIMER16 #define LED_IRQ TIMER16_IRQn +/******************************************************************************/ + void led_config(void); #endif //LED_H diff --git a/inc/rs485.h b/inc/rs485.h index 1607e48..b24f233 100644 --- a/inc/rs485.h +++ b/inc/rs485.h @@ -14,6 +14,8 @@ #include #include +/******************************************************************************/ + #define RS485_RCU RCU_USART0 #define RS485_GPIO_RCU RCU_GPIOA #define RS485_GPIO_PORT GPIOA @@ -21,15 +23,18 @@ #define RS485_RX_PIN GPIO_PIN_3 #define RS485_PHY USART0 #define RS485_BAUDRATE 115200U - #define RS485_EN_PIN GPIO_PIN_1 -#define RX_BUFFER_SIZE 32 +/******************************************************************************/ + +#define RX_BUFFER_SIZE 32 #define LDC1612_PACKAGE_HEADER 0xD5 #define LDC1612_BOARD_TYPE 0x03 #define LDC1612_PACKAGE_LENGTH 0x02 +/******************************************************************************/ + typedef enum { VALIDATION_SUCCESS = 0, @@ -39,6 +44,8 @@ typedef enum VALIDATION_LENGTH_ERROR = 8 } validation_result_t; +/******************************************************************************/ + void rs485_config(void); void process_command(uint8_t* cmd, size_t length); uint8_t calculate_crc(uint8_t data[], uint8_t data_length); diff --git a/inc/tmp112.h b/inc/tmp112.h index 4a09b66..659a3d6 100644 --- a/inc/tmp112.h +++ b/inc/tmp112.h @@ -15,8 +15,12 @@ #include #include "i2c.h" +/******************************************************************************/ + #define TMP112A_ADDR (0x49 << 1) +/******************************************************************************/ + uint32_t tmp112a_get_raw_channel_result(void); #endif //TMP112_H diff --git a/src/rs485.c b/src/rs485.c index d0fd84b..2033c77 100644 --- a/src/rs485.c +++ b/src/rs485.c @@ -89,8 +89,6 @@ uint8_t calculate_crc(uint8_t data[], uint8_t data_length) { uint8_t crc = 0; - // printf("%d", data_length); - for (uint8_t i = 1; i < data_length - 1; i++) { crc += data[i]; @@ -107,7 +105,6 @@ validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length) } else { - // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_CRC_ERROR; } } @@ -120,7 +117,6 @@ validation_result_t validate_package_header(uint8_t* data) } else { - // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_HEADER_ERROR; } } @@ -133,7 +129,6 @@ validation_result_t validate_package_type(uint8_t* data) } else { - // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_TYPE_ERROR; } } @@ -146,15 +141,12 @@ validation_result_t validate_data_length(uint8_t* data) } else { - // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_LENGTH_ERROR; } } void eddy_current_value_report(void) { - // package_header[1] = 0xF0; //eddy current - package_data[0] = (g_eddy_current_value_uint32 >> 24) & 0xFF; package_data[1] = (g_eddy_current_value_uint32 >> 16) & 0xFF; package_data[2] = (g_eddy_current_value_uint32 >> 8) & 0xFF; @@ -164,7 +156,6 @@ void eddy_current_value_report(void) memcpy(combined_data, package_header, 3); memcpy(combined_data + 3, package_data, 4); - // printf("EddyCurrent: %x\r\n", g_eddy_current_value_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); printf("%c", calculate_crc(combined_data, 7)); @@ -172,8 +163,6 @@ void eddy_current_value_report(void) void tempture_value_report(void) { - // package_header[1] = 0xF1; //temperature - package_data[0] = (g_temperature_uint32 >> 24) & 0xFF; package_data[1] = (g_temperature_uint32 >> 16) & 0xFF; package_data[2] = (g_temperature_uint32 >> 8) & 0xFF; @@ -183,7 +172,6 @@ void tempture_value_report(void) memcpy(combined_data, package_header, 3); memcpy(combined_data + 3, package_data, 4); - // printf("Temperature: %x\r\n", g_temperature_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); printf("%c", calculate_crc(combined_data, 7));