标签:
USB 单片机 固件
USB的程序真是浩大,不过还好不用自己写了,花下时间读下来就行了,我从主函数main()读起,不懂的就查前
面的函数和定义,为这个伟大的工程努力,不过还好自己买了周立功的书,书上有中文注释,我尽量打上去,不
过圈圈写的程序和书上有些不同,也要自己慢慢找,希望我贴出来的程序对大家有帮助,欢迎指正.
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;
}
/* if (bEPPflags.bits.suspend)
{
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
if(D12SUSPD == 1)
{
D12SUSPD = 0;
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
D12SUSPD = 1;
PCON |= 0x02;
while (1);
}
} // if suspend change*/
if (bEPPflags.bits.setup_packet)
{
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;
}
系统分类:
单片机 | 用户分类:
USB接口技术 | 来源:
原创 | 【推荐给朋友】 | 【添加到收藏夹】