⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbdevhal.c

📁 SmartARM2400系列开发板全套资料
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               usbDevHAL.c
** Latest modified Date:    2008-05-10
** Latest Version:          1.1
** Descriptions:            ZLG_USB2400 Device 软件包硬件抽象层源文件
**
**--------------------------------------------------------------------------------------------------------
** Created by:              ZhengMingyuan
** Created date:            2005-08-08
** Version:                 1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:   			LingGuilin          
** Modified date:    		2008-05-10       
** Version:          		1.1       
** Descriptions:      		修改部分代码以适合SmartARM2400系列开发板
**
*********************************************************************************************************/

#include  "config.h"

#ifndef USBClkCtrl
#define  USBClkCtrl         (*(volatile unsigned long *)(0xFFE0CFF4))  
#endif

#ifndef USBClkSt
#define  USBClkSt           (*(volatile unsigned long *)(0xFFE0CFF8)) 
#endif

#ifndef USBPortSel
#define  USBPortSel         (*(volatile unsigned long *)(0xFFE0C110))	
#endif

#define __USB_DEV_CLK_EN          (0x01 << 1)
#define __USB_I2C_CLK_EN          (0x01 << 2)
#define __USB_OTG_CLK_EN          (0x01 << 3)
#define __USB_AHB_CLK_EN          (0x01 << 4)

#define __USB_TDI                 (0x01 << 0)

/*********************************************************************************************************
** Function name:		__usbDevHardwareInit
** Descriptions:        初始化 USB 设备控制器硬件
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void __usbDevHardwareInit (void)
{
    INT32U  ulClkCtrl = (__USB_I2C_CLK_EN | __USB_OTG_CLK_EN | \
                         __USB_DEV_CLK_EN | __USB_AHB_CLK_EN);
      
    PCONP |= 0x80000000;                                                /*  给USB控制器提供电源         */
    OTGClkCtrl = ulClkCtrl;                                             /*  配置USB时钟控制寄存器       */
    while ((OTGClkSt & ulClkCtrl) != ulClkCtrl);       
    
    OTGStCtrl &= ~0x01;                                                 /*  U1 HOST, U2 HOST            */
    PINSEL1 &= ~(0x03U << 26);                                          /*  P0.29 为 LPC2400 USB        */
    PINSEL1 |= (0x01U << 26);                                           /*  ...Device(1) 的D+           */
    
    PINSEL1 &= ~(0x03U << 28);                                          /*  P0.30 为 LPC2400 USB        */
    PINSEL1 |= (0x01U << 28);                                           /*  ...Device(1) 的 D-          */
     
    PINSEL3 &= ~(0x03U << 28);                                          /*  P1.30 为 LPC2400 USB        */
    PINSEL3 |= (0x02U << 28);                                           /*  Device(1)和(2) 的 VBUS      */
     
    PINSEL3 &= ~(0x03U << 4);                                           /*  P1.18 为 LPC2400 USB        */
    PINSEL3 |= (0x01U << 4);                                            /*  ...Device(1) UP_LED         */

    PINSEL3 &= ~(0x0F << 24);                                           /*  P1.28 为 USB_SCL1, P1.29    */
    PINSEL3 |= (0x05 << 24);                                            /*  ...为 USB_SDA1              */
    
    __isp1301DisEnPswOE();
    __isp1301Write(__OTG_CTL1_CLR, __OTG_CTL1_DM_PULLDOWN | 
                   __OTG_CTL1_DP_PULLDOWN | __OTG_CTL1_DM_PULLUP);
                   
}

/*********************************************************************************************************
** Function name:		__usbDevHadwareDisconnect
** Descriptions:        断开与USB 总线的连接
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void __usbDevHadwareDisconnect (void)
{
    /*
     *  取消 ISP1301 上的 D+ 线电阻上拉
     */
    OTG_I2C_TX = 0x15A;                                                 /*  发送 ISP1301 地址,          */
                                                                        /*  ...R/W=0, 写操作            */
    OTG_I2C_TX = 0x007;                                                 /*  send OTG Control (Set)      */
                                                                        /*  ...register address         */
    OTG_I2C_TX = 0x201;                                                 /*  Set DP_PULLUP bit,          */
                                                                        /*  ...send STOP condition      */
    while (!(OTG_I2C_STS & __USB_TDI));                                 /*  Wait for TDI to be set      */
    
    OTG_I2C_STS = __USB_TDI;                                            /*  Clear TDI                   */
    
}

/*********************************************************************************************************
** Function name:		__usbDevHadwareConnect
** Descriptions:        连接 USB 总线
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void __usbDevHadwareConnect (void)
{
    /*
     *  设置 ISP1301 上的 D+ 线电阻上拉
     */
    OTG_I2C_TX = 0x15A;                                                 /*  发送 ISP1301 地址,          */
                                                                        /*  ...R/W=0, 写操作            */
    OTG_I2C_TX = 0x006;                                                 /*  send OTG Control (Set)      */
                                                                        /*  ...register address         */
    OTG_I2C_TX = 0x201;                                                 /*  Set DP_PULLUP bit,          */
                                                                        /*  ...send STOP condition      */
    while (!(OTG_I2C_STS & __USB_TDI));                                 /*  Wait for TDI to be set      */
    
    OTG_I2C_STS = __USB_TDI;                                            /*  Clear TDI                   */
}

/*********************************************************************************************************
** Function name:		__usbDevHadwareReconnect
** Descriptions:        重新连接 USB 总线
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void __usbDevHadwareReconnect (void)
{
	INT32U ulClkCnt = 0;

	__usbDevHadwareDisconnect();							    		/*  断开与USB总线的连接			*/
    for (ulClkCnt = 0;ulClkCnt <= 0x1FFFF;ulClkCnt++);  				/*  延时 						*/
     
    __usbDevHadwareConnect();								    		/*  连接至USB总线 				*/
}

/*********************************************************************************************************
** Function name:		__usbDevIntConfig
** Descriptions:        配置USB设备控制器的中断
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void __usbDevIntConfig (void)
{
	INT32U ulTmp = EP_SLOW;
				
    USBDevIntClr = FRAME;												/*  禁止同步传输帧中断 			*/

    USBDevIntEn = ulTmp;												/*  使能复位中断, 低速中断 		*/
      
    USBDevIntPri = 0; 				  									/*  使能端点中断为低优先级中断 	*/
 
#if DMA_ENGINE_EN
	ulTmp = (0x01 << 0) + (0x01 << 1);									/*  使能控制传输端点从机中断 	*/
#else
	ulTmp = (0x01 << 0) + (0x01 << 1) + (0x01 << 2) + 
	        (0x01 << 3) + (0x01 << 4) + (0x01 << 5);					/*  使能端点 0 ~ 5 从机中断 	*/
#endif
		

	USBEpIntEn = ulTmp;	  												/*  使能物理端点 0 ~ 5中断 		*/
	
    USBEpIntPri &= ~(unsigned long)ulTmp;								/*  设置为低优先级中断 			*/

}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -