海思3518c普通串列埠更換485通訊(啟用rtsn管腳)-核心程式碼修改
海思3518c普通串列埠更換485通訊
方案需求:
3518c串列埠1(uart1)有三個管腳,tx、rx和rtsn收發控制埠。在使用普通的串列埠時,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 (下面串列埠傳送資料的長度) 串列埠收