From 08b3909c40a192778719c6262bbee4745682948d Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Fri, 31 May 2024 19:15:47 +0800
Subject: [PATCH] 测试和修改了一些功能bug

---
 Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c |  256 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 199 insertions(+), 57 deletions(-)

diff --git a/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c b/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
index bf500c4..c4bb60b 100644
--- a/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
+++ b/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
@@ -1,6 +1,10 @@
 #include "rs485_read_data.h"
 #include "rs485_data_analysis_pro.h"
 #include "tim.h"
+#include "billing.h"
+#include "gpio.h"
+#include "uart.h"
+#include "linked_list.h"
 
 /****�������˼·******************
 *RS485������Ʒ�Ϊ�ϵ硢���Ͷ�ȡָ��ȴ��������ݲ���������״̬�����裻����ʵ�ֵȴ���ʱ�жϺͶ���ض���
@@ -9,11 +13,6 @@
 *
 **********************************/
 
-//__IO RS485_COM_STATUS_T	rs485_com_status_g = RS485_COM_IDLE;
-
-//__IO FlagStatus	rs485_pwr_delay_status_g = RESET; //����ʱ�䵽���־
-
-//static uint8_t	rs485_pwr_delay_time_out_cnt =0;
 
 __IO RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_g={
 	.status = RS485_COM_IDLE,                        \
@@ -24,13 +23,82 @@
 	.recv_flag = RESET,                     \
 };
 
