3.2.1 UART接口驱动开发
UART协议比较简单,本文不对UART协议进行介绍。由于在LINUX系统下,对串口有相当好的支持。Linux下把串口看作一个文件来处理,故对串口的读写操作相当于对文件直接进行读写操作。这样我们可以直接调用系统函数如open,write,read,close等对串口进行操作。
需要注意的是,对串口的写操作比较容易,但是读操作存在着阻塞I/O的问题。在对串口进行读取操作的时候,如果使用的是RAW模式,每个read系统调用将返回当前串行输入缓冲区中存在的字节数。如果没有数据,将会一直阻塞到有字符到达或者间隔时钟到期,或者发生错误此时可采用异步读取。所谓异步读取,指的是先查询串口,看串口是否可用,直到串口可用了再去读就可以避免阻塞I/O的问题。
3.2.2 SPI接口驱动开发
(1)SPI概述
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时或者硬件复用两根数据线),也是所有基于SPI的设备共有的,它们是MISO,MOSI,SCK,CS。
MOSI为主设备数据输出,从设备数据输入;MISO为主设备数据输入,从设备数据输出;SCK为时钟信号,由主设备产生;CS为从设备使能信号,由主设备控制。
(2)SPI驱动开发
在Linux下开发SPI驱动有两种方式,一种是采用Linux自带的SPI子系统,一种是采用字符设备驱动的形式。本文采用了字符设备驱动的形式。在Linux 2.6内核中使用cdev结构体描述字符设备。cdev结构体如下所示。字符设备的主要工作是初始化、添加和删除cdev的结构体,申请和释放设备号,以及填充file_operations结构体的操作函数,实现file_operations结构体中的read(),write()和ioctl()等。
cdev结构体的dev_t成员定义了设备号,另一个重要成员file_operations定义了字符设备驱动提供给虚拟文件系统的接口函数。file_ operations结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open(),write(),read(),close()等系统调用时最终被调用。
Linux字符设备驱动主要由以下几部分组成:
(1)字符设备驱动模块加载与卸载函数
在字符设备驱动模块加载函数中应该实现设备号的申请和cdev的注册,对应的是insmod过程,而在卸载函数中应实现设备号的释放和cdev的注销,对应的是rmmod过程。
(2)字符设备驱动的file_operations结构体中成员函数
file_operations结构体中成员函数是字符设备驱动与内核的接口,是用户空间对Linux进行系统调用最终的落实者。
(3)加载字符设备驱动之后,在用户空间建立一个设备节点,在用户空间就可以对设备进行操作了,操作方式操作文件的方式相同。
3.2.3 驱动与固件的接口
驱动与固件之间的交互是通过自定义的“AT+”协议,协议交互流程见图7。
AT+命令主要包括3个:“AT+”:判断串口链路是否正常。如果正常,返回OK;不正常,返回error;“AT+set”:接口参数设置命令。如果参数设置完成,返回OK;不正常,返回error;“AT+send”:数据发送命令。如果数据发送/接收正确,返回OK;否则,返回error。
4 结语
本文介绍的工具适用于UART接口和SPI接口的功能、性能和兼容性测试,可实现测试的自动化。
采用该测试工具,一方面提高了测试效率,大大节约了人力资源,时间和人力成本节约了50%以上;另一方面可以保证测试用例100%的覆盖。
本文关键字:接口 传感-检测-采集技术,电子知识资料 - 传感-检测-采集技术