USB主机中断
与USB设备类似,在USB主机中同时用到了多个中断,最重要的是ATTACH中断,当有新的USB设备接入主机时,该类型中断发生,主机检测到中断后就能进行设备枚举等操作。
USB主机驱动要素分析
将KL25作为USB主机,与上一章中使用pc机作为主机还是有很大区别的,毕竟KL25的性能与pc机是无法相比的,因此,本将中使用KL25开发的USB主机并不能识别多种USB设备,而是仅能识别U盘存储器。
USB主机驱动构件主要包括:USB主机初始化、USB接入设备初始化、从USB设备读取数据、向USB设备写入数据、检测USB设备的连接状态。
为了能够操作U盘,还必须要有文件系统及其相关的操作函数,但这些函数不属于USB主机驱动的要素。后续介绍。
驱动构件头文件usb_host.h
在USB主机的驱动构件中已经封装好这些操作函数,为了方便使用,已经将这些函数在USB主机驱动构件头文件usb_host.h中进行声明。
函数功能介绍:
USB模块初始化函数:在使用USB主机之前,需要对KL25上的USB模块进行初始化,主要函数有分配USB模块使用的内存、USB相关端点初始化、使能USB模块时钟源、使能USB中断、设置BDT寄存器以及使能USB主机模式等。
初始化函数执行完之后,KL25就一直等待U盘插入到USB端口,若此时有U盘插入,KL25就会检测到U盘,并开始对U盘进行枚举,获取U盘的相关信息。在枚举完成之后,KL25就可以与U盘进行数据的传输。
USB接入设备初始化函数:该函数是在USB主机初始化完成之后执行,如果有USB设备接入主机,就调用该函数开始对USB设备进行枚举。
USB数据读取函数:该函数的功能是让KL25从USB设备读取数据,当然这个函数是不能在主函数中直接调用的,使用时应先调用文件系统层函数znFAT_ReadData,通过传入的参数计算出要读取的扇区数目,然后调用USB层函数USB_Class_Read_Sector对要读取的扇区进行处理,接着调用USB设备层函数usb_read_sector,该函数开始组合要发送给USB设备的命名,然后在usb_device_transfer中调用USB驱动构件层函数USBReadData进行USB事物处理将进行命令的发送和数据的读取。
USB数据写入函数:写入函数的执行过程和数据读取的执行过程类似,最后调用USB驱动构件层的函数USBWriteData执行数据写入的事物处理。
检测USB设备连接状态函数:USB设备连接到KL25之后,KL25需要获取USB设备的状态,以判断USB设备是否处于连接中,从而执行相应的处理。
USB主机驱动构件的使用方法
第一步:定义全局变量以保存是否有USB设备接入主机的标志;
unit_8 USBFlag=0;
第二步:在“main.c”文件中初始化USB主机;
USBHostInit(); //USB主机初始化
第三步:在文件isr.c的USB中断处理函数中改变USBFlag变量以表示USB设备状态;
USBFlag |= USB_ISTAT_ATTACH_MASK;
第四步:在需要的位置检测到USBFlag变化,然后对接入USB设备进行初始化;
第五步:通过文件系统函数间接调用USBReadData或USBWriteData与USB从机通信。
USB主机测试实例
将编译后的USB主机程序烧入KL25中,上电后蓝灯保持亮的状态,当通过USB转接线将U盘插入,在串口调试工具上会看到枚举到的设备信息,不同型号的U盘枚举到的设备不同。另外,还可以读取并显示U盘文件内的预存的数据“suda-usb-test”。