外部接口找到了CH372/CH375,我想连接是没问题的。 不好意思,在在线下载里找不到CH372DUG,请问在哪里可以找到?是一个调试软件吗?
谢谢,我用CH372搜索就找到了。
我刚才试了发1个数据,貌似能正常接收,我想多数据发送时,请问要数据间是怎么隔开的?此外,CH372DBG是不是都是按16进制数据发送?在线等,谢谢。
这种问题你做一下实验就可以了.数据不要分开,空格为0x20.
呵呵,谢谢,实验结果貌似是都按2位的16进制数传输的。
单片机接收数据没问题了,可是上传数据没有任何反应,麻烦各位帮忙看看。 void main(void) { unsigned char i; IE = 0x84; IT1 = 1; EX1 = 1; Delay_mS(500); Delay12uS(); CH375_Device_Init(); CH375_WR_CMD(CMD_WR_USB_DATA7); USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } while(1) { if (B_USB_Ready) { B_USB_Ready = FALSE; CH375_WR_CMD(CMD_GET_STATUS); CH375_Status = CH375_RD_DAT(); if(CH375_Status == USB_INT_EP2_OUT) { CH375_WR_CMD(CMD_RD_USB_DATA); USB_Count = CH375_RD_DAT(); if(USB_Count == 0) { CH375_WR_CMD( CMD_SET_ENDP7 ); /* 设置USB端点2的IN,也就是批量上传端点 */ CH375_WR_DAT( 0x0E ); /* 同步触发位不变,设置USB端点2的IN正忙,返回NAK,实际是清除上传缓冲区的已有内容 */ } for (i = 0; i < USB_Count; i++) { USB_dat[i] = CH375_RD_DAT(); } } if(CH375_Status == USB_INT_EP2_IN) { CH375_WR_CMD(CMD_UNLOCK_USB); } Delay(); } } }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay(void) //短延时 { ; }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay12uS(void) //12us延时 { uchar i; for(i = 0; i < C_DelayTime12uS; i++) { ; } }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay_mS(uint n) //1ms延时 { uint t; uint h; for(h = 0; h < n; h++) { for(t = 0; t < C_DelayTime1mS; t++) { ; } } }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_WR_CMD(uchar cmd) //向CH375的命令端口写入命令 { Delay(); CH375_CMD_PORT = cmd; Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_WR_DAT(uchar dat) //向CH375的数据端口写入数据 { CH375_DAT_PORT = dat; Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
uchar CH375_RD_DAT(void) { Delay(); return(CH375_DAT_PORT); }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_Device_Init(void) //CH375设备方式初始化 { uchar i,j; i = 0; j = 0; CH375_WR_CMD(CMD_RESET_ALL); Delay_mS(1); CH375_WR_CMD(CMD_SET_USB_MODE); CH375_WR_DAT(0x02); //设置为使用内置固件的USB设备方式 while(i != CMD_RET_SUCCESS && j < 200) { i = CH375_RD_DAT(); j++; } Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
static void Interrupt2_serve(void) interrupt 2 { B_USB_Ready = TRUE; }
//+++++++++++++++++++++++++++++++++++++++++++++
在这个函数之后需要加上这一段数据之后在进行写数据就可以了: CH375_Device_Init(); while(1){ /*用来确定主机是否准备好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } 后面在加上你自己的上传数据函数就可以了。
谢谢,我去看看对应的指令作用。 看着例程搬过来的,有很多指令多不清楚。谢谢你的回复,我继续调试。
我收到的返回数据是0x04,请问我0x0a在CH372DS2的描述是说外部固件,对于GET_TOGGLE是让CH375与PC同步吗?
你只需要按照上面程序来做就可以了,这个命令是为了确保计算机把CH372初始化完成,而不是你想象的那样。
Delay_mS(500); Delay12uS(); CH375_Device_Init(); CH375_WR_CMD(0x0a);//GET_TOGGLE命令 CH375_WR_DAT(0x20); i = CH375_RD_DAT(); if((i&0x20)==0x20) { CH375_WR_CMD(CMD_WR_USB_DATA7); USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } }
真是抱歉,我是这样改的,可是返回值是0x04.
while(1){ /*用来确定主机是否准备好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } 你用if可以吗?上面是等待,你这个条件判断一次通不过就往下走了.好好考虑一下代码为什么这样,写代码不是简单的移植和修改.
呵呵,不好意思,我之前理解有误,我以为hcn跟我说的是在if后面加发送数据的程序,而没想到是在while(1)循环结束之后。经你这么一说,我知道了。 我之前用了不少时间在研究海量存储的基础知识,现在老板要求这周要出项目的雏形,所以没有仔细的去研究网站上的例程,问了很多“简单”的问题,实在抱歉。
我循环等待之后读到了返回值0x24。 然后在while循环后嵌入发送数据,PC还是接受不到上传数据;但单片机能接收到PC下传的数据。 USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_CMD(CMD_WR_USB_DATA7); CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } 请指教。
谢谢各位,已经解决了,上传数据原来是手动获取的。 这段时间这是谢谢各位的帮忙,接下来要开始实践U盘读写文件了。