那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

英創信息技術精簡ISA總線WinCE編程簡介

英創信息技術 ? 來源:英創信息技術 ? 作者:英創信息技術 ? 2020-02-11 16:55 ? 次閱讀

ISA總線簡介

英創精簡ISA總線接口是一種8-bit寬度的雙向并行擴展總線,其特點是地址數據分時復用8-bit總線。英創精簡ISA總線支持異步和同步訪問模式,異步訪問模式下ISA總線使用8條數據線加上4條總線控制信號,即可實現對外部數據的快速讀寫,異步訪問的最高速率在5MB/s左右。同步訪問需要再使能一條總線時鐘信號(共13條信號),可實現高達12MB/s的數據傳輸。精簡ISA總線作為英創主板的特色功能之一,在ESM6802、ESM7000、ESM335x等多款型號中均有配置。英創精簡ISA總線的信號定義如下:

主板引腳 信號及說明
E2 ISA_D0,地址數據總線,LSB
E3 ISA_D1,地址數據總線
E4 ISA_D2,地址數據總線
E5 ISA_D3,地址數據總線
E6 ISA_D4,地址數據總線
E7 ISA_D5,地址數據總線
E8 ISA_D6,地址數據總線
E9 ISA_D7,地址數據總線
E10 ISA_RDn,數據讀控制信號
E11 ISA_WEn,數據寫控制信號
E12 ISA_ADVn,地址鎖存控制信號
E13 ISA_CSn,片選信號
F9 GPIO24 / ISA_BCLK,同步時鐘ISA_BCLK

ISA總線數據結構

ISA總線的數據傳輸由ISA_BLOCK_INFO數據結構定義,其說明如下:

typedef struct
{
PBYTE pReadBuf;
PBYTE pWriteBuf;
DWORD dwDataLength;
DWORD dwDataPortOfs;
DWORD dwInc;
} ISA_BLOCK_INFO, *PISA_BLOCK_INFO;

成員說明

pReadBuf

ISA總線讀數據緩存,!=NULL表示為ISA總線讀操作,pReadBuf與pWriteBuf指針不能同時有效

pWriteBuf

ISA總線寫數據緩存, !=NULL表示為ISA總線寫操作,pReadBuf與pWriteBuf指針不能同時有效

dwDataLength

讀/寫訪問的字節長度

dwDataPortOfs

ISA端口地址。ISA總線驅動程序支持應用程序使用不同的地址范圍來區別不同的操作模式,根據ISA端口地址可實現以下幾種總線訪問模式。

Value ISA總線訪問模式
0x0000...0x00FF 異步總線周期,CPU操作
0x1000...0x10FF 異步總線周期,DMA方式傳輸,dwInc需要同時設置為0
0x4000...0x40FF 同步總線周期,DMA方式傳輸,dwInc需要同時設置為0

由于精簡ISA總線的寬度只有8-bit,因此它實際的物理尋址范圍也只有8-bit,即0x00-0xFF。

dwInc

每次ISA讀寫后地址是否增加

Value Meaning
0 固定地址
1 讀/寫后地址自動加1

備注:

ISA總線的CPU操作方式主要用于小量數據的傳輸,比如控制命令、配置數據讀寫等。

DMA方式傳輸可在較低CPU開銷的情況下實現大批量數據的高速傳輸,DMA方式傳輸要求傳輸的數據長度dwDataLength為32的整倍數、同時需要將dwInc設置為0,否則驅動程序會使用CPU方式進行數據傳輸。DMA傳輸方式需要連接在ISA總線的上CPLD/FPGA使用固定的數據端口地址,在CPLD/FPGA內部自己管理地址偏移。

ESM335x工控主板只支持異步訪問模式,在異步DMA方式傳輸時,需要將dwInc設置為0來固定數據端口地址。

