前段时间我连续写了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寄存器相对应的结构体,以期方便操作相关的寄存器。

  1. struct CortexM3_USB_Base
  2. {
  3. //+ 0x40
  4. /****/ volatile UINT16 CNTR;  //控制寄存器
  5. static const    UINT16 CNTR_CTRM = ((UINT16)0x8000);            //成功传输中断标志
  6. static const    UINT16 CNTR_PMAOVRM = ((UINT16)0x4000);    //分组缓冲区溢出中断标志
  7. 略……
  8. };
  9. struct CortexM3_USB_EndPoint
  10. {
  11. /****/ volatile UINT16 EP;   //端点寄存器
  12. static const    UINT16 EP_CTR_RX = ((UINT16)0x8000);               //正确接收标志
  13. static const    UINT16 EP_DTOG_RX = ((UINT16)0x4000);            //用于数据接收的数据翻转位
  14. 略…….
  15. };
  16. struct CortexM3_USB_BTABLE
  17. {
  18. static const UINT32 c_Base = 0x40006000;  //~0x400063FF USB/CAN共享的SRAM 512字节(c_PMA_Base)
  19. /****/ volatile UINT16 ADDR_TX;     //发送缓冲区地址
  20. static const    UINT16 ADDR_TX_Mask = ((UINT16)0xFFFE);
  21. UINT16  RESERVED0;
  22. 略…….
  23. };
  24. struct CortexM3_USB
  25. {
  26. static const UINT32 c_Base = 0x40005C00;
  27. static const UINT32 c_CFGR_USBPRE_BB = 0x42000000 + 0x21004 * 32 + 0x16 * 4;
  28. static const UINT32 c_USB_MAX_EP = 3;  //8
  29. CortexM3_USB_EndPoint EP[8]; //0x0-0x1c
  30. UINT16 RESERVED0[16];
  31. CortexM3_USB_Base Base;      //0x40-0x4c
  32. };
  33. USB提供两个中断信号,一个是c_IRQ_Index_USB_HP_CAN_TX,另一个是c_IRQ_Index_USB_LP_CAN_RX0,不过前一个对低速传输似乎必要性不大。
  34. 所以这里仅启用第二种中断,代码如下:
  35. if(!CPU_INTC_ActivateInterruptEx( CortexM3_NVIC::c_IRQ_Index_USB_LP_CAN_RX0, (UINT32)(void *)USB_LP_IRQHandler)) return  FALSE;
  36. 此外控制USB软连接的GPIO为PB14,启用USB功能前,要置位该Pin脚。
  37. CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_9);  //DISABLE
  38. CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_5);  //ENABLE
  39. 针对.Net Micro Framework来说,USB仅用到三个端点,所以只需用初始化这三个端点即可,相关代码如下:
  40. CortexM3_USB &USB = CortexM3::USB();
  41. USB.Base.DADDR = CortexM3_USB_Base::DADDR_EF | 0;
  42. //EP0
  43. USB.EP[0].EP = CortexM3_USB_EndPoint::EP_TYPE_CONTROL |   (0 & CortexM3_USB_EndPoint::EP_EA);
  44. SetTxStatus(0,CortexM3_USB_EndPoint::EP_TX_NAK);
  45. SetRxStatus(0,CortexM3_USB_EndPoint::EP_RX_VALID);
  46. //lcd_printf("EP0:%x\r\n",USB.EP[0].EP);
  47. //EP1
  48. USB.EP[1].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (1 & CortexM3_USB_EndPoint::EP_EA);
  49. SetTxStatus(1,CortexM3_USB_EndPoint::EP_TX_NAK);
  50. SetRxStatus(1,CortexM3_USB_EndPoint::EP_RX_DISABLED);
  51. if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;
  52. if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_TX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;
  53. //EP2
  54. USB.EP[2].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (2 & CortexM3_USB_EndPoint::EP_EA);
  55. SetTxStatus(2,CortexM3_USB_EndPoint::EP_TX_DISABLED);
  56. SetRxStatus(2,CortexM3_USB_EndPoint::EP_RX_VALID);
  57. if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;
  58. 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驱动的源码,其架构大同小异。

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

