Allwinner T113 UART转485

UART与RS-485转换在工控中的实现:实战案例详解 深入解析UART与RS-485协议转换在工业控制中的实际部署,结合典型场景展示信号稳定性与长距离传输优势,突出uart接口在多设备互联中的关键作用。 阅读详情
AI摘要

该博客围绕Allwinner T113的UART转485展开。产品和硬件均为T113,软件是linux + uart,目标是实现uart转485功能。虽未提及问题复现步骤、具体表现、分析及根本原因,但给出了T113中uart转485的patch及dts配置参考。

1.主题

UART转485

2.问题背景

产品:T113
硬件:T113
软件:linux+ uart
其他:uart转485功能实现

3.问题描述

3.1复现步骤

无

3.2具体表现

无

4.问题分析

无

5.根本原因

无

6.解决办法

如下是T113中uart转485patch可以参考附件,dts的配置如下:

	uart1: uart@05000400 {
		status = "okay";
		uart1_type = <2>;
		uart1_rs485=<1>;
		uart1_485fl=<0>;
		uart1_485oe=<&pio PG 1 1 0xffffffff 0xffffffff 0>;
	};

patch如下:

diff --git a/arch/arm/boot/dts/sun8iw20p1.dtsi b/arch/arm/boot/dts/sun8iw20p1.dtsi
index 6e51b72..4d3fb29 100644
--- a/arch/arm/boot/dts/sun8iw20p1.dtsi
+++ b/arch/arm/boot/dts/sun8iw20p1.dtsi
@@ -613,8 +613,11 @@
 			clock-names = "uart1";
 			resets = <&ccu RST_BUS_UART1>;
 			uart1_port = <1>;
-			uart1_type = <4>;
+			uart1_type = <2>;
 			status = "okay";
+			uart1_rs485=<1>;
+			uart1_485fl=<0>;
+			uart1_485oe=<&pio PG 1 1 0xffffffff 0xffffffff 0>;			
 		};
 
 		uart2: uart@2500800 {
diff --git a/drivers/tty/serial/sunxi-uart.c b/drivers/tty/serial/sunxi-uart.c
index 395b1bd..f013ad2 100644
--- a/drivers/tty/serial/sunxi-uart.c
+++ b/drivers/tty/serial/sunxi-uart.c
@@ -43,6 +43,10 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
+
+#include <linux/delay.h>
+#include <uapi/linux/sched/types.h>
+#include <linux/of_gpio.h>
 #include "sunxi-uart.h"
 
 #if defined(CONFIG_SERIAL_SUNXI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
@@ -191,6 +195,28 @@ static inline void sw_uart_disable_ier_thri(struct uart_port *port)
 	}
 }
 
+
+/********************************************************************/
+/* cet,liudachuan: rs485 delayed rts release control, not used now */
+# if 0
+static enum hrtimer_restart uart_set_rs485(struct hrtimer *u_timer)
+{
+	struct sw_uart_port *sw_uport = container_of(u_timer, struct sw_uart_port, uart_timer);
+	if(sw_uport == NULL)
+	{
+		SERIAL_DBG("faile to get sw_uport\n", __func__);
+		return HRTIMER_NORESTART;
+	}
+	
+	if(sw_uport->rs485_en){
+		gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
+	}
+
+	return HRTIMER_NORESTART;
+}
+#endif
+/***********************************************************************************/
+
 static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned int lsr)
 {
 	unsigned char ch = 0;
@@ -272,23 +298,66 @@ static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned in
 	return lsr;
 }
 
+
+
+/******************************************************************************/
+/* cet,liudachuan: add sw-rs485 support */
+#define BITS_PER_SERIAL_BYTE	10
+#define NANOSECOND_PER_USECONDS	1000
+#define USECONDS_PER_SECOND		1000000
+static void sw_uart_rs485_cal_tout(struct uart_port *port, unsigned int lcr)
+{
+	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
+	unsigned int bits_per_byte;
+	if (lcr & SUNXI_UART_LCR_PARITY) /*有奇偶的时候,byte=start+8+parity=10*/
+		bits_per_byte = 10;
+	else    /*无奇偶的时候,byte=start+8=9*/
+		bits_per_byte = 9;
+
+	if (sw_uport->baud != 0) {
+		sw_uport->tout = 
+			(bits_per_byte * USECONDS_PER_SECOND) / (sw_uport->baud) * NANOSECOND_PER_USECONDS;
+	}
+	else {
+		sw_uport->tout = 0;
+	}
+}
+
 static void sw_uart_stop_tx(struct uart_port *port)
 {
-#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
 	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
+
+#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
 	struct sw_uart_dma *uart_dma = sw_uport->dma;
 
 	if (uart_dma->use_dma & TX_DMA)
 		sw_uart_stop_dma_tx(sw_uport);
 #endif
 	sw_uart_disable_ier_thri(port);
+	/* cet,liudachuan: delay 1 byte transmit time then turn off rs485 tx-en */
+	if (sw_uport->rs485_en) {
+	   	// hrtimer_start(&sw_uport->uart_timer, sw_uport->tout, HRTIMER_MODE_REL);
+		unsigned char lsr = 0;
+		while ((lsr & SUNXI_UART_LSR_BOTH_EMPTY) != SUNXI_UART_LSR_BOTH_EMPTY) {
+			// cpu_relax();
+			udelay(10);
+			lsr = serial_in(port, SUNXI_UART_LSR);
+		};
+		gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
+	}
 }
 
 static void sw_uart_start_tx(struct uart_port *port)
 {
-#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
 	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
+	/* cet,liudachuan: rs485 rts = 1 */
+	// serial_out(port, sw_uport->mcr & (~SUNXI_UART_MCR_RTS), SUNXI_UART_MCR);
+	if(sw_uport->rs485_en){
+		// udelay(20);
+		gpio_direction_output(sw_uport->rs485oe_io.gpio, !sw_uport->rs485_fl);
+	}
 
+#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
 	if (!((sw_uport->dma->use_dma & TX_DMA) && sw_uport->dma->tx_dma_used))
 #endif
 		sw_uart_enable_ier_thri(port);
@@ -342,8 +411,14 @@ static void sw_uart_handle_tx(struct sw_uart_port *sw_uport)
 		uart_write_wakeup(&sw_uport->port);
 		spin_lock(&sw_uport->port.lock);
 	}
-	if (uart_circ_empty(xmit))
-		sw_uart_stop_tx(&sw_uport->port);
+
+	/* cet,liudachuan: add sw-rs485 support */
+	// if (uart_circ_empty(xmit))
+	//     sw_uart_stop_tx(&sw_uport->port);
+	if (!sw_uport->rs485_en) {
+		if (uart_circ_empty(xmit))
+			sw_uart_stop_tx(&sw_uport->port);
+	}
 }
 
 static unsigned int sw_uart_modem_status(struct sw_uart_port *sw_uport)