ESM6802/ESM7000支持異步和同步DMA訪問模式,但由于SDMA(NXP Smart DMA)的原因,即使將dwInc設置為0,在進行DMA數據傳輸時也無法固定端口地址,因此CPLD/FPGA需要通過額外的方法來識別當前為DMA傳輸。ESM6802/ESM7000在進行異步DMA訪問時,可通過1位GPIO來向外表明當前為異步DMA訪問模式,也可通過CPU操作方式向指定地址寫入特定命令,讓CPLD/FPGA切換到異步DMA傳輸模式。在進行同步DMA訪問時,可結合ISA_BCLK信號來識別當前的傳輸模式。為了避免混淆,在實際應用時建議僅使用一種DMA(同步或異步)訪問模式,推薦使用同步DMA訪問模式以獲得最高的ISA總線速度。

ISA總線速度測試

在ISA_BLOCK_INFO結構體中定義了異步CPU訪問,異步DMA和同步DMA三種ISA總線訪問方式,而異步CPU訪問又可通過驅動API函數和內存映射兩種方式來實現。

驅動API訪問是指應用程序直接調用設備驅動API函數WriteFil/ReadFile進行字/字節的總線讀寫。ISA總線周期通常在200ns左右,而應用程序調用一次設備驅動程序API花費的時間卻需要數微秒的時間,這顯然大大降低了總線單字(或單字節)的訪問效率。為了解決這一問題,我們利用了WinCE的虛擬地址映射技術,在ISA驅動程序中實現了,在使用ISA總線的應用進程地址空間內分配一段虛擬地址空間,并將其與ISA接口的物理地址空間進行綁定。簡單來講就是實現了在WinCE應用程序中可以直接訪問ISA總線的外設地址空間,即內存映射訪問方式。

下圖是ESM3354、ESM7000和ESM6802,ISA總線在各種訪問模式下的總線速度。

圖1ESM335x / ESM7000 / ESM6802 ISA總線速度

下圖是ESM7000 ISA總線在不同訪問模式下,總線速度與CPU使用情況的對比??梢钥吹絻却嬗成浞绞皆L問(異步CPU操作)與異步DMA訪問在總線速度上很接近,但使用DMA傳輸可大大降低對CPU的開銷。因此對于頻繁的字或字節訪問可以使用內存映射方式訪問,而對于成批量數據的讀寫應該使用DMA方式進行傳輸。

圖2ESM7000 ISA總線在不同訪問方式下總線速度與CPU占用率

ISA總線訪問API

對ISA總線的所有訪問方法都包含在isa_api_v3.cpp文件中,如下所示:

