英创工控主板上的精简ISA总线的主要应用,就是支持客户的专用电路单元的扩展,如数据采集等。在精简ISA总线中还包括了对外部硬件中断的响应输入,关于硬件中断的基本应用方法已在《嵌入式主板EM9160精简ISA总线硬件中断的使用方法》一文中作了介绍,其基本应用思路是工控主板,以下以EM9160为例,的硬件中断驱动程序“IRQ1:”在检测到IRQ信号的上升沿后,向上层应用程序发送事件hIRQEvent,应用程序响应事件,对精简ISA总线的寄存器进行读写操作。由于从驱动程序发出的事件消息hIRQEvent传到应用程序需要有100us水平的延时,加上驱动程序本身的50us左右的延时,使应用程序感受的延时达到150us。因此对需要更快速度响应的应用,这种应用方式就有一定局限性了。一般说来,如果要进一步提高EM9160的中断响应速度,就需要把作为中断响应的对ISA总线寄存器的操作内容放到中断驱动程序“IRQ1:”中,并在驱动程序中设置数据buffer,对中断采集的数据进行缓冲,而应用程序则可批量读取驱动程序采集数据。为了实现上述目标,我们对了中断驱动程序“IRQ1:”的功能进行了扩展。本文主要介绍如何利用驱动程序的标准读写功能,来实现客户需要的对精简ISA总线寄存器的读写操作。
对精简ISA总线寄存器的读或写操作,可以用以下数据结构描述:
typedef struct _ISA_IO_
{
UCHAR uCmd; // = 0: read, = 1: write
UCHAR uCSNum; // = 0: CS0#, = 1: CS1#
UCHAR uOffset; // = 0, 1, ... 31
UCHAR uValue; // the data read from or write to
} ISA_IO, *PISA_IO;
在上述结构中,偏移量uOffset对应ISA总线的地址总线SA0 – SA4,8-bit寄存器的值则对应变量uValue。
应用程序在打开“IRQ1:”后,可通过标准的写函数来加载需要中断驱动程序执行的ISA总线读写操作序列,典型代码如下:
ISA_IO wr_seq[3]; // 3个读写操作
// 初始化读写序列
wr_seq[0].uCmd = 0; // 读数据低字节
wr_seq[0].uCSNum = 1; // 使用CS1#片选段
wr_seq[0].uOffset = 0; // SA4 – SA0 = 5’b00000
wr_seq[1].uCmd = 0; // 读数据高字节
wr_seq[1].uCSNum = 1; // 使用CS1#片选段
wr_seq[1].uOffset = 1; // SA4 – SA0 = 5’b00001
wr_seq[2].uCmd = 1; // 写命令码
wr_seq[2].uCSNum = 1; // 使用CS1#片选段
wr_seq[2].uOffset = 0; // SA4 – SA0 = 5’b00000
wr_seq[2].uValue = 0x18; // 0x18是控制码
// 加载读写序列
DWORD dwLen = 0; // 实际写入的长度
DWORD dwBufLen = 3 * sizeof(ISA_IO);
WriteFile( hIRQ, wr_seq, dwBufLen, &dwLen, NULL);
一旦加载了读写序列,中断驱动程序就会在中断线程中进行相应的读写操作,并以加载的读写序列为单元,把操作结果存储在驱动程序内部缓冲区。应用程序可通过标准的读函数来读取数据,典型代码如下:
ISA_IO rd_seq[3]; // 3个读写操作
DWORD dwLen = 0; // 实际读出的长度
DWORD dwBufLen = 3 * sizeof(ISA_IO);
ReadFile(hIRQ, rd_seq, dwBufLen, &dwLen, NULL );
要特别注意的是应用程序读出的是包含有ISA寄存器数据的ISA_IO结构数组,需要按照具体的应用对数据中的数据进行解析组装,才能获得有意义的结果。如把低位字节和高位字节拼装在一起,作为AD转换的数据:
DWORD dwADData =((DWORD)rd_seq[1].uValue << 8)| rd_seq[0].uValue;
另一个需要注意的是,应用程序可采用反复读取的方法,来获取当前驱动程序缓冲区中的全部数据,这样可提高应用程序对采集数据的处理效率。因此应用程序的数据读取线程并不一定需要等待中断事件hIRQEvent,而简单采用Sleep(…)来挂起数据读取线程。
在实际的数据采集应用为例,对一定的数据采样率(一般低于10ksps),可采用硬件生成的稳定的时钟信号来触发AD转换,而把AD转换完成的标志信号作为中断信号,接到EM9160的IRQ上,一旦硬件中断产生,中断驱动程序就通过ISA总线读取AD数据。对这样的应用,把采样率限制在每秒10k样点,代表中断周期为100us,能保证WinCE对每个中断的可靠响应。另一方面AD应采用并行数据总线接口芯片,如AD574等,才能保证中断线程的处理速度,通常不推荐采用SPI或I2C等串行接口的AD芯片。
具有本文扩展功能的驱动程序,会配置在2010年8月之后的EM9160主板中。对已购买EM9160的老客户,若需要上述功能,可与英创技术支持部门联系,以获取内核的免费更新。
全部0条评论
快来发表一下你的评论吧 !