亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb_main.c

?? 上位機與下位機的USB通訊
?? C
字號:
// File best viewed using Tab Size of 4 Characters
// Author DM   DATE  4-4-03
// Modified CS DATE  8-25-03
// Modified PKC DATE 1-24-06 (changed 'F320.h to 'F340.h)
// Modified PKC DATE 10-11-06 (changed USBXpress API interrupt to 17)
// This example illustrates usage of the USB_API.lib
// DO NOT locate code segments at 0x1400 to 0x4000
// These are used for non-voltile storage for transmitted data.

// Include files
#include <c8051f340.h>     // Header file for SiLabs c8051f34x
#include <stddef.h>        // Used for NULL pointer definition
#include "USB_API.h"    // Header file for USB_API.lib

// Bit Definitions
sbit  Led1  =  P2^2; // LED='1' means ON
sbit  Led2  =  P2^3; // These blink to indicate data transmission

// Constants Definitions
#define  NUM_STG_PAGES  20 // Total number of flash pages to be used for file storage
#define MAX_BLOCK_SIZE_READ   64 // Use the maximum read block size of 64 bytes

#define MAX_BLOCK_SIZE_WRITE 4096   // Use the maximum write block size of 4096 bytes
#define  FLASH_PAGE_SIZE   512           //  Size of each flash page
#define  BLOCKS_PR_PAGE FLASH_PAGE_SIZE/MAX_BLOCK_SIZE_READ  // 512/64 = 8
#define MAX_NUM_BYTES   FLASH_PAGE_SIZE*NUM_STG_PAGES
#define MAX_NUM_BLOCKS  BLOCKS_PR_PAGE*NUM_STG_PAGES



// Message Types
#define  READ_MSG 0x00  // Message types for communication with host
#define  WRITE_MSG   0x01
#define  SIZE_MSG 0x02
#define DELAYED_READ_MSG   0x05

// Machine States
#define  ST_WAIT_DEV 0x01  // Wait for application to open a device instance
#define  ST_IDLE_DEV 0x02  // Device is open, wait for Setup Message from host
#define  ST_RX_SETUP 0x04  // Received Setup Message, decode and wait for data
#define  ST_RX_FILE  0x08  // Receive file data from host
#define  ST_TX_FILE  0x10  // Transmit file data to host
#define  ST_TX_ACK   0x20  // Transmit ACK 0xFF back to host after every 8 packets
#define  ST_ERROR 0x80  // Error state

// No such thing as a block of data anymore since it is variable between 1 and 1024
// So comment this out
typedef struct {        // Structure definition of a block of data
   BYTE  Piece[MAX_BLOCK_SIZE_READ];
}  BLOCK;

typedef struct {        // Structure definition of a flash memory page
   BYTE  FlashPage[FLASH_PAGE_SIZE];
}  PAGE;

xdata BLOCK TempStorage[BLOCKS_PR_PAGE];  // Temporary storage of between flash writes

//data   BYTE code * PageIndices[20]   =  {0x1400,0x1600,0x1800,0x1A00,0x1C00,0x1E00,0x2000,0x2200,0x2400,0x2600
//                         ,0x2800,0x2A00,0x2C00,0x2E00,0x3000,0x3200,0x3400,0x3600,0x3800,0x3A00};
data  BYTE code * PageIndices[20]   =  {0x2200,0x2400,0x2600,0x2800,0x2A00,0x2C00,0x2E00,0x3000,0x3200,0x3400
                           ,0x3600,0x3800,0x3A00,0x3C00,0x3E00,0x4000,0x4200,0x4400,0x4600};

data  UINT  BytesToRead;   // Total number of bytes to read from host
data  UINT  WriteStageLength; // Current write transfer stage length
data  UINT  ReadStageLength; //  Current read transfer stage length
data  BYTE  Buffer[3];     // Buffer for Setup messages
data  UINT  NumBytes;      // Number of Blocks for this transfer
data  BYTE  NumBlocks;
data  UINT  BytesRead;     // Number of Bytes Read
data  BYTE  M_State;    // Current Machine State
data  UINT  BytesWrote;    // Number of Bytes Written
data  BYTE  BlockIndex;    // Index of Current Block in Page
data  BYTE  PageIndex;     // Index of Current Page in File
data  BYTE  BlocksWrote;   // Total Number of Blocks Written
data  BYTE* ReadIndex;
data  UINT  BytesToWrite;

/*** [BEGIN] USB Descriptor Information [BEGIN] ***/
code const UINT USB_VID = 0x10C4;
code const UINT USB_PID = 0xEA61;
code const BYTE USB_MfrStr[] = {0x1A,0x03,'S',0,'i',0,'l',0,'i',0,'c',0,'o',0,'n',0,' ',0,'L',0,'a',0,'b',0,'s',0};                       // Manufacturer String
code const BYTE USB_ProductStr[] = {0x10,0x03,'U',0,'S',0,'B',0,' ',0,'A',0,'P',0,'I',0}; // Product Desc. String
code const BYTE USB_SerialStr[] = {0x0A,0x03,'1',0,'2',0,'3',0,'4',0};
code const BYTE USB_MaxPower = 15;            // Max current = 30 mA (15 * 2)
code const BYTE USB_PwAttributes = 0x80;      // Bus-powered, remote wakeup not supported
code const UINT USB_bcdDevice = 0x0100;       // Device release number 1.00
/*** [ END ] USB Descriptor Information [ END ] ***/

code    BYTE   LengthFile[3]  _at_  0x2000;
   // {Length(Low Byte), Length(High Byte), Number of Blocks}

void  Port_Init(void);        // Initialize Ports Pins and Enable Crossbar
void  State_Machine(void);    // Determine new state and act on current state
void  Receive_Setup(void);    // Receive and decode setup packet from host
void  Receive_File(void);        // Receive file data from host
//void   Suspend_Device(void);      //  Place the device in suspend mode
void  Page_Erase(BYTE*) small;   // Erase a flash page
void  Page_Write(BYTE*) small;   // Write a flash page



//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
void main(void)
{
   PCA0MD &= ~0x40;              // Disable Watchdog timer

   USB_Clock_Start();                     // Init USB clock *before* calling USB_Init
   USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice);

   CLKSEL |= 0x02;


   RSTSRC   |= 0x02;

   Port_Init();                  // Initialize crossbar and GPIO

   USB_Int_Enable();             // Enable USB_API Interrupts
      while (1);
}

void  Port_Init(void)
{
   P2MDOUT  |= 0x0C;             // Port 2 pins 0,1 set high impedence
   XBR0  =  0x00;
   XBR1  =  0x40;                // Enable Crossbar
}

void  Page_Erase(BYTE*  Page_Address)  small
{
   BYTE  EA_Save;             // Used to save state of global interrupt enable
   BYTE  xdata *pwrite;       // xdata pointer used to generate movx intruction

   EA_Save  =  EA;                  // Save current EA
   EA =  0;                   // Turn off interrupts
   pwrite   =  (BYTE xdata *)(Page_Address); // Set write pointer to Page_Address
   PSCTL =  0x03;             // Enable flash erase and writes

   FLKEY =  0xA5;             // Write flash key sequence to FLKEY
   FLKEY =  0xF1;
   *pwrite  =  0x00;             // Erase flash page using a write command

   PSCTL =  0x00;             // Disable flash erase and writes
   EA =  EA_Save;             // Restore state of EA
}

void  Page_Write(BYTE*  PageAddress)   small
{
   BYTE  EA_Save;             // Used to save state of global interrupt enable
   BYTE  xdata *pwrite;       // Write Pointer
   BYTE  xdata *pread;           // Read Pointer
   UINT  x;                   // Counter for 0-512 bytes

   pread =  (BYTE xdata *)(TempStorage);
   EA_Save  =  EA;                  // Save EA
   EA =  0;                   // Turn off interrupts
   pwrite   =  (BYTE xdata *)(PageAddress);
   PSCTL =  0x01;             // Enable flash writes
   for(x = 0;  x<FLASH_PAGE_SIZE;   x++)//   Write 512 bytes
   {
      FLKEY =  0xA5;          // Write flash key sequence
      FLKEY =  0xF1;
      *pwrite  =  *pread;           // Write data byte to flash

      pread++;                // Increment pointers
      pwrite++;
   }
   PSCTL =  0x00;             // Disable flash writes
   EA =  EA_Save;             // Restore EA
}

void  State_Machine(void)
{
   switch   (M_State)
   {
      case  ST_RX_SETUP:
         Receive_Setup();        // Receive and decode host Setup Message
         break;
      case  ST_RX_FILE:
         Receive_File();            // Receive File data from host
         break;
      case  ST_TX_ACK:
         M_State =   ST_RX_FILE;    // Ack Transmit complete, continue RX data
         break;
      case  ST_TX_FILE:          // Send file data to host
         WriteStageLength = ((BytesToWrite - BytesWrote) > MAX_BLOCK_SIZE_WRITE)? MAX_BLOCK_SIZE_WRITE:(BytesToWrite - BytesWrote);
         BytesWrote  += Block_Write((BYTE*)(ReadIndex), WriteStageLength);
         ReadIndex += WriteStageLength;

         if ((BlocksWrote%8) == 0)  Led2 = ~Led2;
         if (BytesWrote == NumBytes)   Led2 = 0;
         break;
      default:
         break;
   }
}


   // ISR for USB_API, run when API interrupts are enabled, and an interrupt is received
void  USB_API_TEST_ISR(void)  interrupt   17
{
   BYTE  INTVAL   =  Get_Interrupt_Source(); // Determine type of API interrupts
   if (INTVAL  &  USB_RESET)              // Bus Reset Event, go to Wait State
   {
      M_State  =  ST_WAIT_DEV;
   }

   if (INTVAL  &  DEVICE_OPEN)            // Device opened on host, go to Idle
   {
      M_State  =  ST_IDLE_DEV;
   }

   if (INTVAL  &  TX_COMPLETE)
   {
      if (M_State == ST_RX_FILE)          // Ack Transmit complete, go to RX state
      {
         M_State  =  (ST_TX_ACK);
      }
      if (M_State == ST_TX_FILE)          // File block transmit complete, go to TX state
      {
         M_State  =  (BytesWrote == BytesToWrite) ? ST_IDLE_DEV :ST_TX_FILE;  // Go to Idle when done
      }
   }
   if (INTVAL  &  RX_COMPLETE)            // RX Complete, go to RX Setup or RX file state
   {
      M_State  =  (M_State == ST_IDLE_DEV) ? ST_RX_SETUP : ST_RX_FILE;
   }
   if (INTVAL  &  DEVICE_CLOSE)           // Device closed, wait for re-open
   {
      M_State  =  ST_WAIT_DEV;
   }
   if (INTVAL  &  FIFO_PURGE)             // Fifo purged, go to Idle State
   {
      M_State  =  ST_IDLE_DEV;
   }

   State_Machine();                    // Call state machine routine
}

void  Receive_Setup(void)
{
   BytesRead   =  Block_Read(&Buffer,  3);      // Read Setup Message

   if (Buffer[0]  == READ_MSG)            // Check See if Read File Setup
   {
      PageIndex   =  0;                // Reset Index
      NumBlocks   =  LengthFile[2];       // Read NumBlocks from flash stg
      NumBlocks   = (NumBlocks > MAX_NUM_BLOCKS)?  MAX_NUM_BLOCKS:   NumBlocks; // only write as many bytes
                                    // as we have space available
      Buffer[0]   =  SIZE_MSG;            // Send host size of transfer message
      Buffer[1]   =  LengthFile[1];
      Buffer[2]   =  LengthFile[0];
      BytesToWrite   =  Buffer[1]   +  256*Buffer[2];
      BytesWrote  =  Block_Write((BYTE*)&Buffer,   3);
      M_State  =  ST_TX_FILE;             // Go to TX data state
      BytesWrote  =  0;
      ReadIndex   =  PageIndices[0];
      Led2  =  1;
   }
   else  // Otherwise assume Write Setup Packet
   {
      BytesToRead =  Buffer[1]   +  256*Buffer[2];
      NumBlocks   =  (BYTE)(BytesToRead/MAX_BLOCK_SIZE_READ);  // Find NumBlocks

      if (BytesToRead > MAX_NUM_BYTES)                // State Error if transfer too big
      {
         M_State = ST_ERROR;
      }
      else
      {

         if (BytesToRead%MAX_BLOCK_SIZE_READ)   NumBlocks++;   // Increment NumBlocks for last partial block

         TempStorage->Piece[0]   =  Buffer[2];
         TempStorage->Piece[1]   =  Buffer[1];
         TempStorage->Piece[2]   =  NumBlocks;

         // Write Values to Flash
         Page_Erase(0x2000);                       // Store file data to flash
         Page_Write(0x2000);

         PageIndex   =  0;                         // Reset Index
         BlockIndex  =  0;
         BytesRead   =  0;
         Led1  =  1;
         M_State = ST_RX_FILE;                        // Go to RX data state
      }
   }
}

void  Receive_File(void)
{
   ReadStageLength = ((BytesToRead - BytesRead) > MAX_BLOCK_SIZE_READ)? MAX_BLOCK_SIZE_READ:(BytesToRead - BytesRead);

   BytesRead   += Block_Read((BYTE*)(&TempStorage[BlockIndex]), ReadStageLength);   // Read Block

   BlockIndex++;
   // If device has received as many bytes as fit on one FLASH page, disable interrupts,
   // write page to flash, reset packet index, enable interrupts
   // Send handshake packet 0xFF to host after FLASH write
   if ((BlockIndex   == (BLOCKS_PR_PAGE)) || (BytesRead  == BytesToRead))
   {
      Page_Erase((BYTE*)(PageIndices[PageIndex]));
      Page_Write((BYTE*)(PageIndices[PageIndex]));
      PageIndex++;
      Led1 = ~Led1;
      BlockIndex  =  0;
      Buffer[0]   =  0xFF;
      Block_Write(Buffer,  1);         // Send handshake Acknowledge to host
   }

   // Go to Idle state if last packet has been received
   if (BytesRead  == BytesToRead)   {M_State =  ST_IDLE_DEV;   Led1  =  0;}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩激情一二三区| 欧洲精品一区二区| 欧美成人三级电影在线| 日韩专区一卡二卡| 制服.丝袜.亚洲.中文.综合| 亚洲成人一区在线| 欧美疯狂性受xxxxx喷水图片| 亚洲最大成人网4388xx| 欧美日韩久久不卡| 免费观看一级特黄欧美大片| 日韩欧美成人午夜| 国产河南妇女毛片精品久久久| 国产日产欧美一区| 91日韩精品一区| 偷拍自拍另类欧美| 精品国产3级a| 尤物在线观看一区| 国产精品资源在线看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 日韩不卡手机在线v区| 91精品国产91久久久久久一区二区| 日本女人一区二区三区| 久久精品视频一区二区三区| 91浏览器在线视频| 免费在线看成人av| 国产精品久久久久婷婷二区次| 欧美做爰猛烈大尺度电影无法无天| 日韩vs国产vs欧美| 国产精品高清亚洲| 9191成人精品久久| 成人av小说网| 美女网站色91| 亚洲精品水蜜桃| 精品蜜桃在线看| 色先锋aa成人| 国产在线一区二区| 亚洲一区二区视频在线| 久久综合久久鬼色| 欧美老肥妇做.爰bbww视频| 国产精品一区二区三区四区| 午夜精品福利一区二区蜜股av | wwwwxxxxx欧美| 91麻豆国产福利在线观看| 久久激情五月激情| 一区二区三区加勒比av| 久久人人97超碰com| 欧美精品久久天天躁| eeuss鲁片一区二区三区在线看| 日本亚洲天堂网| 亚洲欧洲av一区二区三区久久| 日韩欧美一二三| 欧美日韩中文字幕一区二区| 国产91清纯白嫩初高中在线观看| 日本中文一区二区三区| 夜夜爽夜夜爽精品视频| 中文在线一区二区| 久久只精品国产| 欧美大片在线观看一区二区| 欧美视频在线播放| 色综合久久久久综合体| 不卡高清视频专区| 国产一区二区主播在线| 麻豆视频观看网址久久| 性久久久久久久久| 亚洲午夜精品17c| 亚洲九九爱视频| 亚洲视频资源在线| 国产精品电影一区二区| 欧美激情综合五月色丁香小说| 精品伦理精品一区| 精品国偷自产国产一区| 日韩西西人体444www| 欧美美女直播网站| 欧美亚洲动漫制服丝袜| 91视频免费看| 91麻豆免费在线观看| 91麻豆福利精品推荐| 99麻豆久久久国产精品免费| 丁香六月久久综合狠狠色| 国产乱理伦片在线观看夜一区| 日韩不卡一区二区三区| 一区二区三区国产精华| 精品91自产拍在线观看一区| 91老司机福利 在线| 94-欧美-setu| 91美女片黄在线观看91美女| 色婷婷精品久久二区二区蜜臀av| 99亚偷拍自图区亚洲| 不卡的av网站| 91麻豆国产自产在线观看| 欧美在线色视频| 欧美伦理电影网| 欧美一区二区三区免费观看视频 | 欧美精品一区二区久久久| 欧美一区二区在线看| 欧美成人一区二区三区在线观看 | 色综合天天综合网国产成人综合天| 成人免费毛片片v| 91视视频在线观看入口直接观看www| 91麻豆免费在线观看| 欧美日韩在线播放一区| 日韩三级av在线播放| 久久综合九色综合97婷婷 | 亚洲成年人影院| 国产网站一区二区三区| 欧美久久一区二区| 亚洲一区二三区| 久久精品一区二区三区四区| 国产日产欧美一区| 亚洲精品老司机| 青青草97国产精品免费观看无弹窗版| 蜜桃久久久久久| av亚洲精华国产精华精华| 欧洲在线/亚洲| 精品国产精品网麻豆系列 | 国产成人日日夜夜| 色综合久久中文字幕| 在线播放国产精品二区一二区四区| 欧美成人综合网站| 亚洲色图第一区| 日韩国产在线观看一区| 国产91精品在线观看| 欧美日韩在线综合| 国产日韩欧美电影| 亚洲一区二区三区在线播放| 精品国产乱码91久久久久久网站| 国产成人在线色| 欧美性猛片aaaaaaa做受| 日韩精品在线一区二区| 国产精品看片你懂得| 三级在线观看一区二区| 国产69精品久久777的优势| 欧美理论片在线| 自拍偷拍欧美激情| 午夜精品一区二区三区电影天堂| 国产一区二区视频在线| 欧美日韩一区二区三区不卡| 久久精品人人爽人人爽| 日日骚欧美日韩| 色哟哟一区二区在线观看| 久久久亚洲精品一区二区三区 | 亚洲三级小视频| 首页欧美精品中文字幕| 成人免费三级在线| 精品久久国产字幕高潮| 亚洲成a人在线观看| 97超碰欧美中文字幕| 久久久久久久久久久黄色| 日韩电影在线看| 欧美午夜视频网站| 中文字幕电影一区| 日韩高清电影一区| 91麻豆精东视频| 国产精品美女一区二区三区| 久88久久88久久久| 欧美日韩国产在线观看| 亚洲三级在线看| 不卡av电影在线播放| 国产亚洲婷婷免费| 韩国理伦片一区二区三区在线播放| 777午夜精品免费视频| 亚洲麻豆国产自偷在线| www.亚洲免费av| 久久久一区二区| 九色综合狠狠综合久久| 欧美va亚洲va在线观看蝴蝶网| 亚洲一区二区三区四区中文字幕| 99久久精品久久久久久清纯| 在线不卡中文字幕| 成人av影视在线观看| 亚洲一区二区三区免费视频| 风间由美中文字幕在线看视频国产欧美| 欧美电影在线免费观看| 亚洲第一福利一区| 欧美日韩国产综合一区二区三区| 亚洲一区国产视频| 欧美性大战久久久| 天天影视涩香欲综合网| 91精品国产综合久久小美女| 日韩精品午夜视频| 日韩欧美色综合| 国产又粗又猛又爽又黄91精品| 久久午夜电影网| 成人伦理片在线| 国产精品乱人伦中文| 99精品视频一区| 夜夜揉揉日日人人青青一国产精品 | 国产欧美日韩卡一| 成人伦理片在线| 亚洲男人的天堂在线aⅴ视频 | 久久99久久99| 国产午夜亚洲精品理论片色戒| 成人国产精品免费观看视频| 亚洲欧美怡红院| 欧美日韩精品一区二区在线播放| 亚洲精品中文在线影院| 国产乱码精品一区二区三区忘忧草| 午夜免费欧美电影| 精品国产乱码久久| 色综合天天狠狠|