EDN首页   博客首页

日志档案

发表于 2007-8-27 11:25:52

0

标签: USB  单片机  固件  

USB-固件程序详细注解(一)

USB的程序真是浩大,不过还好不用自己写了,花下时间读下来就行了,我从主函数main()读起,不懂的就查前

面的函数和定义,为这个伟大的工程努力,不过还好自己买了周立功的书,书上有中文注释,我尽量打上去,不

过圈圈写的程序和书上有些不同,也要自己慢慢找,希望我贴出来的程序对大家有帮助,欢迎指正.

void main(void)
{
 unsigned short ID;
 unsigned char high,low;
 init_port();
 init_special_interrupts(); 
 init_flags(); 
 ID=D12_ReadChipID();
 high=(unsigned char)(ID>>8);
 low=(unsigned char)ID;
 reconnect_USB();
 while( TRUE )
 { 
  if (bEPPflags.bits.bus_reset)
  {
   DISABLE;
   bEPPflags.bits.bus_reset = 0;
   ENABLE;
//   D12SUSPD = 1;
  }
/*  if (bEPPflags.bits.suspend)
  {
   DISABLE;
   bEPPflags.bits.suspend= 0;
   ENABLE;
   if(D12SUSPD == 1)
   {
    D12SUSPD = 0;
    P0 = 0xFF;
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;
    D12SUSPD = 1;
    PCON |= 0x02;
    while (1);
   }
  } // if suspend change*/

  if (bEPPflags.bits.setup_packet)
  {
   DISABLE;
   bEPPflags.bits.setup_packet = 0;
   ENABLE;
   control_handler();
//   D12SUSPD = 1;
  } // if setup_packet
     if(bEPPflags.bits.configuration)    
   IspControl();
 } // Main Loop

}

void init_port()
{
 P0 = 0xFF;
 P1 = 0xFF;
 P2 = 0xFF;
 P3 = 0xFF;
// D12SUSPD = 0;
}

void init_special_interrupts(void)
{
 EA=1;
 IT1=0;
 EX1=1;
 PX1=1;
}

void init_flags()
{
 bEPPflags.bits.bus_reset=0;          
 bEPPflags.bits.suspend=0;            
 bEPPflags.bits.setup_packet=0;    
 bEPPflags.bits.remote_wakeup=0;  
 bEPPflags.bits.in_isr=0;       
 bEPPflags.bits.control_state=0;  
 bEPPflags.bits.configuration=0;  
 bEPPflags.bits.ep1_rxdone=0;
 bEPPflags.bits.main_rxdone=0; 
}

/*
   //*************************************************************************
   // structure and union definitions
   //*************************************************************************
*/
typedef union _epp_flags
{
 struct _flags
 {
//  unsigned char timer          : 1; //时间溢出
  unsigned char bus_reset      : 1; //总线复位标志
  unsigned char suspend        : 1; //挂起改变标志
  unsigned char setup_packet   : 1; //收到 setup 包
  unsigned char remote_wakeup  : 1; //远程唤醒标志(未使用)
  unsigned char in_isr      : 1; //USB中断标志
  unsigned char control_state  : 2; //控制端点处理状态
                                                  //0:  空闲
                                                  //1:  数据发送
                                                  //2:  数据接收

  unsigned char configuration  : 1; //配置标志(0:未配置;1:已经配置)
//  unsigned char verbose      : 1;
  unsigned char ep1_rxdone     : 1; //端点1收到数据标志
  unsigned char main_rxdone    : 1; //主端点收到数据标志
  unsigned char setup_dma      : 2; // V2.3
//  unsigned char dma_state      : 2;
//  unsigned char power_down     : 1; // Smart Board
 } bits;
 unsigned short value;
} EPPFLAGS;

unsigned short D12_ReadChipID(void)
{
 unsigned short i,j;
 if(bEPPflags.bits.in_isr == 0)
  DISABLE;
 outportb(D12_COMMAND, 0xFD);      // #define D12_COMMAND 0x03
 i=inportb(D12_DATA);              // #define D12_DATA 0x02
 j=inportb(D12_DATA);      
 i += (j<<8);
 if(bEPPflags.bits.in_isr == 0)
  ENABLE;
 return i;
}

//向PDIUSBD12发送数据或命令的子程序
void outportb(unsigned char port,unsigned char val)
{
 unsigned char xdata *ext_address;
 MCU_D12CS=0;                      //片选信号,低有效
 ext_address=0xff00 + port;
 *ext_address = val;
 MCU_D12CS=1;
}

//从PDIUSBD12读取数据
unsigned char inportb(unsigned char port)
{
 unsigned char c;
 unsigned char xdata *ext_address;
 MCU_D12CS=0;
 ext_address=0xff00 + port;
 c = *ext_address ;
 MCU_D12CS=1;
 return c;
}

void reconnect_USB(void)
{
// D12SUSPD = 0;                    //唤醒 PDIUSBD12
 disconnect_USB();                //断开芯片与USB总线连接
 connect_USB();
}

void disconnect_USB(void)
{
 // 初始化 PDIUSBD12 工作状态(断开 Soft Connet 上拉电阻)
 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);   //#define D12_NOLAZYCLOCK 0x02
}                                                                     //#define D12_SETTOONE    0x40
                                                                      //#define D12_CLOCK_12M 0x03
/*设置模式命令:F3H*/
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
 if(bEPPflags.bits.in_isr == 0)
  DISABLE;
 outportb(D12_COMMAND, 0xF3);
 outportb(D12_DATA, bConfig);
 outportb(D12_DATA, bClkDiv);
 if(bEPPflags.bits.in_isr == 0)
  ENABLE;
}

void connect_USB(void)
{
 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);       //#define D12_ENDP4INTENABLE 0x40
                                                                   //#define D12_ENDP5INTENABLE 0x80
 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
                                                                   //#define D12_SOFTCONNECT 0x10
}

/*设置DMA命令:FBH*/
void D12_SetDMA(unsigned char bMode)
{
 if(bEPPflags.bits.in_isr == 0)
  DISABLE;
 outportb(D12_COMMAND, 0xFB);
 outportb(D12_DATA, bMode);
 if(bEPPflags.bits.in_isr == 0)
  ENABLE;
}

系统分类: 单片机   |   用户分类: USB接口技术   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1647)    回复(4)  

投一票您将和博主都有获奖机会!

  • liusanshan

    2007-8-27 15:03:27

    LZ累了,顶顶你!

  • computer00

    2007-8-27 21:33:58

    呵呵,有心。

    我自己写的程序都一直懒得加注释呢。

  • freemankkc

    2009-1-1 17:28:21

    工作很具体,向楼主致谢 这几天都再学习USB接口。

  • freemankkc

    2009-1-1 17:28:34

    工作很具体,向楼主致谢 这几天都再学习USB接口。