微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机与单片机通过CH375实现USB之间连接

单片机与单片机通过CH375实现USB之间连接

时间:11-24 来源:互联网 点击:

USB的对象,有主从之分,这样才能在开始时,两个设备之间的握手可以由主设备打破;但是对于CH375,它的主从的配置是完全不同的。通道可以由主机在设置令牌时去做。一般主机配置端口2,它在设置为主机模式时候,有专有的主机通道,即它有两种通道;如果没有配置,默认发送的端口是端点0。而主机发送信息时候,在发送次数为第"奇"次与第“偶”次发送的配置是不同的,这需要在发送的时候不停的修改。

发送信息的过程:首先设置为发送的模式,可以是5也可以是6(两种都是配置主机模式),一般为6。接着将发送的信息配置完后,写到对应的端点,这里为端点2;接着对对应的端点的通道写发送的模式(奇?偶);剩下的发送令牌,根据令牌CH375将数据左对应的操作;

头文件1//是CH375的专属相关命令

#ifndef CH375_H
#defineCMD_GET_STATUS0x22// 获取中断状态并取消中断请求 ,通过它可以得到中断信息,即什么中断;
#defineCMD_SET_USB_MODE0x15// 设置USB工作模式 ,设置usb是那种工作模式,是主机的那种,还是从机的那种;
#defineCMD_RET_SUCCESS0x51
#defineCMD_SET_ENDP60x1C
#defineCMD_SET_ENDP70x1D
#defineCMD_RD_USB_DATA0x28
#defineCMD_WR_USB_DATA70x2B
#defineCMD_ISSUE_TOKEN0x4F
#defineCMD_CLR_STALL0x41
#defineUSB_INT_SUCCESS0x14
#defineUSB_INT_CONNECT0x15
#defineDEMO_CXP_CMD0x56//命令字
#defineCMD_CHECK_EXIST0x06
#defineCMD_RESET_ALL0x05
#defineUSB_INT_EP2_IN0x0A
#defineCMD_UNLOCK_USB0x23
#endif

#ifndef BIANLIAN_H
sbit CH375_INT_WIRE = P3^2;//INT0
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xFDff;
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xFCff;
unsigned char endp6_mode,endp7_mode;//两种模式变量,用来奇偶替换;来对应奇偶次传送数据时,改变对应的配置奇偶模式
unsigned char key;//为主程序记录那个键按下
sbit KEYPIN1 = P2^2;
sbit KEYPIN2 = P2^3;
sbit KEYPIN3 = P2^4;
sbit KEYPIN4 = P2^5;
sbit KEYPIN5 = P2^6;
sbit KEYPIN6 = P2^7;

typedefstruct_COMMAND_PACKET
{
unsigned charmCommandCode;
unsigned charmCommandCodeNot;
union
{
unsigned charmParameter[5];
struct
{
unsigned charmBufferID;
unsigned intmBufferAddr;
unsigned intmLength;
} buf;
} u;
}mCOMMAND_PACKET,*mpCOMMAND_PACKET;
mCOMMAND_PACKET cmd_cui;
sbit CH375RS = P3^4;
bitFLAG_INT_WAIT;
#endif

#ifndef CUI_H

//两微妙的延时;为了给指令的书写一个缓冲过度时间;谁叫咋东西破了

voidDelay2us( )
{
unsigned char i;
#define DELAY_START_VALUE1
for ( i=DELAY_START_VALUE; i!=0; i-- );
}
void Delay_ms(unsigned char ms) //延时ms
{
unsigned char i;
unsigned char us;
for(i=0; i {
us=100;
while(us--);
}
}
//查当前中断状态,由他来查看当前是什么中断,到底有没有中断
unsigned char wait_complete()
{
while(CH375_INT_WIRE);//这里采用的中断零,故接P3^2;
CH375_CMD_PORT = CMD_GET_STATUS;//中断状态控制字;
Delay2us( );
return CH375_DAT_PORT;
}
//设置usb的工作模式;奇次|偶次
void set_usb_mode(unsigned char mode)
{
CH375_CMD_PORT = CMD_SET_USB_MODE;//命令字模式设置;
Delay2us( );
CH375_DAT_PORT = mode;//什么模式?如果做主机,就是5|6模式两种均可(前提两边都有CH375),如果是从机,模式为2(根据主机要

//求)
endp6_mode = endp7_mode = 0x80;//初始没有发送数据的时候,这个奇偶标志的玩意的状态为奇状态,放在这里相当于延时
while(CH375_DAT_PORT != CMD_RET_SUCCESS);//确认模式设置成功
}

/设置DAT0的奇偶模式,由于CH375在数据发送时,分奇偶的,所以要配对奇偶对应的模式,这里是配置的是通道DAT0/
void set_endp6()
{
CH375_CMD_PORT = CMD_SET_ENDP6;//选通道DAT0
Delay2us( );
CH375_DAT_PORT = endp6_mode;//初始状态为奇0x80;偶为0xC0
endp6_mode ^=0x40;//^=是异或的意思,恰好0x80异或0x40是0xC0,而0xC0以后0x40是0x80;这样每次发送后,这个是变到对应的模式的
Delay2us( );
}

//同上,只是配置的DAT1
void set_endp7()
{
CH375_CMD_PORT = CMD_SET_ENDP7;
Delay2us( );
CH375_DAT_PORT = endp7_mode;
endp7_mode ^=0x40;//;
Delay2us( );
}

//这里是读 usb缓存的数据

unsigned char rd_usb_data(unsigned char *buf)
{
unsigned char i,len;
CH375_CMD_PORT = CMD_RD_USB_DATA;//读当前中断状态下对应的端点,ch375有3种端点,而CMD_RD_USB_DATA,是那个端点的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top