2

关于投票
超强,proteus软件仿真USB温度显示

如果大家用过proteus单片机仿真软件的话,肯定会佩服得五体投地,可以仿真

51单片机,还有AVR,PIC,现在又加入最新的USB,强.我一直在这个软件上做仿

真,再在硬件上调试,很爽,大大缩短了工程量.放上几个USB的截图.

这个软件最新版本是 7.2 SP1,只有7.2版本才有USB仿真,用的是 PIC18F4550

我没学过PIC,不过肯定要去学了,不然怎样搞仿真,大家可以一起玩玩,

这个仿真软件官方网站上有得下,不过只能运行仿真,不能保存原理图,不过已

经足够做仿真研究了.下载网址:

http://www.labcenter.co.uk/download/prodemo_download.cfm

如果大家要学习proteus软件,可以上这个proteus论坛,里面大把仿真例子和教材.

http://www.proteus.com.cn/register.php?fromuser=bawgijfd

有个请求,希望大家能用这个链接注册用户,这样我就有积分了,在这个论坛上下载东西要积分的,我已经下载了好多资料,花了好多积分,现在很少积分了,我以后把下载到的例子和教材放上来,这样大家就可以共享资料了.不要浪费了一次机会哦.

点击看大图

点击看大图

 

点击看大图

系统分类: 单片机
用户分类: USB接口技术
标签: USB 仿真 单片机
来源: 原创
发表评论 阅读全文(1860) | 回复(5)

0

关于投票
USB-固件程序详细注解(二)

看到头都大了,虽然不是全都明白,但起码走了一遍程序,附上我读完主程序涉及的所有注释.直接一句句往下读就行了,函数都在程序的后面的,找不到就用查找功能找一下.

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;                 //释放 PDIUSBD12 挂起控制
  }
/*  if (bEPPflags.bits.suspend)           //挂起改变处理
  {
   DISABLE;
   bEPPflags.bits.suspend= 0;    //清除挂起改变标志
   ENABLE;
   if(D12SUSPD == 1)             //进入挂起处理
   {
    D12SUSPD = 0;         //唤醒 PDIUSBD12,使得USB器件在
                                                      //MCU进入低功耗模式后再进入挂起
    P0 = 0xFF;           
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;
    D12SUSPD = 1;        //释放挂起控制
    PCON |= 0x02;        //进入掉电模式
    while (1);           //芯片进入死循环,因为标志51进入掉电
   }                            //后,只有复位才可以唤醒芯片
  } // if suspend change*/

  if (bEPPflags.bits.setup_packet)    //Setup 包处理
  {
   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;
}


 while( TRUE )
 { 
  if (bEPPflags.bits.bus_reset)         //总线复位处理
  {
   DISABLE;
   bEPPflags.bits.bus_reset = 0; //清总线复位标志
   ENABLE;
//   D12SUSPD = 1;                 //释放 PDIUSBD12 挂起控制
  }
/*  if (bEPPflags.bits.suspend)           //挂起改变处理
  {
   DISABLE;
   bEPPflags.bits.suspend= 0;    //清除挂起改变标志
   ENABLE;
   if(D12SUSPD == 1)             //进入挂起处理
   {
    D12SUSPD = 0;         //唤醒 PDIUSBD12,使得USB器件在
                                                      //MCU进入低功耗模式后再进入挂起
    P0 = 0xFF;           
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;
    D12SUSPD = 1;        //释放挂起控制
    PCON |= 0x02;        //进入掉电模式
    while (1);           //芯片进入死循环,因为标志51进入掉电
   }                            //后,只有复位才可以唤醒芯片
  } // if suspend change*/

  if (bEPPflags.bits.setup_packet)    //Setup 包处理
  {
   DISABLE;
   bEPPflags.bits.setup_packet = 0;
   ENABLE;
   control_handler();          //调用请求处理子程序
//   D12SUSPD = 1;               //释放挂起控制
  } // if setup_packet
     if(bEPPflags.bits.configuration)    
   IspControl();
 } // Main Loop

}

void control_handler()
{
 unsigned char type, req;                 
        //读取请求类型,保留bit5和bit6
        //#define USB_REQUEST_TYPE_MASK    (unsigned char)0x60
        //#define USB_REQUEST_MASK         (unsigned char)0x0F
 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
        ////读取请求代码,保留低4位
 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;  
 if (type == USB_STANDARD_REQUEST)          //标准请求处理
  (*StandardDeviceRequest[req])();
 else
  stall_ep0();                       //无效请求,返回STALL
}

//USB设备请求寄存器
typedef struct _device_request
{
 unsigned char bmRequestType;              //请求类型(数据传输方向,类型,接收器)
 unsigned char bRequest;                   //USB请求
 unsigned short wValue;                    //USB请求值
 unsigned short wIndex;                    //USB请求索引
 unsigned short wLength;                   //计数长度 
} DEVICE_REQUEST;

extern CONTROL_XFER ControlData;

#define MAX_CONTROLDATA_SIZE 8

//Setup 包数据缓冲区
typedef struct _control_xfer
{
 DEVICE_REQUEST DeviceRequest;            //USB设备请求结构体,8个字节
 unsigned short wLength;                  //传输数据的总字节数
 unsigned short wCount;                   //传输字节数统计
 unsigned char * pData;                   //传输数据的指针
 unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; //请求的数据
} CONTROL_XFER;

/************************************************************
USB标准设备请求子程序入口地址表
************************************************************/

//USB标准设备请求入口地址指针表
code void (*StandardDeviceRequest[])(void) =
{
 get_status,
 clear_feature,
 reserved,
 set_feature,
 reserved,
 set_address,
 get_descriptor,
 reserved,
 get_configuration,
 set_configuration,
 get_interface,
 set_interface,
 reserved,
 reserved,
 reserved,
 reserved
};


#define NUM_ENDPOINTS 4

#define CONFIG_DESCRIPTOR_LENGTH    sizeof(USB_CONFIGURATION_DESCRIPTOR) \
     + sizeof(USB_INTERFACE_DESCRIPTOR) \
     + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))

extern CONTROL_XFER ControlData;
//extern IO_REQUEST idata ioRequest;
extern EPPFLAGS bEPPflags;
/*
USB 标准请求程序调用到的子程序
*/

//保留子程序
void reserved(void)
{
 stall_ep0();
}

void stall_ep0(void)
{
 D12_SetEndpointStatus(0, 1);
 D12_SetEndpointStatus(1, 1);
}

/*设置端点状态命令:40~45H*/
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
 if(bEPPflags.bits.in_isr == 0)  //USB 中断服务标志
  DISABLE;
 outportb(D12_COMMAND, 0x40 + bEndp);
 outportb(D12_DATA, bStalled);
 if(bEPPflags.bits.in_isr