<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于散列DMA的高速串口驅動(dòng)方案設計

基于散列DMA的高速串口驅動(dòng)方案設計

作者: 時(shí)間:2012-03-06 來(lái)源:網(wǎng)絡(luò ) 收藏

3.2 程序設計

程序的核心是實(shí)現數據高效穩定的收發(fā)。為了實(shí)現UART的數據傳輸,UART中斷設置為最高優(yōu)先級;同時(shí)在操作系統中允許中斷嵌套,打開(kāi)UART接收超時(shí)中斷RTI并使能UART的傳輸。這樣,當UART的發(fā)送FIFO數據減少到設定的參考值(FIFOLevel)時(shí),發(fā)送傳輸就會(huì )被觸發(fā)。同樣,當接收FIFO的數據增長(cháng)到設定值時(shí),接收傳輸就會(huì )被觸發(fā)。為了減少DMA傳輸被觸發(fā)的次數同時(shí)保證數據被及時(shí)傳輸,發(fā)送FIFO Level設定為2字節,而接收FIFOLevel設定為14字節,將發(fā)送和接收的FIFO Level分別設定為0和16字節是有很大風(fēng)險的。MPI協(xié)議要求傳輸的一幀數據不能有間斷,所以在使用DMA傳輸UART數據時(shí)DMAC必須獨占系統總線(xiàn)。為了避免產(chǎn)生緩存一致性問(wèn)題,使用2塊非緩存內存區域存放待發(fā)送的數據和已接收到的數據。

發(fā)送數據時(shí),待發(fā)送的數據量總是已知的。先構造一個(gè)傳輸節點(diǎn),數據源地址為數據包的首地址,目的地址為UART寄存器,數據位寬為8,下一節點(diǎn)指針(PTR_NEXT)為空。當前數據包發(fā)送結束前,如果PTR_NEXT被更新,則下一個(gè)數據包的傳輸自動(dòng)開(kāi)始。當前數據包是否發(fā)送完畢,可通過(guò)讀取DMAC寄存器DMACCnControl的TransferSize字段得知。整個(gè)發(fā)送數據的過(guò)程無(wú)需觸發(fā)任何中斷,流程圖如圖3所示。如果采用DMA塊傳輸方式,就需要在每次傳輸完畢后產(chǎn)生DMA中斷,重新裝載數據到內存中的發(fā)送數據區以發(fā)送下一個(gè)數據包。



接收數據時(shí),對方發(fā)過(guò)來(lái)的數據量一般是未知的。構造含有100個(gè)節點(diǎn)的循環(huán)鏈表結構,每個(gè)節點(diǎn)對應的傳輸塊大小為接收FIFO Level。數據源地址為UART數據寄存器的地址,首節點(diǎn)的目的地址為接收數據內存區域的首地址,此后節點(diǎn)的目的地址每次向后偏移(FIFO Level×2)個(gè)字節,數據位寬為16(8個(gè)數據位,4個(gè)狀態(tài)位,4個(gè)保留位)。當接收到的數據達到接收內存區域的80%(RECV_TH)時(shí),需要通知數據發(fā)送方停止數據傳輸,在第80個(gè)節點(diǎn)處設置DMA中斷,該節點(diǎn)為閾值節點(diǎn)。采用本文的設計方案接收1幀不超過(guò)RECV_TH大小的數據,最多產(chǎn)生一次RTI中斷。當接收到的數據量少于FIFOLevel時(shí)不會(huì )觸發(fā)DMA接收,在RTI中斷中把UART接收FIFO中的數據復制到內存中的數據接收區,同時(shí)使DMA接收節點(diǎn)的目的地址向后偏移相應的長(cháng)度并更新閾值節點(diǎn)的位置。接收數據流程如圖4所示。如果采用DMA塊傳輸方式,就必須額外使用一個(gè)環(huán)形數據緩沖區(Ring Buffer),每次接收到指定大小的數據塊后產(chǎn)生DMA中斷,在中斷服務(wù)程序中將接收到的數據復制到環(huán)形數據緩沖區中。



3.3測試

本文的設計方案直接應用于工業(yè)級的HMI產(chǎn)品,必須經(jīng)過(guò)嚴格的測試。利用3臺西門(mén)子S7系列PLC和1臺產(chǎn)品樣機搭建令牌網(wǎng),使用西門(mén)子MPI協(xié)議進(jìn)行測試,并利用數據分析工具ProfiTrace監測通信過(guò)程。測試結果表明,2 400 bps~12 Mbps的各個(gè)波特率下都能進(jìn)行穩定的數據通信。

4 結 語(yǔ)

本文詳細介紹了DMA數據傳輸的特點(diǎn)和散列DMA的工作方式。在此基礎上,提出了一套散列DMA的驅動(dòng)設計方案,發(fā)送數據完全由DMAC完成,無(wú)需觸發(fā)任何中斷,接收1幀不超過(guò)接收區閾值的數據最多產(chǎn)生1次RTI中斷。和現有的各種利用DMA塊傳輸進(jìn)行數據通信的方案相比,中斷次數大幅減少,大大提高了數據傳輸的效率。在應用了本方案的人機界面產(chǎn)品上,實(shí)現了波特率高達12 Mbps的穩定數據傳輸。對于在其他平臺上設計實(shí)現串口,本方案是一個(gè)很好的參考。

本文引用地址:http://dyxdggzs.com/article/149508.htm
上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>