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使用情况的对比。可以看到内存映射方式访问(异步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

    文章

    6104

    浏览量

    36383
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 ?288次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技术应用创新,其核心目标是实现
    的头像 发表于 07-22 18:20 ?235次阅读

    DEKRA德凯成为沙特通信和信息技术设备技术法规认证机构

    近日,DEKRA德凯成功获得沙特标准、计量和质量组织(SASO)认可,正式成为沙特通信和信息技术设备技术法规(Technical Regulation for Communications
    的头像 发表于 07-15 14:27 ?360次阅读

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和实现数字主权的重任。简单来
    的头像 发表于 06-13 10:06 ?2683次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略

    2025第二届教育信息技术应用创新大赛正式开赛

    为进一步落实建设网络强国和教育强国的战略部署,推动各级教育行政部门及高校信息技术应用创新能力提升,培养实战型创新人才。龙芯中科联合太初元碁、诚迈科技在2025第二届教育信息技术应用创新大赛共同发布信息技术应用创新人工智能方向(赛
    的头像 发表于 05-13 16:21 ?627次阅读

    浪潮下,国产主板有什么新的发展机遇?

    信息技术应用创新浪潮的推动下,国产主板迎来了诸多新的发展机遇。信产业旨在实现信息技术领域的自主可控,这一战略目标为国产主板的发展提供了广阔的空间。信浪潮下国产主板的发展机遇多元且
    的头像 发表于 05-09 09:24 ?257次阅读
    信<b class='flag-5'>创</b>浪潮下,国产主板有什么新的发展机遇?

    龙芯中科荣获2024年度信息技术应用创新工作委员会卓越贡献成员单位

    近日,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称“信工委会”)在北京召开2024年度工作总结座谈会暨信“大比武”总结大会。中国工程院院士、信
    的头像 发表于 01-23 10:50 ?736次阅读

    芯盛智能荣获2024年信息技术应用创新工作委员会卓越贡献成员单位

    日前,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称 “信工委会”)2024 年度总结座谈会于北京隆重举行。此次会议对在信工作中作出突出贡献的成员单位予以表彰。江苏
    的头像 发表于 01-20 09:56 ?678次阅读

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会支持,北京航空航天
    的头像 发表于 12-24 09:57 ?549次阅读

    有方科技参编的信息技术团体标准发布

    近日,有方科技参编的《信息技术产品供应链成熟度 共性指标 第1部分:企业背景评价》《信息技术产品供应链成熟度 共性指标 第2部分:技术掌控评价》《信息技术产品供应链成熟度 共性指标 第
    的头像 发表于 12-23 10:44 ?643次阅读

    龙芯中科助力2024首届教育信息技术应用创新大赛成功举办

    近日,2024首届教育信息技术应用创新大赛在北京航空航天大学成功举办。本次大赛由中国教育技术协会主办,教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信
    的头像 发表于 12-19 17:02 ?601次阅读

    拓维信息参与牵头组建!长沙新一代信息技术产教联合体正式获批

    的长沙新一代信息技术产教联合体成功获批,为长沙市信息技术产业发展注入了新的活力。图/《2024年长沙市市级市域产教联合体名单》长沙新一代信息技术产教联合体将依托龙头企
    的头像 发表于 12-07 01:06 ?947次阅读
    拓维<b class='flag-5'>信息</b>参与牵头组建!长沙新一代<b class='flag-5'>信息技术</b>产教联合体正式获批

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 ?1029次阅读

    国产化背景下的工控主板发展现状

    ,是信息技术应用创新产业的简称,于2016年“信工委会”(信息技术应用创新工作委员会)提出,目的就是要推动我们国内软硬件关键技术的研发
    的头像 发表于 09-21 16:15 ?911次阅读

    梯度科技入选2023年信息技术应用创新解决方案名单

    日前,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)在天津举办2024信息技术应用创新发展大会暨解决方案应用推广大会。会上正式公布了2023年
    的头像 发表于 09-09 16:29 ?805次阅读