USB主机编程方法

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主机编程方法_第1张图片

USB接入设备初始化函数:该函数是在USB主机初始化完成之后执行,如果有USB设备接入主机,就调用该函数开始对USB设备进行枚举。

USB主机编程方法_第2张图片

USB数据读取函数:该函数的功能是让KL25从USB设备读取数据,当然这个函数是不能在主函数中直接调用的,使用时应先调用文件系统层函数znFAT_ReadData,通过传入的参数计算出要读取的扇区数目,然后调用USB层函数USB_Class_Read_Sector对要读取的扇区进行处理,接着调用USB设备层函数usb_read_sector,该函数开始组合要发送给USB设备的命名,然后在usb_device_transfer中调用USB驱动构件层函数USBReadData进行USB事物处理将进行命令的发送和数据的读取。

USB主机编程方法_第3张图片

USB数据写入函数:写入函数的执行过程和数据读取的执行过程类似,最后调用USB驱动构件层的函数USBWriteData执行数据写入的事物处理。

USB主机编程方法_第4张图片

检测USB设备连接状态函数:USB设备连接到KL25之后,KL25需要获取USB设备的状态,以判断USB设备是否处于连接中,从而执行相应的处理。

USB主机编程方法_第5张图片

 USB主机驱动构件的使用方法

第一步:定义全局变量以保存是否有USB设备接入主机的标志;

unit_8 USBFlag=0;

第二步:在“main.c”文件中初始化USB主机;

USBHostInit();  //USB主机初始化

第三步:在文件isr.c的USB中断处理函数中改变USBFlag变量以表示USB设备状态;

USBFlag |= USB_ISTAT_ATTACH_MASK;

第四步:在需要的位置检测到USBFlag变化,然后对接入USB设备进行初始化;

USB主机编程方法_第6张图片

第五步:通过文件系统函数间接调用USBReadData或USBWriteData与USB从机通信。

USB主机编程方法_第7张图片

USB主机测试实例

将编译后的USB主机程序烧入KL25中,上电后蓝灯保持亮的状态,当通过USB转接线将U盘插入,在串口调试工具上会看到枚举到的设备信息,不同型号的U盘枚举到的设备不同。另外,还可以读取并显示U盘文件内的预存的数据“suda-usb-test”。

 

嵌入式技术基础与实践(第4版)

你可能感兴趣的:(嵌入式,嵌入式)