LonWorks-USB互联适配器的设计开发
BOOL DeviceIoControl(
HANDLE hDevice, //外设句柄
DWORD dwIoControlCode, //I/O操作控制代码
LPVOID IpInBuffer, //输入缓冲区指针
DWORD nInBufferSize, //输入缓冲区大小
LPVOID IpOutBuffer, //输出缓冲区指针
DWORD nOutBufferSize, //输出缓冲区大小
LPDWORD IpBytesReturned, //实际返回的字节数
LPOVERLAPPED IpOverLapped //用于异步操作的结构指针
);
3.2 外围USB设备——互联适配器的软件设计
这一部分的软件编写也包括两部分。一部分为对主CPU(EZ-USB)的编写。USB内核功能强大,可以自动完成USB协议的转换,从而大大简化了8051的代码。采用C51语言,并使用EZ-USB的固件函数库和程序框架。框架完成了一个简单的任务循环,用户函数TD_Poll()能够实现USB外设的功能。因为从CPU(Neuron Chip)的并行模式是芯片内部定义的,遵从虚拟的写令牌传递协议,所以需要编写芯片EZ-USB的程序来模拟3150的I/O并行口的从A模式。所以TD_Poll()函数主要完成四项工作:与辅CPU同步、握手、令牌的传送以及并行口数据的读写。
另一部分为从CPU的软件程序的编写,用神经元的编程语言即Neuron C语言完成。从CPU主要完成将并口得到的报文解析,再利用Neuron C的消息传送机制,将解析的消息传送给适配器下层的应用节点;同时,还将从适配器下层的应用节点以消息形式传送上来的数据或信息构造成EZ-USB可识别的报文,通过并口传送给EZ-USB。由从机内部定义的与并行I/O对象有关的函数主要有:
io_in_ready():当并口上有数据传送到来时,此函数值为TRUE。此时可调用io_in?穴?雪函数接收数据。
io_out_request():此函数用来向并口总线发出请求以获取令牌。
io_out_ready():当并口总线处于可写状态即3150获取到令牌后,此函数值为TRUE,此时可调用io_out()函数将数据发送到并口。在调用此函数之前应先调用io_out_request()。
io_in(): 将并口上的数据接收到缓冲区。
io_out():将缓冲区的数据发送到并口总线上。
本文设计的互联适配器在结构上采用双CPU设计,具有结构简单、小型化的特点,非常适合用于测控系统。在软件设计中,突出模块的灵活性,并且USB内核可以自动完成USB协议的转换,大大简化了8051的代码。总之,本适配器具有组态灵活、成本低、可靠性好、通信能力强等优点,在工业控制、楼宇自动化等诸多领域有广阔的应用前景。