📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2006-02-28
** Last Version: 1.0
** Descriptions: The main() function of D12 bulk transfer example
**
**------------------------------------------------------------------------------------------------------
** Created by: Zhaoyong
** Created date: 2006-02-28
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Zhoushuwu
** Modified date: 2006.5.18
** Version:
** Descriptions:
**
********************************************************************************************************/
/******================= modified by Zhou Shuwu ==================================***********/
//#include "config.h"
//#include "target.h"
#include "system.h"
#include "alt_types.h"
/******================= modified by Zhou Shuwu ==================================***********/
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#define CMD_RECEIVE 0x01 /* 接收命令 */
#define CMD_TRANSMIT 0x02 /* 发送命令 */
#define CMD_STOP 0x03 /* 停止命令 */
/******================= modified by Zhou Shuwu ==================================***********/
//#define BEEPCON 0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */
/******================= modified by Zhou Shuwu ==================================***********/
INT8U RecBuf[1024]; /* 缓冲区 */
INT8U volatile EP2_tx=0; /* 端点2发送中断标志 */
INT8U TxEnable=1; /* 发送使能 */
INT8U ack=0; /* 应答 */
INT8U command=0; /* 命令字 */
INT8U num_Of_64len=0; /* 长度为64字节的包数 */
INT8U num_of_less64len=0; /* 长度小于64字节的包长度 */
INT16U offset=0; /* 偏移量 */
extern INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf);
void CmdServe(void);
void RxServe(void);
void TxServe(void);
/****************************************************************************
** 函数名称: void Init_Interrupt(void)
** 功能描述: 初始化MCU相关中断
*****************************************************************************/
void Init_Interrupt(void)
{
/******================= modified by Zhou Shuwu ==================================***********/
/*
EXTMODE = 0x00; // 设置EINT3中断为电平触发模式
EXTPOLAR = 0x00;
*/
/* 打开EINT0中断(使用向量IRQ) */
/*
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl0 = (0x20|0x11); // ENT3通道分配到IRQ slot0
VICVectAddr0 = (INT32U)Usb_Exception;// 设置EINT3向量地址
CLR_INTD12(); // 清除EINT3中断标志
VICIntEnable = 1 << 17; // 使能EINT3中断
*/
UsbIntEnable();
UsbIRQInit();//注册中断服务程序
/******================= modified by Zhou Shuwu ==================================***********/
}
/****************************************************************************
** 函数名称: main()
** 功能描述: 主函数
*****************************************************************************/
int main(void)
{
/* user initial codes */
TxEnable = 1;
/* user codes end */
if (Init_D12() !=0) /* 初始化D12 */
return -1; /* 如果初始化不成功,返回 */
Init_Interrupt(); /* 初始化D12以后,才能使能相关中断 */
while(1)
{
usbserve(); /* 处理USB事件 */
if (bEPPflags.bits.ep1_rxdone == 1) /* 端点一接收到命令处理*/
{
DISABLE();
CmdServe();
bEPPflags.bits.ep1_rxdone = 0; /* 清空端点2收到数据标志 */
ENABLE();
}
if (bEPPflags.bits.ep2_rxdone == 1)
{
DISABLE(); /* 从端点2收到数据 */
RxServe(); /* 数据处理 */
bEPPflags.bits.ep2_rxdone = 0; /* 清空端点2收到数据标志 */
ENABLE();
}
if ((EP2_tx == 1)&&TxEnable)
{
DISABLE(); /* 从端点2发送数据 */
EP2_tx = 0; /* 清端点2发送数据标志 */
TxServe(); /* 数据处理 */
ENABLE();
}
}
return 0;
}
/****************************************************************************
** 函数名称: void CmdServe(void)
** 功能描述: 执行上位机命令
*****************************************************************************/
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]; // 接收/发送 缓冲区地址
len =(INT16U)(GenEpBuf[3] << 8) + GenEpBuf[4];
num_Of_64len = len / EP2_RX_FIFO_SIZE; // 计算64字节整数包数目
num_of_less64len = len % EP2_RX_FIFO_SIZE; // 计算剩余字节数
if ((command == CMD_TRANSMIT)&&TxEnable) // 填充FIFO
TxServe();
}
}
/****************************************************************************
** 函数名称: void TxServe(void)
** 功能描述: 发送数据到PC机
*****************************************************************************/
void TxServe(void)
{
if(command == CMD_TRANSMIT)
{
if(num_Of_64len!=0) // 发送64字节的整数包
{
D12_WriteEndpoint(5,EP2_TX_FIFO_SIZE,RecBuf + offset); // 写发送缓冲区
offset += EP2_TX_FIFO_SIZE;
num_Of_64len --;
}
else if(num_of_less64len!=0)
{
D12_WriteEndpoint(5,num_of_less64len,RecBuf + offset);
num_of_less64len = 0;
}
}
}
/****************************************************************************
** 函数名称: void RxServe(void)
** 功能描述: 指示接收状态,发送应答字。
*****************************************************************************/
void RxServe(void)
{
if(command == CMD_RECEIVE)
{
if ((num_Of_64len==0)&&(num_of_less64len==0))
{
ack = 0x01;
D12_WriteEndpoint(3,1,&ack); // 应答PC机:我已收到你发来的数据!
offset = 0;
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -