浏览代码

update:485delay用起来

alienwalker 3 年之前
父节点
当前提交
c66e3c152b
共有 4 个文件被更改,包括 70 次插入21 次删除
  1. 1 1
      application/include/luat_conf_bsp.h
  2. 62 18
      application/src/luat_uart_air105.c
  3. 5 2
      bsp/air105/hal/core_uart.c
  4. 2 0
      bsp/air105/include/core_uart.h

+ 1 - 1
application/include/luat_conf_bsp.h

@@ -174,5 +174,5 @@ extern unsigned int gLVFlashTime;
 #endif
 
 #define LUAT_GPIO_NUMS	32
-
+#define LUAT__UART_TX_NEED_WAIT_DONE
 #endif

+ 62 - 18
application/src/luat_uart_air105.c

@@ -37,15 +37,34 @@
 //存放串口设备句柄
 typedef struct
 {
+	timer_t *rs485_timer;
+	union
+	{
+		uint16_t rs485_param;
+		struct
+		{
+			uint16_t wait_time:14;
+			uint16_t rx_level:1;
+			uint16_t is_485used:1;
+		}rs485_param_bit;
+	};
 	uint8_t rx_mark;
 	uint8_t rs485_pin;
-	uint8_t rx_level;
-	uint8_t is_used485;
 }serials_info;
 static serials_info serials[MAX_DEVICE_COUNT+1] ={0};
 
