在线时间87 小时
UID3310295
注册时间2016-11-25
NXP金币0
TA的每日心情 | 开心 2022-11-9 15:32 |
---|
签到天数: 188 天 [LV.7]常住居民III
高级会员
- 积分
- 820
- 最后登录
- 2023-8-23
|
恩智浦提供的LPC54114的USB例程十分丰富,包括了比较常用的HID、CDC、MSC等设备类的实现,只需适当修改就能实现需要的自定义功能。
利用板载TF卡槽和USB外设,配合官方例程进行修改可以很容易的实现USB读卡器功能,由于没有进行进一步优化,所以读卡器传输速度并不是很快。
板载TF卡采用的是SPI总线,官方提供的SDK中已经有对TF卡的支持及移植好的fatfs文件系统,使用起来很方便,在USB读卡器的实现过程中并未用到fatfs,只用到了TF卡初始化、读扇区、写扇区这几个基本功能。
官方提供的USB大容量存储设备是将内部48K内存虚拟成了一个存储器,在发生读写操作时便直接对这块内存进行读写,要将该程序修改成适合读卡器使用,只要将对应读写部分进行修改即可。
disk.c文件中的 USB_DeviceMscCallback 函数是大容量存储设备USB请求最终执行及实现功能的地方。修改也主要集中在这里,这里有几个枚举类型定义需要了解
Value | Mean | kUSB_DeviceMscEventReadResponse | Send data completed | kUSB_DeviceMscEventWriteResponse | Data received | kUSB_DeviceMscEventWriteRequest | Host write data | kUSB_DeviceMscEventReadRequest | Host read data | kUSB_DeviceMscEventGetLbaInformation | Get device information | 修改主要就是在对应请求发生时对tf卡进行读写操作,这里我们仍然需要一个缓冲区来对读写的数据进行暂存,这里直接将原来用于模拟存储设备的数组调整了一下大小后拿来使用了。
将disk.c中100行左右
- USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_StorageDisk[DISK_SIZE_NORMAL];
复制代码 修改为
- USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_StorageDisk[512];
复制代码 修改成512的原因是我们以扇区为单位对tf卡进行读写,而在tf卡初始化过程中设置的扇区大小为512字节。
将 USB_DeviceMscCallback 函数中
- case kUSB_DeviceMscEventReadResponse:
- lbaData = (usb_device_lba_app_struct_t *)param;
- break;
- case kUSB_DeviceMscEventWriteResponse:
- lbaData = (usb_device_lba_app_struct_t *)param;
- break;
- case kUSB_DeviceMscEventWriteRequest:
- lbaData = (usb_device_lba_app_struct_t *)param;
- /*offset is the write start address get from write command, refer to class driver*/
- lbaData->buffer = g_msc.storageDisk + lbaData->offset * LENGTH_OF_EACH_LBA;
- break;
- case kUSB_DeviceMscEventReadRequest:
- lbaData = (usb_device_lba_app_struct_t *)param;
- /*offset is the read start address get from read command, refer to class driver*/
- lbaData->buffer = g_msc.storageDisk + lbaData->offset * LENGTH_OF_EACH_LBA;
- break;
- case kUSB_DeviceMscEventGetLbaInformation:
- lbaInformationStructure = (usb_device_lba_information_struct_t *)param;
- lbaInformationStructure->lengthOfEachLba = LENGTH_OF_EACH_LBA;
- lbaInformationStructure->totalLbaNumberSupports = TOTAL_LOGICAL_ADDRESS_BLOCKS_NORMAL;
- lbaInformationStructure->logicalUnitNumberSupported = LOGICAL_UNIT_SUPPORTED;
- lbaInformationStructure->bulkInBufferSize = DISK_SIZE_NORMAL;
- lbaInformationStructure->bulkOutBufferSize = DISK_SIZE_NORMAL;
- break;
复制代码 修改为
- case kUSB_DeviceMscEventReadResponse:
- lbaData = (usb_device_lba_app_struct_t *)param;
- break;
- case kUSB_DeviceMscEventWriteResponse:
- //usb_echo("data received\r\n");
- lbaData = (usb_device_lba_app_struct_t *)param;
- do
- {
- fres = disk_write(SDSPIDISK, lbaData->buffer, lbaData->offset, 1);
- }while(fres != FR_OK);
- break;
- case kUSB_DeviceMscEventWriteRequest:
- lbaData = (usb_device_lba_app_struct_t *)param;
- /*offset is the write start address get from write command, refer to class driver*/
- lbaData->buffer = g_msc.storageDisk;
- break;
- case kUSB_DeviceMscEventReadRequest:
- lbaData = (usb_device_lba_app_struct_t *)param;
- /*offset is the read start address get from read command, refer to class driver*/
- lbaData->buffer = g_msc.storageDisk;
- do
- {
- fres = disk_read(SDSPIDISK, lbaData->buffer, lbaData->offset, 1);
- }while(fres != FR_OK);
- break;
- case kUSB_DeviceMscEventGetLbaInformation:
- lbaInformationStructure = (usb_device_lba_information_struct_t *)param;
- lbaInformationStructure->lengthOfEachLba = g_card.blockSize;
- lbaInformationStructure->totalLbaNumberSupports = g_card.blockCount;
- lbaInformationStructure->logicalUnitNumberSupported = LOGICAL_UNIT_SUPPORTED;
- lbaInformationStructure->bulkInBufferSize = 512; //change this value to define buffer size
- lbaInformationStructure->bulkOutBufferSize = 512;
- break;
复制代码 kUSB_DeviceMscEventGetLbaInformation 请求设备的信息以及批量端点缓冲区大小,设备信息是根据tf卡的大小来进行设置的,而端点大小跟上面读写缓冲期大小相等即可。
kUSB_DeviceMscEventWriteRequest 主机发起写请求,只需将指针指向缓冲区即可。
kUSB_DeviceMscEventWriteResponse 从机已收到主机发送的数据,只需要将数据写入tf卡即可,需要注意这里的读写长度均以扇区为单位
kUSB_DeviceMscEventReadRequest 主机发起读请求,根据参数从tf读取数据至缓冲区,再将指针指向缓冲区即可。
编译完成下载至开发板使用CN3接口连接电脑即可对tf卡进行读写了。
|
|