您的位置 首页 产品

单片机与单片机经过CH375完成USB之间衔接

USB的对象,有主从之分,这样才能在开始时,两个设备之间的握手可以由主设备打破;但是对于CH375,它的主从的配置是完全不同的。通道可以由

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,是那个端点的
//收数据缓存来了数据,呼应了对应的中止,就读谁。。。即读发生呼应的谁谁谁
Delay2us( );
len = CH375_DAT_PORT;//一般榜首个数据是长短,即后边发的数据有多大(几个字节,一次最大只能64个)
Delay2us( );
for (i=0;i!=len;i++)
*buf++ = CH375_DAT_PORT;//读啊读,读len个8位数据
return(len);
}
//上面读,下面便是写了
void wr_usb_data(unsigned char len,unsigned char*buf )
{
CH375_CMD_PORT = CMD_WR_USB_DATA7;//写指令
Delay2us( );
CH375_DAT_PORT = len;//自我约好榜首个数是要发送数据的巨细,当然也能够贱点,设置自己的描绘后边数据符号
while(len–)CH375_DAT_PORT = *buf++;
}
unsigned char issue_token(unsigned char endp_and_pid)
{
CH375_CMD_PORT = CMD_ISSUE_TOKEN;//这个了便是发送的令牌的指令了,令牌了,其实也是一种装备,装备你选用什么端口(一般
//为2),是输入仍是输出,当然,这是对主机而言的,他有资历发送令牌,
Delay2us( );
CH375_DAT_PORT = endp_and_pid;//这儿装备的是端口和输入或输出的方法,高四位是端点号,低四位了,便是输入仍是输出
return (wait_complete());//等候装备成功
}
//这儿是当发送过错的时分,要将对应的端口经行清洗下;去掉本来的过错数据,为下次承受提供条件
unsigned char ERROR(unsigned char err)
{
CH375_CMD_PORT = CMD_CLR_STALL ;要清楚那个端点的指令;
Delay2us( );
CH375_DAT_PORT = err;//那个端点
return(wait_complete());
}
//左主机时分发送
void host_send(unsigned char len,unsigned char *buf)
{
wr_usb_data(len,buf);//先向对应的端点的缓存中写数据,这儿选用的是端点2
set_endp7();//对端点DAT1奇偶装备一下,也为下次左预备
if(issue_token(0x21) !=USB_INT_SUCCESS)ERROR(0x02);//这儿的令牌是端点2,低位的1是输出方式
else if(buf == NULL) printf(“0k”);
}
//这个是主机承受了
unsigned char host_recv(unsigned char *buf)
{
set_endp6();//端点2的DAT0奇偶装备一下,为下次作预备
if(issue_token(0x29) != USB_INT_SUCCESS)ERROR(0x82);//这儿令牌是端点2,低位9为输入方式
return (rd_usb_data(buf));//读啊,读
}
unsigned char GetKeyCode(void)//这个是按键,对应指令
{
if(KEYPIN1==0) return 1;//对应从机的灯翻开;
if(KEYPIN2==0) return 2;//对应的从机灯全关
if(KEYPIN3==0) return 3;
if(KEYPIN4==0) return 4;
if(KEYPIN5==0) return 5;
if(KEYPIN6==0) return 6;
return 0;
}
#endif
#include
#include
#include “ch375.h”
#include”bianlian.h”
#include “cui.h”
void init_uart()//uart init串口的装备,为了下载和终端上面检测用的
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xfd;
TR1 = 1;
TI = 1;
}
void init_rst() //rst//初始时,复位下
{
CH375RS = 1;
Delay_ms(100);
CH375RS = 0;
Delay_ms(200);
}
void CH375_Init( )//初始化,首要检测单片机与CH375的硬件并口是否连通
{
unsigned char i;
CH375_CMD_PORT = CMD_CHECK_EXIST;
Delay2us( );
CH375_DAT_PORT = 0x55;
Delay2us( );
i = ~ 0x55;
if ( CH375_DAT_PORT != i )
{
for ( i=80; i!=0; i– )
{
CH375_CMD_PORT = CMD_RESET_ALL;
Delay2us( );
}
CH375_CMD_PORT = 0;
Delay_ms(50);
}
set_usb_mode(6);
//开中止,低电平有用
IT0 = 0;
IE0 = 0;
EX0 = 1;
}
int main()
{
unsigned char *buf;
init_uart();
init_rst();
CH375_Init( );
while(wait_complete() != USB_INT_CONNECT);//检查usb有刺进设备
printf(“lianjie”);
while(1){

key = GetKeyCode();//获取按键
switch(key){
case 1://0x9我整的是从机灯亮
cmd_cui.mCommandCode = DEMO_CXP_CMD;//装备一个指令字给从机,来完结想要的操控
cmd_cui.mCommandCodeNot = ~(DEMO_CXP_CMD);//跟上面数据相反,用来校验
cmd_cui.u.mParameter[1] = 0x8;//操控的方式
cmd_cui.u.mParameter[2] = 0x9;//操控方式,这两个数据依据自己需求,当然整个变量野能够自己修正,东西是死的,人是活的;
//printf(“1lallais %c”,cmd_cui.u.mParameter[1]) ;
buf = (unsigned char *)(&cmd_cui);//将上面数据以字节8位的方式发送出去,先取它的首地址,然后一个个字节发送
printf(“cmd_cui is %c”,buf[3]);//因为从机要用到此发送的指令信息,在这儿能够在终端上面显现,是否数据正确
host_send(7,buf);
//host_send(0,NULL);
break;
case 2://0x8整的是从机灯灭
cmd_cui.mCommandCode = DEMO_CXP_CMD;
cmd_cui.mCommandCodeNot = ~(DEMO_CXP_CMD);
cmd_cui.u.mParameter[1] = 0x9;
cmd_cui.u.mParameter[2] = 0x8;
//printf(“1lallais %c”,cmd_cui.u.mParameter[1]) ;
buf = (unsigned char *)(&cmd_cui);
printf(“cmd_cui is %c”,buf[3]);
host_send(7,buf);
break;
default:
//printf(“err”);
break;

}
key = 0;
// printf(“ririri”);
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/260045.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部