+static int32_t luat_uart_wait_timer_cb(void *pData, void *pParam)
+{
+	rtos_msg_t msg;
+    msg.handler = l_uart_handler;
+    msg.arg1 = pParam;
+    msg.arg2 = 0;
+    msg.ptr = NULL;
+    luat_msgbus_put(&msg, 1);
+}
 
 int luat_uart_exist(int uartid){
+	if (uartid >= LUAT_VUART_ID_0) uartid = MAX_DEVICE_COUNT;
     if (uartid < 1 || uartid > MAX_DEVICE_COUNT){
         return 0;
     }
@@ -57,17 +76,26 @@ static int32_t luat_uart_cb(void *pData, void *pParam){
     uint32_t uartid = (uint32_t)pData;
     uint32_t State = (uint32_t)pParam;
     uint32_t len;
-    // LLOGD("luat_uart_cb pData:%d pParam:%d ",uartid,State);
+//    LLOGD("luat_uart_cb pData:%d pParam:%d ",uartid,State);
     switch (State){
         case UART_CB_TX_BUFFER_DONE:
             break;
         case UART_CB_TX_ALL_DONE:
-        	if (serials[uartid].is_used485) GPIO_Output(serials[uartid].rs485_pin, serials[uartid].rx_level);
-            msg.handler = l_uart_handler;
-            msg.arg1 = uartid;
-            msg.arg2 = 0;
-            msg.ptr = NULL;
-            luat_msgbus_put(&msg, 1);
+        	if (serials[uartid].rs485_param_bit.is_485used && serials[uartid].rs485_param_bit.wait_time)
+        	{
+        		Timer_StartUS(serials[uartid].rs485_timer, serials[uartid].rs485_param_bit.wait_time, 0);
+        	}
+        	else
+        	{
+                msg.handler = l_uart_handler;
+                msg.arg1 = uartid;
+                msg.arg2 = 0;
+                msg.ptr = NULL;
+                luat_msgbus_put(&msg, 1);
+                if (serials[uartid].rs485_param_bit.is_485used && Uart_IsTSREmpty(uartid)) {
+                	GPIO_Output(serials[uartid].rs485_pin, serials[uartid].rs485_param_bit.rx_level);
+                }
+        	}
             break;
         case UART_CB_RX_BUFFER_FULL:
             break;
@@ -128,7 +156,7 @@ static int32_t luat_uart_usb_cb(void *pData, void *pParam){
             break;
         case UART_CB_TX_ALL_DONE:
             msg.handler = l_uart_handler;
-            msg.arg1 = MAX_DEVICE_COUNT;
+            msg.arg1 = LUAT_VUART_ID_0;
             msg.arg2 = 0;
             msg.ptr = NULL;
             luat_msgbus_put(&msg, 1);
@@ -143,7 +171,7 @@ static int32_t luat_uart_usb_cb(void *pData, void *pParam){
             len = Core_VUartRxBufferRead(VIRTUAL_UART0,NULL,0);
             msg.handler = l_uart_handler;
             msg.ptr = NULL;
-            msg.arg1 = MAX_DEVICE_COUNT;
+            msg.arg1 = LUAT_VUART_ID_0;
             msg.arg2 = len;
             luat_msgbus_put(&msg, 1);
             break;
@@ -154,7 +182,7 @@ static int32_t luat_uart_usb_cb(void *pData, void *pParam){
             Core_VUartBufferTxStop(VIRTUAL_UART0);
             msg.handler = usb_uart_handler;
             msg.ptr = NULL;
-            msg.arg1 = MAX_DEVICE_COUNT;
+            msg.arg1 = LUAT_VUART_ID_0;
             msg.arg2 = 2;
             luat_msgbus_put(&msg, 1);
             break;
@@ -162,7 +190,7 @@ static int32_t luat_uart_usb_cb(void *pData, void *pParam){
             //对方打开串口工具
             msg.handler = usb_uart_handler;
             msg.ptr = NULL;
-            msg.arg1 = MAX_DEVICE_COUNT;
+            msg.arg1 = LUAT_VUART_ID_0;
             msg.arg2 = 1;
             luat_msgbus_put(&msg, 1);
 		    break;
@@ -201,10 +229,14 @@ int luat_uart_setup(luat_uart_t *uart){
     } else {
     	serials[uart->id].rx_mark = 0;
         Uart_BaseInit(uart->id, uart->baud_rate, 1, (uart->data_bits), parity, stop_bits, NULL);
-        serials[uart->id].is_used485 = (uart->pin485 < GPIO_NONE)?1:0;
+        serials[uart->id].rs485_param_bit.is_485used = (uart->pin485 < GPIO_NONE)?1:0;
         serials[uart->id].rs485_pin = uart->pin485;
-        serials[uart->id].rx_level = uart->rx_level;
-        GPIO_Config(serials[uart->id].rs485_pin, 0, serials[uart->id].rx_level);
+        serials[uart->id].rs485_param_bit.rx_level = uart->rx_level;
+        serials[uart->id].rs485_param_bit.wait_time = uart->delay;
+        if (!serials[uart->id].rs485_timer) {
+        	serials[uart->id].rs485_timer = Timer_Create(luat_uart_wait_timer_cb, uart->id, NULL);
+        }
+        GPIO_Config(serials[uart->id].rs485_pin, 0, serials[uart->id].rs485_param_bit.rx_level);
     }
 
     return 0;
@@ -220,7 +252,7 @@ int luat_uart_write(int uartid, void *data, size_t length){
         Core_VUartBufferTx(VIRTUAL_UART0, (const uint8_t *)data, length);
     }
     else {
-    	if (serials[uartid].is_used485) GPIO_Output(serials[uartid].rs485_pin, !serials[uartid].rx_level);
+    	if (serials[uartid].rs485_param_bit.is_485used) GPIO_Output(serials[uartid].rs485_pin, !serials[uartid].rs485_param_bit.rx_level);
         Uart_BufferTx(uartid, (const uint8_t *)data, length);
     }
     return length;
@@ -231,6 +263,7 @@ int luat_uart_read(int uartid, void *buffer, size_t length){
     if (!luat_uart_exist(uartid)){
         return 0;
     }
+    if (uartid >= LUAT_VUART_ID_0) uartid = MAX_DEVICE_COUNT;
     serials[uartid].rx_mark = 0;
     if (uartid >= MAX_DEVICE_COUNT)
         ret = Core_VUartRxBufferRead(VIRTUAL_UART0, (uint8_t *)buffer,length);
@@ -244,7 +277,8 @@ int luat_uart_close(int uartid){
     if (!luat_uart_exist(uartid)){
         return 0;
     }
-    serials[uartid].is_used485 = 0;
+    if (uartid >= LUAT_VUART_ID_0) uartid = MAX_DEVICE_COUNT;
+    serials[uartid].rs485_param_bit.is_485used = 0;
     if (uartid >= MAX_DEVICE_COUNT)
         Core_VUartDeInit(VIRTUAL_UART0);
     else
@@ -267,3 +301,13 @@ int luat_setup_cb(int uartid, int received, int sent){
     }
     return 0;
 }
+
+void luat_uart_wait_485_tx_done(int uartid)
+{
+    if (luat_uart_exist(uartid)){
+        if (serials[uartid].rs485_param_bit.is_485used){
+        	while(!Uart_IsTSREmpty(uartid)) {;}
+        	GPIO_Output(serials[uartid].rs485_pin, serials[uartid].rs485_param_bit.rx_level);
+        }
+    }
+}

+ 5 - 2
bsp/air105/hal/core_uart.c

@@ -408,11 +408,15 @@ void Uart_DMARx(uint8_t UartID, uint8_t Stream, uint8_t *Data, uint32_t Len)
 	DMA_ForceStartStream(Stream, Data, Len, prvUart_DMAIrqCB, (uint32_t)UartID, 1);
 }
 
+uint8_t Uart_IsTSREmpty(uint8_t UartID)
+{
+	UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
+	return (Uart->LSR & UART_LSR_TEMT);
+}
 
 int32_t Uart_BufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
 {
 	UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
-
 	ISR_OnOff(prvUart[UartID].IrqLine, 0);
 #ifdef __BUILD_OS__
 	if (Data && Len)
@@ -586,7 +590,6 @@ static void prvUart_Tx(uint8_t UartID, UART_TypeDef* Uart)
 	{
 		Uart_BufferTx(UartID, NULL, 0);
 	}
-
 	if (!prvUart[UartID].TxBuf.Data && !prvUart[UartID].TxCacheBuf.Pos)
 #else
 	if (!prvUart[UartID].TxBuf.Data)

+ 2 - 0
bsp/air105/include/core_uart.h

@@ -83,6 +83,8 @@ void Uart_DMATx(uint8_t UartID, uint8_t Stream, const uint8_t *Data, uint32_t Le
 
 void Uart_DMARx(uint8_t UartID, uint8_t Stream, uint8_t *Data, uint32_t Len);
 
+uint8_t Uart_IsTSREmpty(uint8_t UartID);
+
 uint32_t Uart_RxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len);
 
 void Uart_RxBufferCB(uint8_t UartID, CBFuncEx_t CB);