#include "StdAfx.h"
#include "bsp_drivers.h"
#include
#include "isa_api_v3.h"
DWORD g_dwISABase = 0;
HANDLE ISA_Open( LPCWSTR lpDevName )
{
HANDLE hISA;
hISA = CreateFile(lpDevName, // name of device
GENERIC_READ|GENERIC_WRITE, // desired access
FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode
NULL, // security attributes (ignored)
OPEN_EXISTING, // creation disposition
FILE_FLAG_RANDOM_ACCESS, // flags/attributes
NULL);
if(hISA != INVALID_HANDLE_VALUE)
{
if(DeviceIoControl(hISA, //打開“ISA1:”返回的Handler
IOCTL_VIRTUAL_COPY_EX, // IOCTL命令碼
NULL,0, // 不使用輸入參數
&g_dwISABase, sizeof(DWORD), // 得到ISA基地址
NULL, NULL))
return hISA;
CloseHandle(hISA);
hISA = INVALID_HANDLE_VALUE;
}
return hISA;
}
BOOL ISA_Close( HANDLE hISA)
{
g_dwISABase = 0;
return CloseHandle( hISA );
}
// Function: read a byte from a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// dwPortOffset = 0, 1, .. 255, address of port on ISA
// Return: the byte data read
BYTE ISARead8(HANDLE hISA, DWORD dwPortOffset)
{
WORD *pPortAddr;
WORD wValue;
BYTE ucValue;
DWORD dwNbBytesRead = 0;
if(g_dwISABase != 0)
{
dwPortOffset &= 0xff;
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (WORD*)(g_dwISABase + dwPortOffset);
wValue = *pPortAddr;
return (BYTE)wValue;
}
ucValue = (BYTE)(dwPortOffset & 0xFF);
ReadFile(hISA, &ucValue, sizeof(ucValue), &dwNbBytesRead, NULL);
return ucValue;
}
// Function: write a byte to a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// dwPortOffset = 0, 1, .. 255, address of port on ISA
// ucValue = the byte data to be written
void ISAWrite8(HANDLE hISA, DWORD dwPortOffset, BYTE ucValue)
{
WORD *pPortAddr;
WORD wValue;
DWORD dwNbBytesWritten = 0;
if(g_dwISABase != 0)
{
dwPortOffset &= 0xff;
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (WORD*)(g_dwISABase + dwPortOffset);
*pPortAddr = (WORD)ucValue;
return;
}
wValue = (WORD)(dwPortOffset & 0xFF);
wValue = (wValue << 8) | ucValue;
WriteFile(hISA, &wValue, sizeof(wValue), &dwNbBytesWritten, NULL);
}
// Function: read a word from a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// dwPortOffset = 0, 2, 4, .. 254, address of port on ISA
// Return: the word data read
WORD ISARead16(HANDLE hISA, DWORD dwPortOffset)
{
DWORD *pPortAddr;
DWORD dwValue;
WORD wValue;
DWORD dwNbBytesRead = 0;
if(g_dwISABase != 0)
{
dwPortOffset &= 0xFE; // 2-byte alignment
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (DWORD*)(g_dwISABase + dwPortOffset);
dwValue = *pPortAddr;
// the high-byte of data is at value[23..16]
return (WORD)(((dwValue >> 8) & 0xFF00) | (dwValue & 0xFF));
}
wValue = (WORD)(dwPortOffset & 0xFE);
ReadFile(hISA, &wValue, sizeof(wValue), &dwNbBytesRead, NULL);
return wValue;
}
// Function: write a word to a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// dwPortOffset = 0, 2, 4, .. 254, address of port on ISA
// wValue = the word data to be written
void ISAWrite16(HANDLE hISA, DWORD dwPortOffset, WORD wValue)
{
DWORD *pPortAddr;
DWORD dwValue;
DWORD dwNbBytesWritten = 0;
if(g_dwISABase != 0)
{
dwPortOffset &= 0xFE; // 2-byte alignment
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (DWORD*)(g_dwISABase + dwPortOffset);
dwValue = wValue;
// dispatch high-byte of data to value[23..16]
*pPortAddr = ((dwValue << 8) & 0x00ff0000) | (dwValue & 0x000000ff);
return;
}
dwValue = (dwPortOffset << 16) | wValue;
WriteFile(hISA, &dwValue, sizeof(dwValue), &dwNbBytesWritten, NULL);
}
// Function: read a bulk data from a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// *tp: a pointer to the ISA_BLOCK_INFO structure
// Return: number of bytes read
DWORD ISAReadBuf(HANDLE hISA, PISA_BLOCK_INFO tp)
{
DWORD dwNbBytesRead = 0;
if(ReadFile(hISA, tp, sizeof(ISA_BLOCK_INFO), &dwNbBytesRead, NULL))
return dwNbBytesRead;
return 0;
}
// Function: read a bulk data from a port on ISA bus
// Input: hISA: the HANDLE returned from ISA_Open function
// *tp: a pointer to the ISA_BLOCK_INFO structure
// Return: the number of bytes written
DWORD ISAWriteBuf(HANDLE hISA, PISA_BLOCK_INFO tp)
{
DWORD dwNbBytesWritten = 0;
if(WriteFile(hISA, tp, sizeof(ISA_BLOCK_INFO), &dwNbBytesWritten, NULL))
return dwNbBytesWritten;
return 0;
}

注意,當采用內存映射方式訪問時,若在多個線程中均有調用字或字節讀寫函數(ISAWrite8, ISAWrite16, ISARead8, ISARead126),需要加互斥鎖,以保證對硬件資源操作的完整性。通過驅動API調用的讀寫函數,在驅動內部已經增加了互斥操作,應用程序不需要再次添加。

ISA異步總線周期讀時序

ISA異步總線周期寫時序

ISA同步總線周期讀時序

ISA擴展單元可根據上述時序來支持高速的同步總線周期讀邏輯電路,其要點包括:

●每個同步周期共12個BCLK時鐘,第1個BCLK下降沿ADVn有效,標志同步周期的開始,之后連續11個BCLK下降沿后同步周期結束。

●每個同步周期傳輸8個字節有效數據,ISA總線從BCLK第5個上升沿開始鎖存數據,連續讀8個字節。

