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

📄 chap_9.c

📁 单片机MSP430与PDIUSBD12的固件代码,PDIUSBd12的驱动以及上位机与usb之间的通讯测试程序(使用easyd12.dll编写),已经完全编译通过,测试成功的图片见文件内.
💻 C
字号:
#include <msp430x14x.h>
#include "chap_9.h"
#include "mainloop.h"
#include "usb100.h"
#include "d12ci.h"
#include "stdio.h"

const USB_DEVICE_DESCRIPTOR DeviceDescr = 
{
  0x12,
  0x01,
  0x0110,
  0xDC,
  0,
  0,
  0x10,
  0x0471,
  0x0666,
  0x0100,
  0,
  0,
  0,
  1
};

const char ConfigDescr[] =
{
  0x09,
  0x02,  
  0x2E,
  0x00,
  1,
  1,
  0,
  0x80,
  0x01,
  
//const USB_INTERFACE_DESCRIPTOR InterfaceDescr = 

  0x09,
  0x04,
  0,
  0,
  NUM_ENDPOINTS,
  0xDC,
  0xA0,
  0xB0,
  0,

//Endpoint1 IN
//const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = 
//{
  0x07,
  0x05,
  0X81,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,
  0,
  10,
 
//};

//Endpoint1 OUT
//const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
//{
  0x07,
  0x05,
  0X01,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,
  0,
  10,
  

//};

//Endpoint2 IN
//const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
//{
  0x07,
  0x05,
  0X82,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,
  0,
  0,
  
//};

//Endpoint2 OUT
//const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
//{
  0x07,
  0x05,
  0x02,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,
  0,
  0 
};  

void get_status(void)
{
  unsigned char endp,txdat[2];
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
  unsigned char c;
  printf("get_status\n");
  if(bRecipient == USB_RECIPIENT_DEVICE)
  {
    if(bEPPflags.bits.remote_wakeup == 1)
      txdat[0] = 3;
    else
      txdat[0] = 1;
    single_transmit(txdat, 2);
  }
  else if(bRecipient == USB_RECIPIENT_INTERFACE) 
  {
    txdat[0] = 0;
    txdat[1] = 0;
    single_transmit(txdat, 2);
  }
  else if(bRecipient == USB_RECIPIENT_ENDPOINT)
  {
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
      c = D12_SelectEndpoint(endp * 2 + 1);                                 //Read input endpoint status
    else 
      c = D12_SelectEndpoint(endp * 2);                                     //Read output endpoint status
    if(c & D12_STALL)
      txdat[0] = 1;
    else
      txdat[0] = 0;
    txdat[1] = 0;
    single_transmit(txdat, 2);  
  }
  else  stall_ep0();
}
void clear_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
  printf("clear_feature\n");
  if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
  {
    _DINT();
    bEPPflags.bits.remote_wakeup = 0;
    _EINT();
    single_transmit(0, 0);
  }
  else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
  {
    //Clear Stalled Feature of Endpoint, resume 
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
      D12_SetEndpointStatus(endp * 2 + 1, 0);
    else 
      D12_SetEndpointStatus(endp * 2, 0);
    single_transmit(0, 0);
  }
  else
    stall_ep0();
}

void set_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
  printf("set_feature\n");
  if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
  {
    _DINT();
    bEPPflags.bits.remote_wakeup = 1;
    _EINT();
    single_transmit(0, 0);
  }
  else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
  {
    //Clear Stalled Feature of Endpoint, resume 
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
      D12_SetEndpointStatus(endp * 2 + 1, 1);
    else 
      D12_SetEndpointStatus(endp * 2, 1);
    single_transmit(0, 0);
  }
  else
    stall_ep0();  
}
void set_address(void)
{	
	printf("set_address\n");
  D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
  single_transmit(0, 0);                                        //Send response
}

void get_descriptor(void)
{
  //Read Descriptor type
  unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
  printf("get_descriptor\n");
  if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
  {
    //Get Device descriptor
    code_transmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));       
  } 
  else if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
  {
    if(ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
      ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;    
    //Get Configuration descriptor + Interface descriptor + Endpoint descriptor
    code_transmit((unsigned char *)&ConfigDescr, ControlData.DeviceRequest.wLength);    
  }
  else
    stall_ep0();
}

void get_configuration(void)
{
  unsigned char c = bEPPflags.bits.configuration;
  printf("get_configuration\n");
  single_transmit(&c, 1);
}

void set_configuration(void)
{
	printf("set_configuration\n");
  if(ControlData.DeviceRequest.wValue == 0)
  {
    //Configuration value is not proper. Device is in no-config state
    single_transmit(0, 0);
    _DINT();
    bEPPflags.bits.configuration = 0;
    _EINT();
    init_unconfig();                        //进入地址状态,禁止0除外的所有端点    
  }
  else if(ControlData.DeviceRequest.wValue == 1)
  {
    //Configrate device
    single_transmit(0, 0);
    init_unconfig();                        //进入地址状态,禁止0除外的所有端点
    init_config();                           //配置处理,允许端点收发
    _DINT();
    bEPPflags.bits.configuration = 1;
    _EINT();
  }  
  else
    stall_ep0();
}

void get_interface(void)
{
  unsigned char txdat = 0;                    //Only one interface
  printf("get_interface\n");
  single_transmit(&txdat, 1);
}

void set_interface(void)
{
	printf("set_interface\n");
  if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
    single_transmit(0, 0);
  else
    stall_ep0();
}

void reserved(void)
{
	printf("reserved\n");
  stall_ep0();
}

⌨️ 快捷键说明

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