@@ -354,7 +429,7 @@ static unsigned int sw_uart_modem_status(struct sw_uart_port *sw_uport)
 	sw_uport->msr_saved_flags = 0;
 
 	if (status & SUNXI_UART_MSR_ANY_DELTA && sw_uport->ier & SUNXI_UART_IER_MSI &&
-	    sw_uport->port.state != NULL) {
+		sw_uport->port.state != NULL) {
 		if (status & SUNXI_UART_MSR_TERI)
 			sw_uport->port.icount.rng++;
 		if (status & SUNXI_UART_MSR_DDSR)
@@ -724,6 +799,25 @@ static enum hrtimer_restart sw_uart_report_dma_rx(struct hrtimer *rx_hrtimer)
 
 #endif
 
+
+
+/**
+ * 串口中断实测14-135us,数据发完后gic_handle_irq两次进入中断,第二次才真正进入串口中断,导致整个延迟变大
+ * 通过提高中断线程优先级为4以上,可以解决,时间缩短到(-5-35us),这里优先级设置为1
+ * cet,ljt 2021.10
+*/
+static inline void sw_uart_irq_set_pri(struct sw_uart_port *sw_uport)
+{
+    struct sched_param param = { .sched_priority = MAX_USER_RT_PRIO - 2 };
+	if (sw_uport->irq_pri_promoted)
+		return;
+	if (sched_setscheduler(current, SCHED_FIFO, &param) < 0)
+	{
+		SERIAL_MSG("sched_setscheduler set error\n");
+	}
+	sw_uport->irq_pri_promoted = 1;
+}
+
 static irqreturn_t sw_uart_irq(int irq, void *dev_id)
 {
 	struct uart_port *port = dev_id;
@@ -731,6 +825,9 @@ static irqreturn_t sw_uart_irq(int irq, void *dev_id)
 	unsigned int iir = 0, lsr = 0;
 	unsigned long flags;
 
+	/* if we hasn't promote the irq priority, set priority to 97 */
+	//sw_uart_irq_set_pri(sw_uport);
+
 	spin_lock_irqsave(&port->lock, flags);
 
 	iir = serial_in(port, SUNXI_UART_IIR) & SUNXI_UART_IIR_IID_MASK;
@@ -1072,7 +1169,7 @@ static void sw_uart_flush_buffer(struct uart_port *port)
 }
 
 static void sw_uart_set_termios(struct uart_port *port, struct ktermios *termios,
-			    struct ktermios *old)
+				struct ktermios *old)
 {
 	struct sw_uart_port *sw_uport = UART_TO_SPORT(port);
 	unsigned long flags;
@@ -1119,6 +1216,12 @@ static void sw_uart_set_termios(struct uart_port *port, struct ktermios *termios
 	dlh = quot >> 8;
 	SERIAL_DBG("set baudrate %d, quot %d\n", baud, quot);
 
+	/* cet,liudachuan: add sw rs485 support */
+	sw_uport->baud = baud;
+	if (sw_uport->rs485_en) {
+		sw_uart_rs485_cal_tout(port, lcr);
+	}
+
 	spin_lock_irqsave(&port->lock, flags);
 	uart_update_timeout(port, termios->c_cflag, baud);
 
@@ -1379,7 +1482,7 @@ static int sw_uart_ioctl(struct uart_port *port, unsigned int cmd,
 }
 
 static void sw_uart_pm(struct uart_port *port, unsigned int state,
-		      unsigned int oldstate)
+			  unsigned int oldstate)
 {
 #if IS_ENABLED(CONFIG_EVB_PLATFORM)
 	int ret;
@@ -1727,7 +1830,7 @@ static void sw_console_putchar(struct uart_port *port, int c)
 }
 
 static void sw_console_write(struct console *co, const char *s,
-			      unsigned int count)
+				  unsigned int count)
 {
 	struct uart_port *port = NULL;
 	struct sw_uart_port *sw_uport;
@@ -1909,6 +2012,9 @@ static int sw_uart_probe(struct platform_device *pdev)
 	char uart_para[16] = {0};
 	const char *uart_string;
 	int ret = -1;
+	int rs485_en = 0;         //2020.09.24 2¨??? ¨?¨a?¨?RS485????
+	int rs485_fl = 0;
+
 	struct device_node *apk_np = of_find_node_by_name(NULL, "auto_print");
 	const char *apk_sta = NULL;
 #if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
@@ -2052,6 +2158,45 @@ static int sw_uart_probe(struct platform_device *pdev)
 	else
 		sw_uport->card_print = false;
 
+	/* cet,liudachuan: add sw-rs485 support */
+	/************ Modify by wangshunfan @2021.01.11 for this part *************/
+	/* Get rs485 enable flag */
+	snprintf(uart_para, sizeof(uart_para), "uart%d_rs485", pdev->id);
+	ret = of_property_read_u32(np, uart_para, &rs485_en);
+	if (ret) {
+		SERIAL_MSG("error to get uart%d_rs485\n", pdev->id);
+			rs485_en = 0;
+	}
+	sw_uport->rs485_en = rs485_en;
+
+	//SERIAL_DBG("caid rs485_en = %d port = %d", rs485_en, pdev->id);
+	if (sw_uport->rs485_en) {
+		snprintf(uart_para, sizeof(uart_para), "uart%d_485fl", pdev->id);
+		ret = of_property_read_u32(np, uart_para, &rs485_fl);
+		if (ret) {
+			SERIAL_MSG("error to get tuart%d_rs485\n", pdev->id);
+				rs485_fl = 0;
+		}
+		sw_uport->rs485_fl = rs485_fl;
+
+		/* Get rs485 enable control pin, request and init gpio */
+		snprintf(uart_para, sizeof(uart_para), "uart%d_485oe", pdev->id);
+		sw_uport->rs485oe_io.gpio = of_get_named_gpio_flags(np, uart_para, 0,
+			(enum of_gpio_flags *)(&(sw_uport->rs485oe_io)));
+		if (gpio_is_valid(sw_uport->rs485oe_io.gpio)){
+			gpio_request(sw_uport->rs485oe_io.gpio, NULL);
+			gpio_direction_output(sw_uport->rs485oe_io.gpio, sw_uport->rs485_fl);
+		}
+
+		/* Init hrtimer for rs485 and set timeout callback function */
+		// hrtimer_init(&sw_uport->uart_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+		// sw_uport->uart_timer.function = uart_set_rs485;
+
+		sw_uport->irq_pri_promoted = 0;
+		SERIAL_MSG("uart%d rs485 enabled\n", pdev->id);
+	}
+	/**************** end of modify by wangshunfan for this part ****************/
+
 	pdata->used = 1;
 	port->iotype = UPIO_MEM;
 	port->type = PORT_SUNXI;
@@ -2129,7 +2274,14 @@ static int sw_uart_remove(struct platform_device *pdev)
 	struct sw_uart_port *sw_uport = platform_get_drvdata(pdev);
 
 	SERIAL_DBG("release uart%d port\n", sw_uport->id);
-#if IS_ENABLED(CONFIG_SERIAL_SUNXI_DMA)
+
+	/* cet,liudachuan: add sw-rs485 support */
+	if (sw_uport->rs485_en) {
+		gpio_free(sw_uport->rs485oe_io.gpio);	/* free gpio of rs485 */
+		// hrtimer_cancel(&sw_uport->uart_timer);	/* canel hrtimer      */
+	}
+
+#ifdef CONFIG_SERIAL_SUNXI_DMA
 	sw_uart_release_dma_tx(sw_uport);
 	sw_uart_release_dma_rx(sw_uport);
 #endif
diff --git a/drivers/tty/serial/sunxi-uart.h b/drivers/tty/serial/sunxi-uart.h
index 565acbf..ab096d6 100644
--- a/drivers/tty/serial/sunxi-uart.h
+++ b/drivers/tty/serial/sunxi-uart.h
@@ -22,6 +22,8 @@
 #include <linux/dmaengine.h>
 #include <linux/reset.h>
 //include <linux/serial_core.h>
+#include <linux/ktime.h>
+#include <linux/sunxi-gpio.h>
 
 /* SUNXI UART PORT definition*/
 #define PORT_MAX_USED	PORT_LINFLEXUART  /* see include/uapi/linux/serial_core.h */
@@ -106,6 +108,16 @@ struct sw_uart_port {
 	struct serial_rs485 rs485conf;
 	bool card_print;
 	bool throttled;
+
+    /* cet,liudachuan: add rs485 support(not hardware's rs485) */
+    struct gpio_config rs485oe_io;
+    unsigned int rs485_en;
+    unsigned int rs485_fl;
+    struct hrtimer uart_timer;
+    unsigned int baud;
+    int irq_pri_promoted;
+    /* Added by wangshunfan @2021.01.11 for hrtimer timeout */
+	ktime_t tout;
 };
 
 /* register offset define */
@@ -191,6 +203,8 @@ struct sw_uart_port {
 #define SUNXI_UART_LSR_OE         (BIT(1))
 #define SUNXI_UART_LSR_DR         (BIT(0))
 #define SUNXI_UART_LSR_BRK_ERROR_BITS 0x1E /* BI, FE, PE, OE bits */
+/* cet,liudachuan: add BOTH_EMPTY macro */
+#define SUNXI_UART_LSR_BOTH_EMPTY   (SUNXI_UART_LSR_TEMT | SUNXI_UART_LSR_THRE)
 /* Modem Status Register */
 #define SUNXI_UART_MSR_DCD        (BIT(7))
 #define SUNXI_UART_MSR_RI         (BIT(6))
STM32之串口UART-485(五) 一般STM32F407芯片都会自带好几路UART串口,但从407芯片端口输出的串口UART信号为TTL信号,这时我们就需要485驱动芯片,也可以说是电平转换芯片,将TTL信号转换为所需要的485信号,一般市场上所卖的板子都带这一功能的,因此要实现串口RS485通讯功能,需准备STM32F407开发板一块。 阅读详情

相关推荐

ESP32 (UART 485通讯)-串口之485通讯(3)

提示:本博客作为学习笔记,有错误的地方希望指正 文章目录一、ESP32串口介绍二、硬件设计三、实现代码四、串口实验演示结果五、ESP32串口函数API5.1、uart_types.h文件中的内容的API5.2、在uart.h文件中的内容的API 一、ESP32串口介绍   UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。   一个典型的 UART 帧开始于一个起始位,紧接

believe666的博客 2万+

串口通讯(uart ,232,485)

uart(232,485)通讯

qq_57628024的博客 2677

串口转RS485:自动收发串口转RS485设计注意事项

自动收发串口转RS485设计注意事项

Zhichao_Zhang的博客 1万+

UART、RS232、RS485 串行通信详解

UART、RS232、RS485三种串行通信接口及协议规范的介绍与总结

kvts99的博客 1万+

(盈鹏飞嵌入式T113-S4主板)-Tina5.0系统RS232&RS485测试

本次测试标准串口 COM11已经连接主板的调试串口,待测试串口连接KIT-CP2105的增强型串口(COM12),连接工作准备好后,开始进行测试工作。此时可以在串口调试小助手的发送区输入要发送的的数据,选择自动发送或手动发送,调试终端则会显示接收的数据,同时主板将数据返回给串口调试小助手。测试过程按“Ctrl+c”终止测试指令。由上图可以看到,转接板已经正确连接,并可以识别到两个串口设备,增强型串口(Enanced COM,COM12)和标准串口(Standard COM,COM11)。

szembed的博客 1145

hi3516a uart1 转rs485

hi3516a上面的uart1口转rs485的uart1设置和测试,经过验证可行 hi3516a上面的uart1口转rs485的uart1设置和测试,经过验证可行 hi3516a上面的uart1口转rs485的uart1设置和测试,经过验证可行

(盈鹏飞嵌入式T113-S4主板)-RS485总线简单测试

通过以上命令和串口调试小助手即可进行收发测试,通过ctrl+x可退出。特别要说明的是RS485总线是半双工的,当通过主板发送数据的时候,此时是不能接受数据的。主板支持一路RS485总线接口(非隔离),对应/dev设备节点为ttyAS4。硬件连接时,主板的RS485_A信号接对方的A信号或者T+信号;并注意UART4的功能选择跳线J2要配置到RS485模式;主板的RS485_B信号接对方的B信号或者T-信号;图68 RS485接口位置。CAN1的CANL信号。CAN1的CANH信号。

szembed的博客 644

xhs私信协议分析

之前分析过xhs的shield算法,今天再聊聊xhs的私信,文章仅供学习参考研究交流,如有侵权请联系删帖。经过抓包分析发现私信接口并不是走的http协议,而是socket协议。而要获取socket包则需要使用wireshark软件1、protobuf的包体中的序号7,多次验证后发现文字信息的需要需要固定成12、protobuf的包体中的序号12,多次验证后发现文字信息的需要需要固定成1后续有时间的话,再研究一下视频和图片格式的私信协议,这次就分析到这里吧。

佛系更新... 3478

硬件切换485电路

485接口具有很好的抗噪音抗干扰、长距离传输和多站能力特性,使其为工控行业首选串行接口。485规定的电气特性为2线,半双工多点通信。它的电气特性是有线缆两端的电压差来决定的。由于半双工模式,通讯时需要切换收发状态,485电路大多分为如下几种: 传统RS485电路(带收发控制脚非隔离RS-485电路) : 传统的485应用电路如下图所示,TTL电平端采用3线控制,常见的控制方式为: 从接收状态向发

sternlycore的博客 2万+

清华开源GPGPU“承影Ventus”初体验:用RISC-V RVV指令集跑通第一个OpenCL程序

本文详细介绍了清华大学开源GPGPU“承影Ventus”的开发实践,展示了如何基于RISC-V RVV指令集运行首个OpenCL程序。从环境配置、内核开发到性能优化,全面解析了这一创新架构的开发流程,为开发者提供了在RISC-V生态中进行通用GPU计算的实用指南。

weixin_30415113的博客 489

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 523

(盈鹏飞嵌入式T113-S4主板)-RTC 时钟测试

特别说明:如果存在/dev/rtc0和rtc1,那么/dev/rtc0是CPU自带硬时钟,/dev/rtc1是HYM8563硬件时钟。查看硬件时钟,检查是否是上面hwclock -w所设置的时钟。使用hwclock写入硬件时钟。图13 电池座BAT1。

szembed的博客 755

头歌平台-人工智能导论实验(人脸识别)

答案仅供参考,自己动手丰衣足食!!!

qq_52119136的博客 3026

总线协议:基于RS-485的Modbus协议(2):数据链路层(UART)实现

详细介绍了Modbus数据链路层:UART实现。

kevin1499的博客 2282

Tessent Atpg系列 第七章 Running ATPG Patterns -- 如何书写proc文件

本篇文章是记录Tessent scan ATPG系列 本文并非是对userguide的完全翻译,而是自己对userguide的理解,此外,有部分比较深入的内容可能需要后续实验验证。本系列并不对tessent scan做过多描述。 请勿随意转载: 优快云 博主: ciscomonkey一种是在使用tessent scan之后使用ATPG 另一种是使用第三方工具,如snps的DFTC之后使用tessent的ATPG。 这里我们仅仅介绍without tessent scan之后tessent ATPG:对于t

ciscomonkey的博客 7693

kettle9.0+ 连接Hadoop报错

kettle bug

x²+(y-√³x²)²=1的博客 1559

CC2530 芯片的UART转485通信的实现

应用: UART控制485硬件 需求:该485设备是半双工的通信方式,因此需要使用另外的IO口来控制转换芯片MAX3485的收发工作。 实现原理: 代码贴了。基本方式就是在使用UART发送时,从IO口输出高电平(由电路决定),使得MAX3485处于接收状态。当发送完成产生中断时,将IO输出低电平,等待设备反馈信息。 遇到的问题: 设备收不到正确的信号,无法正常工作。 解决办法:

huangmeimao的专栏 6842

Couldn‘t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案

本文主要介绍了Couldn’t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案,希望能对使用winscp的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 4万+

AllWinner T113 原厂修改内核篇

AllWinner T113 测试篇

ldinvicible的专栏 767

【Davinci开发】:MPU(内存保护)

【Davinci开发】:MPU(内存保护)

2205

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

UART和RS485的关系

和是两种不同的技术,但它们在串行通信中经常结合使用。

SPIRITxiaohuo的博客 2258

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

T113 串口3调试记录

全志T113串口3调试记录

u012422022的博客 2800

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《全志T113-S3 TinaSDK学习笔记》---终端uart串口修改

earlyprintk变量指定了内核日志打印的设备,第一个参数未对应设备,第二个参数设备地址,console指定了串口和波特率,设备地址通过查看t113-i_uaer_mannual手册memort mapping可确认,如图8所示。通过make kernel_menuconfig指令配置内核,找到kernel hacking->Kernellow-level debugging functions,修改寄存器地址如图9所示,地址看图8所示。如图1所示,源码串口是UART1,我们需要修改为UART3。

xuewant123的博客 2293

【正点原子】全志T113-i开发板 异核开发、工控设计方案!

1、高性价比主控全志T113-i芯片是一款专为嵌入式及物联网应用设计的SOC,搭载了双核ARM Cortex-A7处理器核心,主频可达1.2GHz,同时集成了C906 RISC-V核和HiFi4 DSP。它支持丰富的多媒体处理能力,包括高清视频解码与编码,以及硬件级别的2D图形加速。支持1080P@60fps JPEG/MJPEG视频硬件编码、支持4K@30fps H.265、4K@24fps H.264视频硬件解码。

weixin_55796564的博客 1358

新手小白 、大佬 都必须梳理清楚的 “ 串口UART与RS232、RS422、RS485转接芯片 ”!!!最强文章来袭!!!

本文介绍了串口UART与RS232/RS422/RS485协议转换芯片的原理及应用。这些小芯片将MCU输出的TTL信号转换为工业标准电平,解决通信距离、抗干扰和组网问题。文章详细对比了各标准的电气特性,列举了MAX232、SN75176B等典型芯片的应用场景,并分析了优缺点。同时提供了选型指南和工程实践建议,强调这些"数据翻译官"对工业自动化、IoT等领域的重要性。文末指出,掌握串口转换技术是嵌入式开发的基础能力,对打造高可靠性智能系统至关重要。

qq_75157958的博客 3669

RK3576平台:四路UART转RS-485(GPIO模拟RTS/DE)完全指南

摘要: 本文详细介绍了在RK3576平台上实现UART转RS-485通信的完整方案,重点解决GPIO模拟RTS/DE引脚控制问题。通过硬件接线指导、设备树配置(使用rs485-de-gpios属性)、底层驱动原理解析(内核级自动GPIO控制)和应用层代码示例,提供了一套从硬件到软件的完整实现方法。特别强调避免应用层手动控制GPIO导致的丢包问题,并推荐通过命令行工具(如stty、microcom)进行硬件验证。最后给出C语言实现代码,确保RS-485通信稳定可靠,适用于工业控制与物联网网关开发场景。

qq_49179489的博客 558
上一篇: 63104 PCIe Switch芯片 - 国产高性能解决方案
下一篇: XConn PCIe Switch 和 CXL:加速AI基础设施的创新
菓冻兒
博客等级 码龄15年 49粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值