●ISA總線雖然輸出了ADDR地址數據,但這個地址是不固定的,ISA擴展單元應該忽略此地址數據。

ISA同步總線周期寫時序

ISA擴展單元可根據上述時序來支持高速的同步總線周期寫邏輯電路,其要點包括:

●每個同步周期共12個BCLK時鐘,第1個BCLK下降沿ADVn有效,標志同步周期的開始,之后連續11個BCLK下降沿后同步周期結束。

●每個同步周期傳輸8個字節有效數據,ISA擴展單元應從BCLK第5個上升沿開始鎖存數據,連續8個字節。

●ISA總線雖然輸出了ADDR地址數據,但這個地址是不固定的,ISA擴展單元應該忽略此地址數據。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6086

    瀏覽量

    35614
收藏 人收藏

    評論

    相關推薦

    龍芯中科榮獲2024年度信息技術應用創新工作委員會卓越貢獻成員單位

    近日,中國電子工業標準化技術協會信息技術應用創新工作委員會(以下簡稱“信工委會”)在北京召開2024年度工作總結座談會暨信“大比武”總結大會。中國工程院院士、信
    的頭像 發表于 01-23 10:50 ?165次閱讀

    芯盛智能榮獲2024年信息技術應用創新工作委員會卓越貢獻成員單位

    日前,中國電子工業標準化技術協會信息技術應用創新工作委員會(以下簡稱 “信工委會”)2024 年度總結座談會于北京隆重舉行。此次會議對在信工作中作出突出貢獻的成員單位予以表彰。江蘇
    的頭像 發表于 01-20 09:56 ?157次閱讀

    飛騰助力首屆教育信息技術應用創新大賽圓滿落幕

    近日,由中國教育技術協會主辦,教育部教育管理信息中心教育信實驗室、公安部第三研究所、中國電子工業標準化技術協會信工委會支持,北京航空航天
    的頭像 發表于 12-24 09:57 ?205次閱讀

    有方科技參編的信息技術團體標準發布

    近日,有方科技參編的《信息技術產品供應鏈成熟度 共性指標 第1部分:企業背景評價》《信息技術產品供應鏈成熟度 共性指標 第2部分:技術掌控評價》《信息技術產品供應鏈成熟度 共性指標 第
    的頭像 發表于 12-23 10:44 ?225次閱讀

    龍芯中科助力2024首屆教育信息技術應用創新大賽成功舉辦

    近日,2024首屆教育信息技術應用創新大賽在北京航空航天大學成功舉辦。本次大賽由中國教育技術協會主辦,教育信實驗室、公安部第三研究所、中國電子工業標準化技術協會信
    的頭像 發表于 12-19 17:02 ?282次閱讀

    拓維信息參與牽頭組建!長沙新一代信息技術產教聯合體正式獲批

    的長沙新一代信息技術產教聯合體成功獲批,為長沙市信息技術產業發展注入了新的活力。圖/《2024年長沙市市級市域產教聯合體名單》長沙新一代信息技術產教聯合體將依托龍頭企
    的頭像 發表于 12-07 01:06 ?483次閱讀
    拓維<b class='flag-5'>信息</b>參與牽頭組建!長沙新一代<b class='flag-5'>信息技術</b>產教聯合體正式獲批

    中科達榮獲2024年軟件和信息技術服務優秀企業

    及前百家企業”名單。中科達憑借非凡的技術實力與持續的創新能力,成功入選“2024年度軟件和信息技術服務競爭力百強企業”以及“2024年軟件和信息技術服務優秀企業”。
    的頭像 發表于 10-30 11:44 ?557次閱讀

    國產化背景下的工控主板發展現狀

    ,是信息技術應用創新產業的簡稱,于2016年“信工委會”(信息技術應用創新工作委員會)提出,目的就是要推動我們國內軟硬件關鍵技術的研發
    的頭像 發表于 09-21 16:15 ?508次閱讀

    加速鯤鵬落地!拓維信息遷移工具榮獲鯤鵬原生開發技術認證

    認證。圖/拓維·數據庫適配中間件取得鯤鵬原生開發N認證在數字化時代的大潮中,信戰略作為國家推動信息技術應用創新、保障信息安全與自主可控的關鍵舉措,其重要性日益凸顯
    的頭像 發表于 09-10 08:03 ?505次閱讀
    加速鯤鵬落地!拓維<b class='flag-5'>信息</b>信<b class='flag-5'>創</b>遷移工具榮獲鯤鵬原生開發<b class='flag-5'>技術</b>認證

    梯度科技入選2023年信息技術應用創新解決方案名單

    日前,工業和信息化部網絡安全產業發展中心(工業和信息化部信息中心)在天津舉辦2024信息技術應用創新發展大會暨解決方案應用推廣大會。會上正式公布了2023年
    的頭像 發表于 09-09 16:29 ?493次閱讀

    中軟國際信服務助力大連信產業發展

    為進一步激發大連本地信產業生態的活力與潛力,搭建一個高效、開放的交流平臺。由大連軟件行業協會攜手大連市信息技術應用創新綜合服務中心主辦,中軟國際協辦的,2024年大連市信息技術應用創新產業發展大會
    的頭像 發表于 08-27 16:49 ?954次閱讀

    翼輝信息入選2023年信息技術應用創新解決方案名單

    近日,2023 年(第五屆)信息技術應用創新解決方案公布遴選名單,歷經資格初審、技術中評、區域評議、終評預審,翼輝以“面向工業領域嵌入式操作系統 SylixOS 解決方案”,成功在全國優秀方案中脫穎而出,入選典型解決方案名單。
    的頭像 發表于 04-28 11:37 ?619次閱讀
    翼輝<b class='flag-5'>信息</b>入選2023年<b class='flag-5'>信息技術</b>應用創新解決方案名單

    股份今日登陸科

    山東中軟件商用中間件股份有限公司(以下簡稱“中股份”)近日在上海證券交易所科板成功上市,標志著這家國內知名的民營軟件和信息技術服務企業正式進入資本市場,迎來全新的發展機遇。
    的頭像 發表于 03-13 14:19 ?594次閱讀

    龍芯中科三項信方案入圍工信部2023年信息技術應用創新應用示范案例名單

    近日,工業和信息化部通報了2023年信息技術應用創新解決方案征集遴選結果,本次共評選出典型解決方案173個、應用示范案例83個、單項創新案例64個。
    的頭像 發表于 03-07 16:45 ?1014次閱讀
    龍芯中科三項信<b class='flag-5'>創</b>方案入圍工信部2023年<b class='flag-5'>信息技術</b>應用創新應用示范案例名單

    RX78M組 EtherCAT ETG.5003示例程序固件信息技術

    電子發燒友網站提供《RX78M組 EtherCAT ETG.5003示例程序固件信息技術.pdf》資料免費下載
    發表于 02-21 14:22 ?1次下載
    RX78M組  EtherCAT ETG.5003示例程序固件<b class='flag-5'>信息技術</b>
    百家乐15人桌子| 评测百家乐官网博彩网站| 百家乐大赢家客户端| 百家乐官网平台注册送现金| 德州扑克游戏| 百家乐揽子打法| 百家乐官网扎金花现金| 阜阳市| 大发888 王博| 百家乐baccarat| 娱乐城百家乐官网的玩法技巧和规则| 百家乐官网网址多少| 美国太阳城养老社区| 百家乐现金网平台排名| 澳门百家乐官网如何算| 星河百家乐官网现金网| 1368棋牌游戏平台| 新葡京百家乐的玩法技巧和规则| 六十甲子24山吉凶| 百家乐官网好赌吗| 百家乐官网代打公司| 金利娱乐城代理| 百家乐机器昀程序| 百家乐官网技巧辅助软件| 百家乐官网存在千术吗| tt线上娱乐城| 大发888官方网站| 百家乐牌壳| 怎么赢百家乐官网的玩法技巧和规则| 开心8百家乐官网现金网| 优博网| 现金网注册送彩金| 威尼斯人娱乐城真人赌博| 百家乐桌折叠| 百家乐游戏合法吗| 百家乐官网全部规则| 百家乐官网tt娱乐网| 高级百家乐官网出千工具| 周宁县| 新世纪娱乐成| bet365信誉好吗|