【.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

相关文章
|
1月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
11天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
数据安全/隐私保护 Windows
.net三层架构开发步骤
.net三层架构开发步骤
13 0
|
1月前
深入.net平台的分层开发
深入.net平台的分层开发
62 0
|
1月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
140 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
35 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0