?? main.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: main.c
** 最后修改日期: 2004年11月15日
** 描 述: 用戶應(yīng)用程序
** 版 本: V5.0
**********************************************************************************************************/
#include <reg52.h>
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#include "string.h"
/***********************************************************
主函數(shù) Main Function
************************************************************/
#define CMD_RECEIVE 0x01 /* 接收命令 */
#define CMD_TRANSMIT 0x02 /* 發(fā)送命令 */
#define CMD_STOP 0x03 /* 停止命令 */
#define BUFFER_IN_XDATA /* 定義數(shù)據(jù)緩沖區(qū)在外部ram */
#ifdef BUFFER_IN_XDATA
INT8U xdata RecBuf[1024]; /* 緩沖區(qū) */
#endif
#ifdef BUFFER_IN_IDATA
INT8U idata RecBuf[128]; /* 緩沖區(qū) */
#endif
INT8U idata EP2_tx; /* 端點(diǎn)2發(fā)送中斷標(biāo)志 */
INT8U idata Rcv128Bytes; /* 端點(diǎn)收到128字節(jié)標(biāo)志位 */
INT8U idata TxEnable; /* 發(fā)送使能 */
INT8U ack; /* 應(yīng)答 */
INT8U command,i,k;
INT8U num_Of_64len; /* 長度為64字節(jié)的包數(shù) */
INT8U num_of_less64len; /* 長度小于64字節(jié)的包長度 */
INT16 offset; /* 偏移量 */
extern INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf);
void CmdServe(void);
void RxServe(void);
void TxServe(void);
sfr AUXR = 0x8E; /* 只用于TKS668 仿真器 */
sbit led0 = P1^2;
sbit led1 = P1^3;
/****************************************************************************
** 函數(shù)名稱: void Init_Interrupt(void)
** 功能描述: 初始化MCU相關(guān)中斷
*****************************************************************************/
void Init_Interrupt(void)
{
EX0 = 1; /* 開外部中斷0 */
PX0 = 0; /* 設(shè)置外部中斷0中斷優(yōu)先級 */
EA = 1; /* 開80C51總中斷 */
AUXR = 0; /* 使能668芯片內(nèi)部xdata */
}
/****************************************************************************
** 函數(shù)名稱: main()
** 功能描述: 主函數(shù)
*****************************************************************************/
main()
{
if (Init_D12()!=0) /* 初始化D12 */
return; /* 如果初始化不成功,返回 */
Init_Interrupt(); /* 初始化D12以后,才能使能相關(guān)中斷 */
/* user code */
TxEnable = 1;
while(1)
{
usbserve(); /* 處理USB事件 */
if (bEPPflags.bits.ep1_rxdone == 1) /* 端點(diǎn)一接收到命令處理*/
{
DISABLE();
CmdServe();
bEPPflags.bits.ep1_rxdone = 0; /* 清空端點(diǎn)2收到數(shù)據(jù)標(biāo)志 */
ENABLE();
}
if (bEPPflags.bits.ep2_rxdone == 1)
{
DISABLE(); /* 從端點(diǎn)2收到數(shù)據(jù) */
RxServe(); /* 數(shù)據(jù)處理 */
bEPPflags.bits.ep2_rxdone = 0; /* 清空端點(diǎn)2收到數(shù)據(jù)標(biāo)志 */
ENABLE();
}
if ((EP2_tx == 1)&&TxEnable)
{
DISABLE(); /* 從端點(diǎn)2發(fā)送數(shù)據(jù) */
EP2_tx = 0; /* 清空端點(diǎn)2發(fā)送數(shù)據(jù)標(biāo)志 */
TxServe(); /* 數(shù)據(jù)處理 */
ENABLE();
}
/* Add your code here */
}
}
/****************************************************************************
** 函數(shù)名稱: void CmdServe(void)
** 功能描述: 執(zhí)行上位機(jī)命令
*****************************************************************************/
void CmdServe(void)
{
INT16U len;
command = GenEpBuf[0]; // 命令字
if(command == CMD_STOP)
{
offset = 0;
num_Of_64len = 0;
num_of_less64len = 0;
return;
}
else
{
offset = (INT16U)(GenEpBuf[1] << 8) + GenEpBuf[2]; // 接收/發(fā)送 緩沖區(qū)地址
len =(INT16U)(GenEpBuf[3] << 8) + GenEpBuf[4];
num_Of_64len = len / EP2_RX_FIFO_SIZE; // 計(jì)算64字節(jié)整數(shù)包數(shù)目
num_of_less64len = len % EP2_RX_FIFO_SIZE; // 計(jì)算剩余字節(jié)數(shù)
if ((command == CMD_TRANSMIT)&&TxEnable) // 填充FIFO
TxServe();
}
}
/****************************************************************************
** 函數(shù)名稱: void TxServe(void)
** 功能描述: 發(fā)送數(shù)據(jù)到PC機(jī)
*****************************************************************************/
void TxServe(void)
{
if(command == CMD_TRANSMIT)
{
if(num_Of_64len!=0) // 發(fā)送64字節(jié)的整數(shù)包
{
DISABLE();
D12_WriteEndpoint(5,EP2_TX_FIFO_SIZE,RecBuf + offset); // 寫發(fā)送緩沖區(qū)
ENABLE();
offset += EP2_TX_FIFO_SIZE;
num_Of_64len --;
}
else if(num_of_less64len!=0)
{
DISABLE();
D12_WriteEndpoint(5,num_of_less64len,RecBuf + offset);
ENABLE();
num_of_less64len = 0;
}
}
}
/****************************************************************************
** 函數(shù)名稱: void RxServe(void)
** 功能描述: 指示接收狀態(tài),發(fā)送應(yīng)答字。
*****************************************************************************/
void RxServe(void)
{
if(command == CMD_RECEIVE)
{
if (Rcv128Bytes == 1) // 如果雙緩沖區(qū)中收到數(shù)據(jù)
led0 = 0;
else // 只有一個(gè)緩沖區(qū)中收到數(shù)據(jù)
led1 ^= 1;
if ((num_Of_64len==0)&&(num_of_less64len==0))
{
ack = 0x01;
DISABLE();
D12_WriteEndpoint(3,1,&ack); // 應(yīng)答PC機(jī):我已收到你發(fā)來的數(shù)據(jù)!
ENABLE();
offset = 0;
led0 = 1;
led1 = 1;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -