上海航芯 | 从STM32F103到ACM32F403的U盘程序移植工程
本项目是以SPI Flash(如W25Q128等)存储元件作为存储单元,MCU主控完成USB接口通信并根据SCSI协议实现U盘功能。其结构如下图所示:
SPI Flash部分移植
SPI功能部分相对简单,ACM32F403的接口引脚和STM32F103的相同,可直接对接,按照ACM32F403的说明对SPI接口进行初始化,并对底层读写函数进行更改即可。
USB部分移植
1. STM32F103代码结构
在ST的芯片上,USB的数据是由两个中断,USB_LP_CAN1_RX0_IRQHandler和USB_HP_CAN1_TX_IRQHandler来进行,其中高优先级中断(USB_HP_CAN1_TX_IRQHandler)用于处理同步(Isochronous)模式传输或双缓冲块(Bulk)传输模式下的正确传输事件,而低优先级中断(USB_LP_CAN1_RX0_IRQHandler)用于处理其他传输时间。ST的USB数据处理如下图所示:
由于USBFS协议的限制,一包数据中最多可携带64字节数据,因此,当存在大量数据需要进行传输(IN或OUT包)时,需要分批次进行传输。在ST的代码中,通过变量“Bot_State”来进行控制,以Read10指令为例,其读数据流程可如下图所示:
需要注意的是,Read10指令解析完成之后(即上图左侧流程图)则进入数据传输阶段,此阶段是通过多次进入USB高优先级中断中,调用Read_Memory();来实现的。Read_Memory();函数内每次传输64字节数据。
2. ACM32F403代码移植要点
本文基于上海航芯官方USB例程进行移植,移植后的程序结构如下图所示:
ACM32F403的USB是采用一个中断来进行数据处理。在官方例程中,USB的中断函数内判定接收数据类型,包括suspend,resume,reset,EP0_pack以及其他端点的接收数据。判定结束后,会调用USB_Monitor();函数来处理suspend,resume,reset以及EP0_pack数据。而其他端点数据会在usb_transfer_monitor();函数中进行解析,该函数由客户调用,一般在主函数的死循环中进行处理。在本文的移植中,主要需对USB的端点数据进行处理。
A. EP0_Pack
EP0接收的setup数据会被存放在SETIP_0_3_DATA和SETIP_4_7_DATA寄存器中 ,数据结构如下所示:
dev_req.bmRequestType=USBCTRL->SETIP_0_3_DATA &0xff;
dev_req.bRequest=(USBCTRL->SETIP_0_3_DATA>>8)&0xff;
dev_req.wValue=(USBCTRL->SETIP_0_3_DATA>>16)&0xffff;
dev_req.wIndex = USBCTRL->SETIP_4_7_DATA&0xffff;
dev_req.wLength=(USBCTRL->SETIP_4_7_DATA>>16)&0xffff;
该部分解析,可由用户在函数void usb_control_transfer(void)中添加需要的处理函数。该函数由航芯官方例程里提供。在做U Disk程序移植时,需添加GetMaxLun和Storage_Reset处理函数,如下图所示:
B. EP1_Pack
在本文所述的代码中,ACM32F403采用EP1完成数据的收发工作。主要是完成对SCSI协议的解析工作。移植过程中,需要文件mass_mal.c、memory.c、scsi_data.c、usb_scsi.c、usb_bot.c及其头文件。本段主要就上述文件中代码需要改动的地方进行说明,部分参数需要重新定义,读者可自行解决。下表列出了ST和Aisino的USB收发功能函数,该部分移植时需要修改的主要部分:
a. void Mass_Storage_In (void)
在ST的工程代码中该部分主要用于处理SCSI的读指令。由于全速USB一包数据最大支持64字节,因此,当需要传输的数据个数大于该数值时,则需要分包传输。在使用ACM32F403时,可直接传送需要的数据长度,内部会进行分包处理,因此,该函数可省略。
b. void Mass_Storage_Out (void)
该函数用于处理SCSI指令解析以及发送指令,需在usb_transfer_monitor()中调用,并将函数内部的接收数据部分更改为:
“Data_Len = HAL_FSUSB_Receive_Data(Bulk_Data_Buff, 64, out_ep_index, 1);”
c.void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len)
将USB发送函数更改为ACM32F403对应的发送函数。在ST的工程中,该函数用于传输完数据后,进入BOT_DATA_IN_LAST状态,并在下一次的Mass_Storage_In()函数调用时,回复CSW指令。而本文的移植代码中,省略了Mass_Storage_In()函数,因此,可在该函数的尾部增加CSW发送指令:
Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
d.void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission)
将USB发送函数更改为ACM32F403对应的发送函数。
e.void Bot_Abort(uint8_t Direction)
该函数主要对收发端点的STALL状态进行处理,在ACM32F403的收发库函数中,对端点的STALL已做出相应控制,因此,该函数可省略。
f.void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
Read_Memory函数用于收到PC端的IN包请求后将存储器中的数据读取并发送至PC端。而ACM32F403的USB发送库函数中,自行进行分包操作(一包最大数据为64字节),因此在数据缓冲区容量允许条件下,可直接发送完毕,该函数修改如下:
{
uint32_t Offset, Length;
Offset = Memory_Offset * Mass_Block_Size[lun];
Length = Transfer_Length * Mass_Block_Size[lun];
CSW.dDataResidue = CBW.dDataLength;
while(Transfer_Length --)
{
MAL_Read(lun ,
Offset ,
Data_Buffer,
Mass_Block_Size[lun]);
Length = min(Mass_Block_Size[lun], CSW.dDataResidue);
Offset += Mass_Block_Size[lun];
HAL_FSUSB_Send_Data((uint8_t *)(Data_Buffer), Length, in_ep_index);
CSW.dDataResidue -= Length;
}
Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
}
g.void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
写数据指令完成后,将Bot_State 值更改为 BOT_IDLE。ST的工程代码中,变量“Bot_State”收发状态机的状态值,其值如下表所示:
而基于ACM32F403的U Disk工程,IN包可由函数HAL_FSUSB_Send_Data()在其内部进行分包处理,不需要额外逻辑,因此,移植后Bot_State仅需要在BOT_IDLE、BOT_DATA_OUT、BOT_ERROR之间转换,其他对Bot_State的控制可省略
上海航芯 | 从STM32F103到ACM32F403的U盘程序移植工程相关推荐
- 上海航芯技术分享 | 基于SPI Flash的U盘程序,从STM32F103到ACM32F403
前言 本项目是以SPI Flash(如W25Q128等)存储元件作为存储单元,MCU主控完成USB接口通信并根据SCSI协议实现U盘功能.其结构如下图所示: SPI Flash部分移植 SPI功能部分 ...
- 极术公开课|基于安谋科技STAR-MC1处理器的上海航芯ACM32芯片及方案介绍
内容介绍 上海爱信诺航芯电子科技有限公司(简称:上海航芯)成立于2008年1月,是具有市场竞争力和行业优势的本土集成电路设计企业佼佼者,专注于安全和MCU芯片的研制,已有累计3亿颗芯片出货.公司量产的 ...
- 2022 极术通讯-基于安谋科技STAR-MC1处理器的上海航芯ACM32芯片及方案介绍
首发极术社区.如对Arm相关技术感兴趣,欢迎私信 aijishu20加入技术微信群.导读:极术通讯引入行业媒体和技术社区.咨询机构优质内容,定期分享产业技术趋势与市场应用热点. 芯方向 • 基于安谋科 ...
- 上海航芯 | 全自动咖啡机设计方案
如今,随着人们生活节奏不断地加快,生活水平日益提高,咖啡作为世界上最流行的饮品之一,已然走进人们的日常生活,逐渐被越来越多的人所喜爱.随之而来的"咖啡机"也变得愈加流行.酿制一杯完 ...
- 上海航芯|推出基于ACX200T的V2X解决方案
车联网是汽车未来发展的重要趋势,C-V2X也已成为世界主流的车联网技术,可提升车辆整体的智能驾驶水平,为用户提供安全.舒适.智能.高效的驾驶感受,同时提高交通运行效率,提升社会交通服务的智能化水平. ...
- 上海航芯|电池均衡如何提高电池寿命
随着新能源及电动汽车的迅速发展,能量密度比更高的锂电池得到了更多运用,而锂电池串联使用过程中,为了保证电池电压的一致性,必然会用到BMS来提升电池的使用性能和使用寿命. 上海航芯通用MCU ACM32 ...
- 上海航芯| BMS专题之BMS基础功能模块概述分享
BMS(电池管理系统)的功能模块由微控制器(MCU)的控制模块和模拟前端(AFE)的传感模块组成. 微控制器单元(MCU) 在BMS中,MCU相当于大脑.MCU通过其外围设备从传感器捕获所有数据,并根 ...
- 上海航芯方案分享 | 针对ETC系统的OBE-SAM模块设计方案
ETC(Electrical Toll Collection)不停车收费是目前世界上最先进的路桥收费方式.通过安装在车辆挡风玻璃上的车载单元与安装在收费站 ETC 车道上的路侧单元之间的微波专用短程通 ...
- 上海航芯 | 指纹芯片及解决方案介绍
随着智能设备的持续发展,指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术.凭借高识别率.短耗时等优势,被广泛地运用在智能门锁.智能手机.智能家居等设备上. 上海航芯在2015 ...
- 2022 极术通讯-搭载安谋科技“星辰”STAR-MC1处理器的上海航芯ACM32磁链观测器算法方案
导读:极术社区与E-learning平台联合推出极术通讯,引入行业媒体和技术社区.咨询机构优质内容,定期分享产业技术趋势与市场应用热点. 芯方向 新一代Armv9架构如何助力CPU安全和性能提升? 本 ...
最新文章
- Error creating bean with name ‘redisConnectionFactory‘ defined in class path resource
- mysql resulttype_Mysql中结果集(mysql_result)与Traversable
- 采用URL访问资源,隐藏真实地址
- 文献记录(part12)--Biclustering of human cancer microarray data using co-similarity based co-clustering
- ZooKeeper分布式应用程序的分布式协调服务:概述,入门,发布版本
- stft isar成像 matlab,基于时频分析的ISAR成像
- 列出IIS上的虚拟目录和网站信息。
- 百度Q1营收241亿,李彦宏挥刀改革:“尽力了”没用,要确保在必须赢的战场上胜利...
- CodeForces - 556C Case of Matryoshkas
- ASP.NET组件与开发之复合控件的事件处理
- AjaxControlToolKit(整理)三.......(35个控件)简单介绍
- 局域网监控软件是企业数据安全的最强护盾
- Quartz cron表达式(时间表达式)
- 小米air耳机重新配对_小米air耳机重新配对_「小三爷出品」不错的新年礼物,小米蓝牙耳机Air体验...
- 2021-1-16-JavaGuide老哥的操作系统常见问题总结 自己按照理解,综合了王道考研的视频,对内容进行了修改,增加了内容,以便于自己理解。这份材料不是背的,而是让自己去理解的。
- 微信商户号 API 密钥、API 证书配置
- php将amr转换成mp3,微信JSSDK-将录制文件amr格式转换为mp3
- I/O error on POST request for “http://localhost:9411/api/v2/spans“
- python中bytes_Python3中的bytes和str类型
- 华为:中国平安城市发展白皮书