【.Net Micro Framework PortingKit(补) – 1】USB驱动开发

简介: USB接口支持8个端点,数据传输支持三种模式:DMA、双缓冲、单缓冲,简单期间,我仅实现了单缓冲模式。首先,我们需要声明USB寄存器相对应的结构体,以期方便操作相关的寄存器。

在前段时间我连续写了15篇关于【.Net Micro Framework PortingKit–?】的系列文章,初步介绍了.Net Micro Framework在Cortex-M3平台上的移植过程,最近一段时间又对另外两块Cortex-M3开发板进行了相关的移植工作,新实现了USB驱动、SPI驱动、触摸屏驱动、LCD驱动(ILI9325),除此之外还新开发了TinyGUI图形库,该图形库仅需要极少量的内存便能运行在Cortex-M3平台上。从今天开始,我会陆续写这方面开发的相关文章。

第一次编写USB的驱动,是在Ti DM355平台上,当时用了大概二个多月的时间才移植成功,花了这么长的时间,一是USB运行机制非常复杂,二是对嵌入式开发当时并不是特别熟悉。在此期间我写四篇关于USB的文章,有兴趣的朋友可参考一下《Micro Framework USB Driver开发》、《MF Porting之USB驱动开发》、《【.Net MF新特性】Usb双接口支持》和《.Net Micro Framework - USB Mass Storage功能实现》。

STM32F103系列的芯片,其USB接口仅支持Device模式,不像Ti DM355其接口支持OTG、Host、Device三种模式,所以寄存器访问相对比较简单(不过ST最新推出的互联性芯片,其USB接口和Ti的一样了)。

USB接口支持8个端点,数据传输支持三种模式:DMA、双缓冲、单缓冲,简单期间,我仅实现了单缓冲模式。

首先,我们需要声明USB寄存器相对应的结构体,以期方便操作相关的寄存器。

struct CortexM3_USB_Base

{

    //+ 0x40

    /****/ volatile UINT16 CNTR;  //控制寄存器

    static const    UINT16 CNTR_CTRM = ((UINT16)0x8000);            //成功传输中断标志

    static const    UINT16 CNTR_PMAOVRM = ((UINT16)0x4000);    //分组缓冲区溢出中断标志

    略……

};

 

struct CortexM3_USB_EndPoint

{

     /****/ volatile UINT16 EP;   //端点寄存器

    static const    UINT16 EP_CTR_RX = ((UINT16)0x8000);               //正确接收标志

    static const    UINT16 EP_DTOG_RX = ((UINT16)0x4000);            //用于数据接收的数据翻转位

略…….

};

 

struct CortexM3_USB_BTABLE

{

    static const UINT32 c_Base = 0x40006000;  //~0x400063FF USB/CAN共享的SRAM 512字节(c_PMA_Base)

    

    /****/ volatile UINT16 ADDR_TX;     //发送缓冲区地址

    static const    UINT16 ADDR_TX_Mask = ((UINT16)0xFFFE);    

    UINT16  RESERVED0;

    略…….

};

 

struct CortexM3_USB

{

    static const UINT32 c_Base = 0x40005C00;

    static const UINT32 c_CFGR_USBPRE_BB = 0x42000000 + 0x21004 * 32 + 0x16 * 4;

    static const UINT32 c_USB_MAX_EP = 3;  //8

    CortexM3_USB_EndPoint EP[8]; //0x0-0x1c   

    UINT16 RESERVED0[16];    

    CortexM3_USB_Base Base;      //0x40-0x4c 

};

 

USB提供两个中断信号,一个是c_IRQ_Index_USB_HP_CAN_TX,另一个是c_IRQ_Index_USB_LP_CAN_RX0,不过前一个对低速传输似乎必要性不大。

所以这里仅启用第二种中断,代码如下:

if(!CPU_INTC_ActivateInterruptEx( CortexM3_NVIC::c_IRQ_Index_USB_LP_CAN_RX0, (UINT32)(void *)USB_LP_IRQHandler)) return  FALSE;

此外控制USB软连接的GPIO为PB14,启用USB功能前,要置位该Pin脚。

CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_9);  //DISABLE

CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_5);  //ENABLE

针对.Net Micro Framework来说,USB仅用到三个端点,所以只需用初始化这三个端点即可,相关代码如下:

CortexM3_USB &USB = CortexM3::USB();     

USB.Base.DADDR = CortexM3_USB_Base::DADDR_EF | 0;

 

 //EP0

 USB.EP[0].EP = CortexM3_USB_EndPoint::EP_TYPE_CONTROL |   (0 & CortexM3_USB_EndPoint::EP_EA); 

 SetTxStatus(0,CortexM3_USB_EndPoint::EP_TX_NAK);

 SetRxStatus(0,CortexM3_USB_EndPoint::EP_RX_VALID);

 //lcd_printf("EP0:%x/r/n",USB.EP[0].EP);

    

 //EP1

 USB.EP[1].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (1 & CortexM3_USB_EndPoint::EP_EA);

SetTxStatus(1,CortexM3_USB_EndPoint::EP_TX_NAK);

SetRxStatus(1,CortexM3_USB_EndPoint::EP_RX_DISABLED);     

 if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;     

if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_TX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;

      

 //EP2

 USB.EP[2].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (2 & CortexM3_USB_EndPoint::EP_EA);

SetTxStatus(2,CortexM3_USB_EndPoint::EP_TX_DISABLED);

SetRxStatus(2,CortexM3_USB_EndPoint::EP_RX_VALID);

if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;     

if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_TX)  USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;

限于篇幅,这里的代码仅列这么多,有兴趣的朋友请参考.Net Micro Framework的相关USB驱动的源码,其架构大同小异。

最终成功运行的效果图如下:
image.png

相关文章
|
9天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
12天前
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
17天前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
36 1
|
28天前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
29天前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
28天前
|
消息中间件 开发框架 前端开发
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
|
1月前
|
开发框架 JavaScript 前端开发
|
2月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
73 0
下一篇
无影云桌面