基于51单片机372的USB通信代码
扫描二维码
随时随地手机看文章
#include
#include "INTRINS.h"
#define OP_CMD1// 命令操作码
#define OP_DATA0// 数据操作码
#define DELAY_TIMES8// 延时2微秒
#define DELAY_CNT_NUMS2*DELAY_TIMES// 延时2微秒所需的时钟周期数(对于22.1184MHz晶振,每个微秒包含22.1184个时钟周期)
//#define MY_USB_VENDOR_ID0x4348// USB设备制造商标识
//#define MY_USB_PRODUCT_ID0x5537// USB设备产品标识
//sbitUSB_CS=P1^3;//cs接地内部晶振24.5M 倍频49M
sbitUSB_INT=P0^0;
sbitUSB_A0=P1^4;
sbitUSB_WR=P1^6;
sbitUSB_RD=P1^5;
//sfrUSB_DATA=0x84;
#define get_usb P2
#define set_usb(dat1) P2=dat1
//#define set_usb(dat1) P2|=(dat1>>1);P17=((dat1 & 0x01)==1)
#define delay_ns _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
constUINT8CMyDevDescr[] = { 0x12, 0x01, 0x10, 0x01,
0xFF, 0x80, 0x37, 0x08,
0x48, 0x43, 0x37, 0x55,// 厂商ID和产品ID
0x00, 0x01, 0x01, 0x02,
0x00, 0x01 };
// 配置描述符
constUINT8CMyCfgDescr[] = { 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32,
0x09, 0x04, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x37, 0x00,
0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00,
0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
0x07, 0x05, 0x81, 0x03, 0x08, 0x00, 0x00 };
// 语言描述符
constUINT8CMyLangDescr[] = { 0x04, 0x03, 0x09, 0x04 };
// 厂家信息
constUINT8CMyManuInfo[] = { 0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0 };
// 产品信息
constUINT8CMyProdInfo[] = { 0x0C, 0x03, 'C', 0, 'H', 0, '3', 0, '7', 0, '4', 0 };
UINT8UsbConfig = 0;
void Delay2us( )
{
INT8U i;
i = (INT8U)DELAY_CNT_NUMS;
while (--i);
}
voidmDelaymS( INT8U ms )
{
INT8U j;
while ( ms -- ) {
j=250;
do
{
Delay2us();
Delay2us();
//Delay2us();
//Delay2us();
}
while ( j -- );
}
}
void CH375_WR_CMD_PORT(INT8U dat)
{
USB_WR = 1;
USB_RD = 1;
set_usb(dat);
delay_ns;
USB_A0 = OP_CMD;
// 准备写命令
_nop_();
//USB_CS = 0;
USB_WR = 0;
USB_WR = 0;
USB_WR = 0;
USB_WR = 0;
USB_WR = 1;
//USB_CS = 1;// 结束写命令(USB_WR信号的有效时间不能超过10us)
USB_A0 = 0;
P2=0xff;
//P2|=0x7f;
//P1|=0x80;
}
void CH375_WR_DAT_PORT(INT8U dat)
{
USB_WR = 1;
USB_RD = 1;
set_usb(dat);
delay_ns;
USB_A0 = OP_DATA;// 准备写数据
_nop_();
//USB_CS = 0;
USB_WR = 0;
USB_WR = 0;// 开始写数据
USB_WR = 0;
USB_WR = 0;
USB_WR = 1;// 结束写命令(USB_WR信号的有效时间不能超过10us)
//USB_CS = 1;
USB_A0 = 0;
P2=0xff;
//P2|=0x7f;
//P1|=0x80;
}
INT8U CH375_RD_DAT_PORT(void)
{
INT8U nData;
USB_WR= 1;
USB_RD= 1;
delay_ns;
//delay_ns;// 将USB_DATA(P4口)配置为数字输入
USB_A0 = OP_DATA;
//USB_CS = 0;// 准备读数据
_nop_();
USB_RD = 0;
USB_RD = 0;
USB_RD = 0;
nData = get_usb;
USB_RD = 1;// 结束读命令(USB_RD信号的有效时间不能超过10us)
//USB_CS = 1;
USB_A0 = 0;
return nData;// 返回读取的数据
}
INT8URead374Byte(INT8U mAddr )
{
CH375_WR_CMD_PORT( mAddr );
return( CH375_RD_DAT_PORT());
}
voidWrite374Byte( INT8U mAddr, INT8U mData )
{
CH375_WR_CMD_PORT( mAddr );
CH375_WR_DAT_PORT( mData );
}
voidRead374Block( INT8U mAddr, INT8U mLen, INT8U * mBuf )
{
CH375_WR_CMD_PORT( mAddr );
while ( mLen -- ) *mBuf++ = CH375_RD_DAT_PORT( );
}
voidWrite374Block( INT8U mAddr, INT8U mLen, INT8U * mBuf )
{
INT8U dat,k;
k=0;
CH375_WR_CMD_PORT( mAddr );
while ( mLen -- )
{
dat=*mBuf++;
//dat= up[k++];
CH375_WR_DAT_PORT(dat);
}
}