+
+
+void RS485_read_data_GPIO_Init(void)
+{
+	InputtIO(RS485_SYNC_PORT,RS485_SYNC_PIN,IN_NORMAL);
+	OutputIO(RS485_PWR_PORT,RS485_PWR_PIN,OUT_PUSHPULL);
+	OutputIO(RS485_RE_PORT,RS485_RE_PIN,OUT_PUSHPULL);	
+	OutputIO(PWR_OUTPUT1_PORT,PWR_OUTPUT1_PIN,OUT_PUSHPULL);
+	OutputIO(PWR_OUTPUT2_PORT,PWR_OUTPUT2_PIN,OUT_PUSHPULL);
+	OutputIO(PWR_BOOST_EN_PORT,PWR_BOOST_EN_PIN,OUT_PUSHPULL);
+	OutputIO(PWR_OUTPUT_9V_PORT,PWR_OUTPUT_9V_PIN,OUT_PUSHPULL);
+	OutputIO(PWR_OUTPUT_12V_PORT,PWR_OUTPUT_12V_PIN,OUT_PUSHPULL);
+	
+	RS485_PWR_OFF;
+	RS485_RE_REC_ENABLE;
+	PWR_OUTPUT1_OFF;
+	PWR_OUTPUT2_OFF;
+	PWR_BOOST_DIABLE;
+	PWR_OUTPUT_9V_OFF;
+	PWR_OUTPUT_12V_OFF;
+}
+
+void RS485_UART_GPIO_Init(void)
+{
+	CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱ�ӣ�GPIO��ʹ�ܺ���
+	CMU_PERCLK_SetableEx(UART1CLK,ENABLE); 
+	CMU_PERCLK_SetableEx(DMACLK, ENABLE);
+	AltFunIO(RS485_READ_DATA_TX_PORT, RS485_READ_DATA_TX_PIN, ALTFUN_NORMAL);		
+	AltFunIO(RS485_READ_DATA_RX_PORT, RS485_READ_DATA_RX_PIN, ALTFUN_NORMAL);		
+	
+}
+
+void RS485_UART_GPIO_sleep(void)
+{
+	CMU_PERCLK_SetableEx(UART1CLK,DISABLE); 
+	CloseIO(RS485_READ_DATA_TX_PORT, RS485_READ_DATA_TX_PIN);		
+	CloseIO(RS485_READ_DATA_RX_PORT, RS485_READ_DATA_RX_PIN);		
+}
+
+
+void RS485_read_data_RX_DMA_check(void)
+{
+	uint16_t timeout_cnt = 0,dma_recv_cnt;
+	uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX);
+	
+	if(dma_mar_reg_read != (uint32)RS485_read_data_recv_buff){
+		delay_ms(2);
+		while(dma_mar_reg_read != DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX)){
+			dma_mar_reg_read = DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX);
+			delay_ms(2);
+			if(timeout_cnt++ > 100)
+				break;	
+		}
+	}
+	else
+		return ;
+	
+	dma_recv_cnt = dma_mar_reg_read - (uint32)RS485_read_data_recv_buff;
+	if(dma_recv_cnt)
+	{
+		rs485_com_uart_data_g.recv_length = dma_recv_cnt;
+		arrayA_2_arrayB(RS485_read_data_recv_buff , rs485_com_uart_data_g.recv_buf, dma_recv_cnt, LITTLE_ENDIAN) ;
+		rs485_com_uart_data_g.recv_flag = SET;//�������
+	}
+
+}
+
+
+
+
+
 //�����豸���봦�������ع�����ʱʱ��������
 uint8_t rs485GetDelayTime(uint16_t device_code)
 {
-
 	//���ڱ�����������1��һ�Σ�������ʱ�IJ�����1000ms�� ������ֵ��0-1000ms֮�䣬ʵ����ʱ��Ϊ1�����ң� ��ֵ��1000-2000ms֮�䣬ʵ����ʱ��Ϊ2������
 	switch (device_code){
-		
 				case SIZHUMODBUS1:	rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;	return 1;
 				case SIZHUMODBUS2:	rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;	return 1;
 				case SIZHUMODBUS3:	rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1;
@@ -42,15 +110,12 @@
 				//?��Ҫ����......
         default:return 100;
     }
-	
 }
 
 //�����豸���뷢�Ͷ�ȡ֡
 void rs485SendReadData(uint16_t device_code,uint8_t slaveAddress)
 {
-
 	switch (device_code){
-		
 				case SIZHUMODBUS1:	break;
 				case SIZHUMODBUS2:	break;
 				case SIZHUMODBUS3:	break;
@@ -69,23 +134,62 @@
 				//?��Ҫ����......
         default:break;
     }
-	
 }
 
 
 RS485_COM_STATUS_T	rs485ComPwrOnHandle(void)
 {
 	uint8_t delay_time_s;
+	uint8_t	RS485_sync_status =0;
+	uint8_t	count_i = 0;
 	
-	//?IO�ڳ�ʼ��
+	//jIO�ڳ�ʼ��
+	RS485_read_data_GPIO_Init();
 	
-	//?�򿪹���
+	RS485_sync_status = RS485_SYNC_IO_READ;
+	while(RS485_sync_status){
+		count_i ++;	
+		delay_ms(10);
+		RS485_sync_status = RS485_SYNC_IO_READ;
+		if(count_i > 10)
+			break;	
+	}
+	if(RS485_sync_status)
+		return RS485_COM_IDLE;
+	
+	//�򿪹���
+	if(flow_meter_para_g.output_voltage_code == RS485_V1_5V){
+		PWR_OUTPUT1_ON;
+		PWR_OUTPUT2_OFF;
+		delay_ms(1);
+		PWR_OUTPUT_9V_OFF;
+		PWR_OUTPUT_12V_OFF;		
+	}else if(flow_meter_para_g.output_voltage_code == RS485_V1_9V){
+		PWR_OUTPUT1_ON;
+		PWR_OUTPUT2_OFF;
+		delay_ms(1);
+		PWR_OUTPUT_9V_ON;
+		PWR_OUTPUT_12V_OFF;	
+	}else if(flow_meter_para_g.output_voltage_code == RS485_V1_12V){
+		PWR_OUTPUT1_ON;
+		PWR_OUTPUT2_OFF;
+		delay_ms(1);
+		PWR_OUTPUT_9V_OFF;
+		PWR_OUTPUT_12V_ON;	
+	}else if(flow_meter_para_g.output_voltage_code == RS485_V2_5V){
+		PWR_OUTPUT1_OFF;
+		PWR_OUTPUT2_ON;
+		delay_ms(1);
+		PWR_OUTPUT_9V_OFF;
+		PWR_OUTPUT_12V_OFF;	
+	}
+	delay_ms(1);
+	PWR_BOOST_ENABLE;
 	
 	//�򿪶�ʱ���жϣ���ͬ�豸������ʱ���ȣ�Ҫ��Ҫ���ǹ������������ȡ�������
-	delay_time_s = rs485GetDelayTime(SIZHUMODBUSV2_0);
+	delay_time_s = rs485GetDelayTime(flow_meter_para_g.flow_meter_code);
 	rs485_com_ctrl_pata_g.pwr_delay_status = RESET;
 	rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt = 0;
-	
 	
 	//����״̬��λ
 	rs485_com_ctrl_pata_g.reread_num_cnt = RS485_REREAD_NUM;
@@ -102,85 +206,123 @@
 
 RS485_COM_STATUS_T	rs485ComSendHandle(void)
 {
+	uint32_t	BaudRate;
+	UART_ParityBitTypeDef	ParityBit;
+	UART_StopBitTypeDef		StopBit;
+	
 	//��ʱ��--�� �����ʱ1�룬��--�͵���0�ˣ� ���ж�==0�Ϳ��Զ�ȡ���ݡ���Ϊ�ϵ絽�������ݰ�״̬��ִ�У�����Ͳ���һ��ѭ�����ڵ�ʱ�䣨����1�룩
-	if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt)
-	{
+	if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt){
 		rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt--;
 	}
 	
-	
 	if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt == 0)  //��ʱ��0�Ϳ��Է��Ͷ�ȡָ��
 	{		
-		rs485SendReadData(SIZHUMODBUSV2_0,1); //?�˴����Ҫ��
+		//��������
+//		RS485_UART_GPIO_Init(); //uart_Init�Ѿ�������IO����
+		switch(flow_meter_para_g.baudrate_code ){
+			case BAUDRATE_1200:BaudRate = 1200; break;
+			case BAUDRATE_2400:BaudRate = 2400; break;
+			case BAUDRATE_4800:BaudRate = 4800; break;
+			case BAUDRATE_9600:BaudRate = 9600; break;
+			case BAUDRATE_19200:BaudRate = 19200; break;		
+			case BAUDRATE_56000:BaudRate = 56000; break;
+			case BAUDRATE_57600:BaudRate = 57600; break;
+			case BAUDRATE_115200:BaudRate = 115200; break;
+			default:BaudRate = 9600; break;
+		}
+		switch(flow_meter_para_g.parity_bit ){
+			case PARITY_NONE:ParityBit = NONE; break;
+			case PARITY_ODD:ParityBit = ODD; break;
+			case PARITY_EVEN:ParityBit = EVEN; break;
+			default:ParityBit = NONE; break;
+		}
+		
+		RS485_read_data_uart_Init(BaudRate,ParityBit,OneBit);
+		RS485_read_data_RX_DMA_CH3_Init();
+		
+		RS485_PWR_ON;
+		delay_us(10);
+		rs485SendReadData(flow_meter_para_g.flow_meter_code,flow_meter_para_g.slave_address); 
 		rs485_com_ctrl_pata_g.reread_wait_time_cnt = RS485_REREAD_WATI_TIME; //���õȴ���Ӧʱ��
 		return RS485_COM_WAIT_ANSWER;
 	}
 	
-		
+	return	RS485_COM_SEND;
 }
 
 
-
+#define RS485_READ_ERR_ALARM_TIMES   1  //����RS485_READ_ERR_ALARM_TIMES��ʧ�ܱ���RS485�쳣
 RS485_COM_STATUS_T	rs485ComWaitAnswerHandle(void)
 {
-	ErrorStatus	read_ok = FAIL;
-	//?��鴮������
+	static uint8_t	RS485_err_cnt =0 ; //��ȡʧ�ܼ���
 	
+	ErrorStatus	read_ok = FAIL;
+	//��鴮������
+	RS485_read_data_RX_DMA_check();
 	
 	//��������,����ɹ���������read_ok = PASS
-	if(rs485_com_uart_data_g.recv_flag == SET)
-	{
+	if(rs485_com_uart_data_g.recv_flag == SET){
 		rs485_com_uart_data_g.recv_flag =RESET;
 		
 		read_ok = rs485ComDataAnalysis(rs485_com_uart_data_g,SIZHUMODBUSV2_0,1,rs485_com_ctrl_pata_g ) ;//?�豸���롢�ӻ���ַ���Ҫ��
+		memset(rs485_com_uart_data_g.recv_buf, 0, sizeof(rs485_com_uart_data_g.recv_buf)); //Ӧ�������ս���
+
 	}
 	
-	
-	if(read_ok==PASS)
-	{
-		
-		if(rs485_com_ctrl_pata_g.modbus_step_status >= rs485_com_ctrl_pata_g.modbus_last_status)  
-		{
+	if(read_ok==PASS){
+		if(rs485_com_ctrl_pata_g.modbus_step_status >= rs485_com_ctrl_pata_g.modbus_last_status)  {
 			//?����ͨѶȫ���ɹ���������Ӧ�Ĵ���
 			//�رյ�Դ���رմ���
-			
+			RS485_PWR_OFF;
+			RS485_RE_REC_ENABLE;
+			PWR_BOOST_DIABLE;
+			PWR_OUTPUT1_OFF;
+			PWR_OUTPUT2_OFF;
+			PWR_OUTPUT_9V_OFF;
+			PWR_OUTPUT_12V_OFF;
+			RS485_UART_GPIO_sleep();
+			__SYS_STATUS_BYTES_STATUS(RS485_err, RESET, ALARM_ID_READ_485_ABNORMAL);
+			RS485_err_cnt =0 ;
 			return RS485_COM_IDLE;
 		}
-		else
-		{
+		else{
 			rs485_com_ctrl_pata_g.modbus_step_status ++;
 			return RS485_COM_SEND;
 		}
 	}
 	
-	if((--rs485_com_ctrl_pata_g.reread_wait_time_cnt)==0)
-	{
-		if((--rs485_com_ctrl_pata_g.reread_num_cnt)==0)
-		{
-			//?��ʱ���ض��������꣬����ͨѶ������ʧ�ܸ��գ�������Ӧ�Ĵ���
-			
+	if((--rs485_com_ctrl_pata_g.reread_wait_time_cnt)==0){
+		if((--rs485_com_ctrl_pata_g.reread_num_cnt)==0){
+			//?��ʱ���ض��������꣬����ͨѶ������ʧ�ܸ��գ�������Ӧ�Ĵ���		
 			//�رյ�Դ���رմ��ڣ�RS485ͨѶʧ��+1,
-			
+			RS485_PWR_OFF;
+			RS485_RE_REC_ENABLE;
+			PWR_BOOST_DIABLE;
+			PWR_OUTPUT1_OFF;
+			PWR_OUTPUT2_OFF;
+			PWR_OUTPUT_9V_OFF;
+			PWR_OUTPUT_12V_OFF;
+			RS485_UART_GPIO_sleep();
+			if(RS485_err_cnt < 250){
+				if( ++RS485_err_cnt >= RS485_READ_ERR_ALARM_TIMES)
+					__SYS_STATUS_ALARM_BYTES_SET(RS485_err,ALARM_ID_READ_485_ABNORMAL);
+			}
+		
 			return RS485_COM_IDLE;
-		}else
-		{
+		}else{
 			//��ʱ�����ظ��������У��������·��Ͷ�ȡ����
 			return RS485_COM_SEND;
-		}
-		
+		}	
 	}
 
-	return RS485_COM_WAIT_ANSWER;
-		
+	return RS485_COM_WAIT_ANSWER;	
 }
 
 
 
 void rs485ReadDataPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p)
 {
-	
-	
-	if((sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag ==SET)&&(sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag == RESET))//?�ж�485�ɼ���ʶ
+	if((sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag ==SET)&&(sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag == RESET))//�ж�485�ɼ���ʶ
 	{	
 		sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag = RESET;
 		if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE)
@@ -188,9 +330,7 @@
 			rs485_com_ctrl_pata_g.status = RS485_COM_PWR_ON;
 			sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = SET;
 		}
-	
 	}
-	
 	
 	switch (rs485_com_ctrl_pata_g.status){
 		
@@ -202,8 +342,10 @@
         default:;
     }
 	
-	if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE)
-		sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = RESET;
-	
-	
-}
\ No newline at end of file
+	if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE){
+		if(sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag ==SET){
+			sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = RESET;
+			RS485_trigger_settle_flag = SET; //RS485�ɼ�֮�󴥷�һ�ν���	
+		}		
+	}
+}

--
Gitblit v1.9.3