1. 程式人生 > >海思3518c普通串列埠更換485通訊(啟用rtsn管腳)-核心程式碼修改

海思3518c普通串列埠更換485通訊(啟用rtsn管腳)-核心程式碼修改

海思3518c普通串列埠更換485通訊

方案需求:

3518c串列埠1uart1)有三個管腳,txrxrtsn收發控制埠。在使用普通的串列埠時,rtsn管腳是沒有用的的,但是485需要用到,這裡因暫時不知道海思底層是否有自動設定rtsn管腳功能,所以這裡先將該管腳設定為普通gpio管腳用來手動控制高低電平,以實現我們需要的485工作模式

這裡遇到一個問題,就是當我們傳送完資料後,就是往UART01x_DR資料暫存器寫資料,並判斷UART_FR暫存器標準為是否傳送完成(海思文件是這麼寫的),確實,資料通過FIFO傳送完成後完成標誌會置位,但是實際的管腳還在工作(常態為低電平,當傳送標誌位置位後,rtsn管腳還是搞電平,需要一段時間才變成低電平),非同步工作。

所以我們就需要設計一個延時機制,當tx管腳還在工作時,rtsn必須高電平,當tx完成傳送時,rtsn為低電平。

程式設計:

海思是使用amba架構,所以在amba-pl011.c中:

1.傳送中啟動rtsn管腳,pl011_start_tx函式中新增:

<pre name="code" class="cpp">static void pl011_start_tx(struct uart_port *port)
{
	struct uart_amba_port *uap = (struct uart_amba_port *)port;
	if (!pl011_dma_tx_start(uap)) {
		uap->im |= UART011_TXIM;
		writew(uap->im, uap->port.membase + UART011_IMSC);
	}
	if(uap->port.line == 1) 判斷為串列埠1方式
	{	
		writel(0xFF, IO_ADDRESS(0x20160010));設定rtsn高電平
		txdatafirsttimens =  local_clock();	//獲取基準時間
	}
	
}

2.傳送停止中處理延時清除rtsn管腳電平,pl011_stop_tx函式:

unsigned long txdatecount = 0;  //定義傳送資料位元組數。
unsigned long long txdatafirsttimens =0;//定義傳送資料基準時間。
static void pl011_stop_tx(struct uart_port *port)
{
	struct uart_amba_port *uap = (struct uart_amba_port *)port;
	uap->im &= ~UART011_TXIM;
	writew(uap->im, uap->port.membase + UART011_IMSC);
	pl011_dma_tx_stop(uap);

	if(uap->port.line == 1 )
	{	
		unsigned long long txdatalocaltimens= 0; //定義資料傳送當前時間(納秒)
		unsigned int txdatalocaltimeus= 0; //定義資料傳送當前時間(微秒)
		unsigned int txdateusetime = 0; //定義資料傳送時間需要時間

		/* 平均100傳送一百個位元組需要佔用52毫秒(硬體控制管腳)
		    這裡機制是在傳送函式獲取一個基準時間,並在停止函式中獲取當前時間
		    與所發位元組需要時間對比判斷。
		*/
		txdateusetime = txdatecount * 520;
		txdatecount = 0;
		
		while(1)
		{
			txdatalocaltimens= local_clock(); //獲取當前時間
			txdatalocaltimeus= (txdataendtimens - txdatafirsttimens);
			txdatalocaltimeus= txdatalocaltimeus/ 1000;
			
			if(txdateusetime <= txdatalocaltimeus) //當前時間超過實際需要時間
				break;
			udelay(10);//10微秒級別
		}
		udelay(50);//這裡是為一個拉低管腳緩衝時間,防止過早拉低。
		writel(0, IO_ADDRESS(0x20160010));
		//printk("txdateusetime:%d,txdatausetimeus:%d\n",txdateusetime,txdatausetimeus);
	}
}

3.計算髮送位元組,pl011_tx_chars