转载于:https://blog.51cto.com/yfsoft/321207

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

  1. 【.Net Micro Framework PortingKit – 12】SysTick驱动开发

    SysTick驱动对TinyCLR来说非常重要,.Net Micro Framework系统的多线程和多任务(对托管代码来说是单任务多线程,但是还存在和托管代码同时运行的任务,如我们用MFDeploy ...

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

    在前段时间我连续写了15篇关于[.Net Micro Framework PortingKit–?]的系列文章,初步介绍了.Net Micro Framework在Cortex-M3平台上的移植过程, ...

  3. 【.Net Micro Framework PortingKit - 08】GPIO驱动

    要点亮LED灯或获得输入IO的状态应该是比较容易的,打开端口时钟,然后读写相关的GPIO寄存器就可以了,但是要实现一个输入中断,就要费些周折了. 对STM32(Cortex-M3)的芯片,要实现一个G ...

  4. 2008年12月13日上海USB驱动开发深度解析讲座PPT

    讲座PPT:宋宝华2008年12月13日上海USB驱动开发深度解析讲座PPT [url]http://www.linuxdriver.cn/200812/20081213172619_836.rar[ ...

  5. MF Porting之USB驱动开发

    花费了近三个礼拜的时间,终于完成了TI开发板的USB驱动开发,现在回头想一想,其实也没有什么,具体硬件方面的通信由DM355实现了,软件层面的数据交互由MF Porting实现了,所做的也就是熟悉了解 ...

  6. Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

    http://blog.csdn.net/zqixiao_09/article/details/51057086 设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程 ...

  7. Linux USB 驱动开发实例(七)—— 基于USB 总线的无线网卡浅析

    回顾一下USB的相关知识 USB(Universal Serial Bus)总线又叫通用串行外部总线, 它是20世纪90年代发展起来的.USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量的 ...

  8. c语言+usb驱动开发,usb驱动程序分析

    usb驱动是linux内核中比较复杂的驱动之一,因此,大多数usb教程建议从usb-skeleton开始学习usb驱动.个人认为这是相当正确的,usb-sekelton提供了一个usb驱动开发的模板, ...

  9. linux 下usb驱动开发,LINUX_ARM下的USB驱动开发.pdf

    LINUX_ARM下的USB驱动开发 CN 431258 / TP 计算机工程与科学 2006年第 28卷第 3期 ISSN 1007130X COM PU TER EN GIN EER IN G & ...

最新文章

  1. 宏基因组实战4. 基因注释Prokka
  2. ASP.net之策略模式
  3. php的server和location,3、Nginx关于server块和location块的配置
  4. Bootstrap fileinput.js,最好用的文件上传组件
  5. MySQL varchar和char类型
  6. 在Spring中使用JMS
  7. SAP屏幕设计器专题:编写控件代码(三)
  8. 前端学习(1580):初始react
  9. 谁说 Vim 不好用?
  10. C#连接Oracle中文乱码问题解决方法
  11. windows-更新包
  12. html5全栈工程师招聘,蓝鸥HTML5全栈工程师 高薪就业的利器
  13. 1007 素数对猜想 (20 分)(打表)
  14. 用html画动漫人物,画动漫人物的步骤?
  15. LonLife-ACM 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
  16. file_get_contents获取参数并用file_put_contents保存图片
  17. 三阶魔方7步还原法详解 简单
  18. MySQL limit 2种写法
  19. R语言绘制生存曲线估计|生存分析|如何R作生存曲线图
  20. 卡片互动悬停下载动画

热门文章

  1. PHP设计模式(6)迭代器模式
  2. 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块
  3. KVM的内存气球技术(balloon)
  4. CENTOS编译安装APACHE 2.4.6笔记
  5. 获取组件的方式(方法)
  6. 现实世界中的Windows Azure:ADMIXER特别版、Autocosmos.com、IT WORKS和News360!
  7. 读者来信(1)——项目经理,不要迷信制度!
  8. hadoop+hive+flink+hbase交互的版本兼容性
  9. 3分钟搞懂LSI原理
  10. C4.5-Release8的代码架构图