diff --git a/stm32f4/main.c b/stm32f4/main.c index acea767..95e8bdd 100755 --- a/stm32f4/main.c +++ b/stm32f4/main.c @@ -31,7 +31,7 @@ void system_init(void) led_init(); system_tick_init(); // lcd_init(); - // rs485_init(); + rs485_init(); dwin_init(); } diff --git a/stm32f4/src/dwin.c b/stm32f4/src/dwin.c index a0cee85..bae7988 100644 --- a/stm32f4/src/dwin.c +++ b/stm32f4/src/dwin.c @@ -109,22 +109,44 @@ static void dwin_endian_reverse_2byte(uint8_t *buffer, uint16_t val) void dwin_rx_parse(uint8_t *buffer, uint16_t len) { - uint32_t baudrate; + uint32_t u32; uint8_t *p = buffer; + if (p[0] != 0x5A || p[1] != 0xA5 || p[2] != 0x12 || p[3] != 0x83 || p[4] != 0x51 || p[5] != 0x00 || p[6] != 0x07) { + sm++; + if (sm > 1) { + sm = 0; + } + return; + } + rs485_cfg_dwin.address = p[16]; + u32 = (uint32_t)p[20]; + u32 |= (uint32_t)p[19] << 8; + u32 |= (uint32_t)p[18] << 16; + u32 |= (uint32_t)p[17] << 24; + rs485_cfg_dwin.baudrate = u32; + u32 = (uint32_t)p[14]; + u32 |= (uint32_t)p[13] << 8; + u32 |= (uint32_t)p[12] << 16; + u32 |= (uint32_t)p[11] << 24; + rs485_cfg_dwin.concentration = u32; + rs485_cfg_dwin.restore = p[10]; + rs485_cfg_dwin.cali = p[8]; + + if (rs485_cfg_dwin.restore) { + rs485_cfg_dwin.restore_bak = 1; + sm = 2; + return; + } + if (rs485_cfg_dwin.cali) { + rs485_cfg_dwin.cali_bak = 1; + sm = 3; + return; + } sm++; if (sm > 1) { sm = 0; } - if (p[0] != 0x5A || p[1] != 0xA5 || p[2] != 0x12 || p[3] != 0x83 || p[4] != 0x51 || p[5] != 0x00 || p[6] != 0x07) { - return; - } - rs485_mb_addr = p[16]; - baudrate = (uint32_t)p[20]; - baudrate |= (uint32_t)p[19] << 8; - baudrate |= (uint32_t)p[18] << 16; - baudrate |= (uint32_t)p[17] << 24; - rs485_baudrate = baudrate; } void dwin_loop(void) @@ -147,7 +169,7 @@ void dwin_loop(void) dwin_buff_tx[len++] = (DWIN_DATA_CTRL_ADDR >> 8) & 0xFF; /* address high byte */ dwin_buff_tx[len++] = DWIN_DATA_CTRL_ADDR & 0xFF; /* address low byte */ dwin_buff_tx[len++] = DWIN_DATA_CTRL_LENG; /* data length to be read */ - } else { + } else if (sm == 1) { /* write display data */ dwin_buff_tx[len++] = 0x5A; dwin_buff_tx[len++] = 0xA5; /* frame head */ @@ -241,6 +263,26 @@ void dwin_loop(void) len += 4; dwin_endian_reverse_4byte(dwin_buff_tx + len, lark1s_gas_cali_data.span_ref_cts); len += 4; + } else if (sm == 2) { + /* clear restore request data */ + dwin_buff_tx[len++] = 0x5A; + dwin_buff_tx[len++] = 0xA5; /* frame head */ + dwin_buff_tx[len++] = 0x05; /* length */ + dwin_buff_tx[len++] = 0x82; /* write operation */ + dwin_buff_tx[len++] = ((DWIN_DATA_CTRL_ADDR + 1) >> 8) & 0xFF; /* address high byte */ + dwin_buff_tx[len++] = (DWIN_DATA_CTRL_ADDR + 1) & 0xFF; /* address low byte */ + dwin_buff_tx[len++] = 0x00; /* data */ + dwin_buff_tx[len++] = 0x00; /* data */ + } else if (sm == 3) { + /* clear restore request data */ + dwin_buff_tx[len++] = 0x5A; + dwin_buff_tx[len++] = 0xA5; /* frame head */ + dwin_buff_tx[len++] = 0x05; /* length */ + dwin_buff_tx[len++] = 0x82; /* write operation */ + dwin_buff_tx[len++] = ((DWIN_DATA_CTRL_ADDR + 0) >> 8) & 0xFF; /* address high byte */ + dwin_buff_tx[len++] = (DWIN_DATA_CTRL_ADDR + 0) & 0xFF; /* address low byte */ + dwin_buff_tx[len++] = 0x00; /* data */ + dwin_buff_tx[len++] = 0x00; /* data */ } dwin_send(len); } diff --git a/stm32f4/src/dwin.h b/stm32f4/src/dwin.h index efa060a..ce11a2e 100644 --- a/stm32f4/src/dwin.h +++ b/stm32f4/src/dwin.h @@ -12,7 +12,6 @@ #define DWIN_PIN_RX (GPIO_Pin_3) #define DWIN_BAUDRATE (115200) - #define DWIN_DATA_DISP_ADDR (0x5000) #define DWIN_DATA_DISP_LENG (0x3A) #define DWIN_DATA_CTRL_ADDR (0x5100) diff --git a/stm32f4/src/rs485.c b/stm32f4/src/rs485.c index 3578a7a..3f141e6 100644 --- a/stm32f4/src/rs485.c +++ b/stm32f4/src/rs485.c @@ -13,8 +13,7 @@ uint8_t rs485_buff_tx[RS485_BUFF_TX_LEN] __attribute__((aligned(16))); uint8_t rs485_buff_rx[RS485_BUFF_RX_LEN] __attribute__((aligned(16))); static int __attribute__((section(".bss_ccm"))) sm = 0; -uint32_t rs485_baudrate __attribute__((section(".bss_ccm"))) = 19200; -uint8_t rs485_mb_addr __attribute__((section(".bss_ccm"))) = 1; +struct rs485_cfg_dwin rs485_cfg_dwin __attribute__((section(".bss_ccm"))); char sn[16] __attribute__((section(".bss_ccm"))); struct lark1s_gas_info_s lark1s_gas_info __attribute__((section(".bss_ccm"))); @@ -64,7 +63,7 @@ void rs485_init(void) USART_DeInit(USART3); USART_OverSampling8Cmd(USART3, ENABLE); - USART_InitStructure.USART_BaudRate = rs485_baudrate; + USART_InitStructure.USART_BaudRate = rs485_cfg_dwin.baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; @@ -129,6 +128,11 @@ void rs485_state_machine_tx(void) case 2: len = lark1s_req_gas3_cali_data(rs485_buff_tx); break; case 3: len = lark1s_req_data(rs485_buff_tx); break; case 4: len = lark1s_req_status(rs485_buff_tx); break; + case 5: len = lark1s_req_gas3_cali_zero_record(rs485_buff_tx, LARK1S_CALI_ZERO); break; + case 6: len = lark1s_req_gas3_cali_active(rs485_buff_tx, LARK1S_CALI_ZERO); break; + case 7: len = lark1s_req_gas3_cali_span_record(rs485_buff_tx, rs485_cfg_dwin.concentration); break; + case 8: len = lark1s_req_gas3_cali_active(rs485_buff_tx, LARK1S_CALI_SPAN); break; + case 9: len = lark1s_req_gas3_cali_restore(rs485_buff_tx); break; default: len = 0; break; } rs485_send((uint16_t)len); @@ -144,15 +148,38 @@ void rs485_state_machine_rx(int len) case 2: ret = lark1s_parse_gas3_cali_data(rs485_buff_rx, len, &lark1s_gas_cali_data); break; case 3: ret = lark1s_parse_data(rs485_buff_rx, len, &lark1s_data); break; case 4: ret = lark1s_parse_status(rs485_buff_rx, len, &lark1s_status); break; + case 5: ret = lark1s_parse_gas3_cali_zero_record(rs485_buff_rx, len); break; + case 6: ret = lark1s_parse_gas3_cali_active(rs485_buff_rx, len); break; + case 7: ret = lark1s_parse_gas3_cali_span_record(rs485_buff_rx, len); break; + case 8: ret = lark1s_parse_gas3_cali_active(rs485_buff_rx, len); break; + case 9: ret = lark1s_parse_gas3_cali_restore(rs485_buff_rx, len); break; default: break; } - if (ret) { + if ((ret != LARK1S_PARSE_OK) && (sm >= 5)) { + sm = 0; + return; + } + if ((sm == 4) ||(sm == 6) || (sm == 8) || (sm == 9)) { + sm = 0; return; } sm++; - if (sm > 4) { + if (sm > 9) { sm = 0; } + if (sm < 4) { + if (rs485_cfg_dwin.restore_bak) { + rs485_cfg_dwin.restore_bak = 0; + sm = 9; + } else if (rs485_cfg_dwin.cali_bak) { + rs485_cfg_dwin.cali_bak = 0; + if (rs485_cfg_dwin.concentration == 0) { + sm = 5; + } else { + sm = 7; + } + } + } } void rs485_loop(void) @@ -165,12 +192,12 @@ void rs485_loop(void) return; } ms = system_tick_cnt; - if (baudrate != rs485_baudrate) { - baudrate = rs485_baudrate; + if (baudrate != rs485_cfg_dwin.baudrate) { + baudrate = rs485_cfg_dwin.baudrate; rs485_init(); } - if (addr != rs485_mb_addr) { - addr = rs485_mb_addr; + if (addr != rs485_cfg_dwin.address) { + addr = rs485_cfg_dwin.address; lark1s_set_mb_address(addr); } rs485_state_machine_tx(); diff --git a/stm32f4/src/rs485.h b/stm32f4/src/rs485.h index ba0938f..4a3b7c3 100644 --- a/stm32f4/src/rs485.h +++ b/stm32f4/src/rs485.h @@ -12,8 +12,17 @@ #define RS485_PIN_RX (GPIO_Pin_11) #define RS485_PIN_DIR (GPIO_Pin_1) -extern uint32_t rs485_baudrate; -extern uint8_t rs485_mb_addr; +struct rs485_cfg_dwin { + uint32_t baudrate; + uint32_t concentration; + uint8_t cali; + uint8_t cali_bak; + uint8_t restore; + uint8_t restore_bak; + uint8_t address; +}; + +extern struct rs485_cfg_dwin rs485_cfg_dwin; void rs485_init(void); void rs485_send(uint16_t len);