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

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

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

//收数据缓存来了数据,响应了对应的中断,就读谁。。。即读产生响应的谁谁谁
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");
}

}

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

网站地图

Top