在該函式中新增:

do {
		writew(xmit->buf[xmit->tail], uap->port.membase + UART01x_DR);
		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
		uap->port.icount.tx++;

		if(uap->port.line == 1)
		{
			txdatecount++;
		}
		
		if (uart_circ_empty(xmit))
			break;
	} while (--count > 0);


4.初始化函式pl011_init

static int __init pl011_init(void)
{
	int ret;
	printk(KERN_INFO "Serial: AMBA PL011 UART driver\n");

	/*
	 * 新增RTSN收發控制。
	 */
	unsigned int u32Temp;
	u32Temp = readl(IO_ADDRESS(0x200F0020));	
	printk("GPIO_RTSN is %02x\n",u32Temp);
	writel(0x00, IO_ADDRESS(0x200F0020));
	
	u32Temp = readl(IO_ADDRESS(0x20160400));	
	u32Temp |= (1 << 2);	
	writel(u32Temp, IO_ADDRESS(0x20160400));
	writel(0, IO_ADDRESS(0x20160010));

	ret = uart_register_driver(&amba_reg);
	if (ret == 0) {
		ret = amba_driver_register(&pl011_driver);
		if (ret)
			uart_unregister_driver(&amba_reg);
	}
	return ret;
}


相關推薦

3518c普通串列更換485通訊啟用rtsn-核心程式碼修改

海思3518c普通串列埠更換485通訊 方案需求: 3518c串列埠1(uart1)有三個管腳,tx、rx和rtsn收發控制埠。在使用普通的串列埠時,rtsn管腳是沒有用的的,但是485需要用到,這裡

HI35xx平臺串列配置方法

前言 序列介面簡稱串列埠(通常指COM介面),是採用序列通訊方式的擴充套件介面,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊,從而大大降低了成本,但傳送速度一般,資料傳輸率為115kbps~230kbps。非同步序列是指UART(Universal Asynchr

[RK3288][Android6.0] 除錯筆記 --- 普通串列的新增

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 uart0,1,3,4 (普通串列埠) 用的是同一個串列埠驅動. uart2(除錯串列埠)的驅動程式碼嵌在fiq debugger的code中. 相關的配置在rk3288.dtsi中:

rk3399除錯串列改為普通串列步驟

1、本人使用的開發板是友善的NanoPC-T4,Android7.1.2,要吐槽一下友善了,對於這個平臺,感覺資料太少,技術支援不到位,可能由於多年不碰Linux底層的原因,遇到了很多問題,在此記錄下來,防止忘記。 2、配置核心檔案 Device Drivers &g

RT5350 openwrt將ttyS1修改為控制,ttyS0為普通串列

1、首先修改openwrt/trunk/target/linux/ramips/dts/rt5350.dtsi配置檔案: 預設的rt5350.dtsi配置檔案是將擴充套件串列埠ttyS1狀態給禁用的,需要把狀態改為okey,如下:         [email p

樹莓派的除錯串列作為普通串列使用

修改cmdline.txt 將所有ttyAMA0相關配置刪除 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfst

樹莓派通過串列與計算機通訊

希望此文可以解決部分朋友的問題。 第一步:用“USB TO TTL”將樹莓派和計算機連線。 第二步:在計算機安裝“USB TO TTL”的驅動 第三步:在計算機上安裝串列埠除錯助手。 第四步:到https://pypi.org/project/pyserial/上下載pyserial

串列通訊unity,VS通用

該專案可直接編譯成黑窗體來執行,也可以將程式碼copy到unity中使用。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; usi

STM32串列2種通訊模式:非同步通訊與同步通訊

目錄 3.非同步通訊 1.特點 4.同步通訊 1.特點  傳送資料暫存器TDR和傳送移位暫存器:傳送暫存器用來儲存要傳送的資料,一位暫存器用來將資料從LSB一位一位地移出去  接收資料暫存器RDR和接收移位暫存器:接受資料移位暫存器將資料從L

開源QT寫的串列除錯上位機帶波形顯示

為了方便PC機同微控制器(下位機)進行通訊,需要開發一款基於串列埠協議的上位機輔助除錯軟體。軟體不僅能夠向下位機發送資料,傳送指令進而控制下位機,而且還應該能準確接收下位機發來的資料,便於對下位機的一些感測器採集的訊號進行分析。 首先,在考慮到微控制器跟PC機通訊的問題時,

《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套裝置驅動,同時支援串列和網路通訊。附:將來支援Windows 10 IOT

注:ServerSuperIO有可能被移植到Windows 10 IOT上,那麼將來有可能開發一套裝置驅動,可以支行在服務端、嵌入式裝置中,將形成完整的解決方案。       現在已經除錯通過部分程式碼,還得需要一段時間,一般都是晚上幹,時間也有限。如下圖: 目       錄

USB口 2.4G 無線串列 相容NRF24L01P 通訊 模組使用說明

void Nrf24l01_Init(u8 model, u8 ch){SPI_CE_L();NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//寫RX節點地址 NRF_Write_Buf(NRF_WRITE_REG+TX_ADD

verilog語言RS232串列接收模組設計——串列除錯工具傳送資料在數碼顯示

RS-232是常用的傳輸介面,是硬體學習的入門級介面。 一、介面特性 DE-9 Male (Pin Side) DE-9 Female (Pin Side) -------------

Qt5.7 QSerialPort串列使用時readyRead訊號不產生解決方法

        最近在使用QSerialPort時發現一個問題。使用事件的方式readyRead()訊號始終不能產生,也就進入不到槽函式裡。但是我發現,每次使用ArduinoIDE的串列埠連線後,再次使用自己的串列埠就可以產生readyRead()訊號。初步判斷要麼是開啟方式

mfc初步探索——串列配置與通訊

本文采用vs2013+mfc,使用mscomm進行串列埠通訊 首先註冊mscomm外掛, 新增ActiveX控制元件——Microsoft Communications Control,version 6.0,右鍵控制元件新增變數,並將主程式中DDX_Control(pDX, IDC_MSC

Beaglebone Black——理論篇beaglebone black啟動——從串列獲得SPL、U-BOOT,TFTP伺服器獲得核心,NFS伺服器掛載根檔案系統

          一般來講啟動一個系統所需的bootloader(SPL/MLO、u-boot.img)和根檔案系統(/boot下包含核心zImage)要麼是放在NAND Flash,或者是SD卡,或者是eMMC,或者是USB中,那麼還有一種方式,就是所需要的這些檔案全部

linux串列收發資料不對由於流控等設定不對導致

最近一個專案使用了嵌入式linxu串列埠通訊,由於通訊使用的是2進位制資料,經常出現通訊校驗失敗,資料幀大小沒問題,就是校驗出錯 c_iflag引數表 鍵 值 說 明 IGNBRK 忽略BREAK鍵輸入 BRKINT 如果設定了IGNBRK,BREAK鍵輸入

每日一篇--linux重定向串列列印到telnet方便遠端調式

在嵌入式開發中,我們都是使用串列埠進行除錯定位問題。然而在成品除錯或者遠端除錯時,沒有串列埠,只能telnet進去,少了很多應用程序的列印,這樣就不利於我們發現問題。需要一種方法把串列埠所有輸出重定向到telnet。 /***********************

Unity之串列通訊基於三姿態感測器

/*******************************/ using UnityEngine; using System.Collections; //Other libraries using System; using System.Threading; using System.Collect

gsm模組 POST協議 串列傳送和接收sim900a

串列埠發:AT+CIPSTART="TCP","211.xxx.xxx.xxx",80 串列埠收:OK CONNECT OK 串列埠發:AT+CIPSEND=533                                    (下面串列埠傳送資料的長度) 串列埠收