我单片机的程序是用TEST的程序修改的,测试和模式设置都能成功,电脑也能正常识别。 单片机运行TEST.C,上位机用DEBUG372的时候,使用端点2下传数据长度 1,数据 aa,我点击一次下传,端点2根本不上传数据,点击下传只要超过2次,无论多少次端点2的返回值都是只有FE 55,请问前面那个FE是什么意思?为什么我要至少要点击两次才行呢? 虚心求教!
1、我们例程里是收到收据后,立即取反回传,这个流程不能改 2、下传的输入框中的数据是连续的,如:55AA,表示2个数据0x55,0xAA,数据之间不能有空格
流程??这个我好像没有改 我加了空格了,再试一下,谢谢SCM!
请问SCM:如果输入55AA的话,端点2应该返回什么值呢?我的是FD AA ,这个FD有时什么意思?谢谢
我多试了几次,发现有少数几次是返回AA 55 的,是我的时序不对,还是什么问题?TEST.C中的程序我几乎没有怎么改动
我运行TEST\WIN中的TEST.EXE,显示的是这些东西,我看不太懂啊……请各位老师指点下! 还没有执行完,我就粘上来了…… CH372/CH375 Bulk Data Test Program V1.1 , Copyright (C) W.ch 2004.12 test data correctness *** Load DLL: CH375DLL.DLL *** CH375OpenDevice: 0# *** Step-1: test data correctness: 10000000 times, random length and data S1-T0-C0 return length error: 0 (41)00H,00H,00H... S1-T1-C1 return length error: 0 (64)FFH,FFH,FFH... S1-T2-C2 return length error: 0 (40)6CH,D6H,AEH... S1-T3-C3 return length error: 0 (50)36H,FDH,12H... S1-T0-C4 return length error: 0 (41)00H,00H,00H... S1-T1-C5 return length error: 0 (24)FFH,FFH,FFH... S1-T2-C6 return length error: 0 (13)EFH,57H,49H... S1-T3-C7 return length error: 0 (16)F7H,2BH,78H... S1-T0-C8 return length error: 0 (64)00H,00H,00H... S1-T1-C9 return length error: 0 (64)FFH,FFH,FFH... S1-T2-C10 return length error: 0 (64)3H,E5H,3CH... S1-T3-C11 return length error: 0 (64)2H,B5H,54H... S1-T0-C12 return length error: 0 (64)0H,00H,00H... S1-T1-C13 return length error: 0 (64)FH,FFH,FFH... Cnt= 14, Len=18, Data: 21H,F1H,6DH,0EH,E3H,6CH...
把完整的程序贴出来看看
我用的是44B0的板子,因为是个新手,从开始测试到现在数据传输测试一直出错,我都不知道该怎么说了…… 谢谢了! #include "44b.h" #include "44blib.h" #include "def.h" #include "CH375INC.H" #include "stdio.h"
void __irq CH375Interrupt(void);//函数声明,应在调用的文件中声明 void CH375_Interrupt(void); //函数声明,应在调用的文件中声明
#define DELAY_START_VALUE 2 //根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 #define TEST_CH375_FIRST 1 //是否进行CH372通信测试 1是 0否
void Delay1us() //延时1微秒,不精确,需要根据硬件实际情况调整 { #if DELAY_START_VALUE != 0 int i; for ( i=DELAY_START_VALUE; i!=0; i-- ); #endif }
/* void Delay2us() //延时2微秒,不精确,需要根据硬件实际情况调整 { int i; for ( i=DELAY_START_VALUE*2+1; i!=0; i-- ); } */
/** 与CH372/CH375有关的基本I/O操作 **/ void CH375_WR_CMD_PORT(U8 cmd) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay1us(); CH375_CMD_PORT=cmd; Delay1us(); //保证1.5us }
void CH375_WR_DAT_PORT(U8 dat) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; //Delay1us(); //保证0.6us }
U8 CH375_RD_DAT_PORT(void) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ //Delay1us(); //保证0.6us return(CH375_DAT_PORT); }
void CH375_Init(void) { int i,k; Delay(500); //50ms延时 //--------测试CH375与44B0物理连接是否正常及是否正常工作,可选操作,通常不需要------ #ifdef TEST_CH375_FIRST CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据,任意数据 for(i=3;i>0;i--){}; while (CH375_RD_DAT_PORT()!=0xaa) //CH375不正常 { //Uart_Printf("-"); Delay1us(); Delay1us(); CH375_WR_CMD_PORT(CMD_RESET_ALL); //测试CH375是否正常工作 Delay(400); //40ms延时 加了延时后4个循环出了while,可再修改 CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据,任意数据 for(i=3;i>0;i--){}; } CH375_WR_CMD_PORT(0); //防止数据出错 Delay(500); CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0xaa); //写入测试数据,任意数据 for(i=4;i>0;i--){}; while (CH375_RD_DAT_PORT()!=0x55) //CH375不正常 { //Uart_Printf("+"); Delay1us(); Delay1us(); CH375_WR_CMD_PORT(CMD_RESET_ALL); //测试CH375是否正常工作 Delay(400); //40ms延时 加了延时后4个循环出了while,可再修改 CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0xaa); //写入测试数据,任意数据 for(i=3;i>0;i--){}; } CH375_WR_CMD_PORT(0); //防止数据出错 Delay(500); #endif //------------------ CH372测试结束 ----------------------
//--------------------设置USB工作模式, 必要操作--------------- for(k=10;k>0;k--) { CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 20us内完成 Delay1us(); Delay1us(); for (i=10;i>0;i--) //等待操作成功,通常需要等待10uS-20uS { //int j; //Uart_Printf("%x**",CH375_RD_DAT_PORT()); //for(j=1;j!=0;j--){}; if (CH375_RD_DAT_PORT() == CMD_RET_SUCCESS) break; } if (i==0) { Uart_Printf("CH372芯片内部或者物理连接存在硬件错误!!\n"); } } //------------------ EINT2中断声明 ----------------------
pISR_EINT2=(unsigned)CH375Interrupt; //声明外部中断引脚2为CH372中断口
//--------------- 下面启用USB中断 【EINT2】------------------
rINTCON=5; //中断控制寄存器:0101 保留位|非向量模式|启动中断|停止快速中断 rINTMOD&=~BIT_EINT2; //ExINT2设置为中断模式 rINTMSK&=~(BIT_EINT2|BIT_GLOBAL); //ExINT2中断使能
} /*************** CH375中断服务程序 ***********************/ void __irq CH375Interrupt(void) { CH375_Interrupt(); rI_ISPC=BIT_EINT2; } void CH375_Interrupt(void) { unsigned char InterruptStatus; unsigned char i,length; unsigned char buf[64]; //unsigned char data buffer[64]; //unsigned char buf[8];//={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; CH375_WR_CMD_PORT(CMD_GET_STATUS); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT(); /* 获取中断状态 */ switch (InterruptStatus) /* 分析中断状态处理 */ { case USB_INT_EP2_OUT://批量端点下传成功,OUT成功 { CH375_WR_CMD_PORT(CMD_RD_USB_DATA); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length=CH375_RD_DAT_PORT(); /* 首先读取后续数据长度 */ Delay1us();/////////////// Delay1us();/////////////// for (i=0;i { buf[i]=CH375_RD_DAT_PORT(); /* 接收数据包 */ } CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ CH375_WR_DAT_PORT(length); /* 首先写入后续数据长度 */ Delay1us();/////////////// Delay1us();/////////////// for(i=0;i CH375_WR_DAT_PORT(~buf[i]);//数据取反后返回,由计算机应用程序测试数据是否正确_通过中断端点演示上传,一次上传的长度不能超过8字节,这些在你通过批量端点上传的时候是用不到的 Delay1us();/////////////// break; } case USB_INT_EP2_IN://批量数据发送成功 { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); /* 释放当前USB缓冲区 */ break; } case USB_INT_EP1_IN: { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT(CMD_UNLOCK_USB); /* 释放当前USB缓冲区 */ break; } }
} /* void sent_data(void) { U8 i; //for(i=0;i!=8;i++) //buf=i; CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);//如果是端点1上传的话,只要将CMD_WR_USB_DATA7改为CMD_WR_USB_DATA5就可以了 CH375_WR_DAT_PORT(8); for(i=0;i<8;i++) CH375_WR_DAT_PORT(buf[i]); } */
1、CH372的3个接口函数中的延时是有规定的:写命令后延时1.5uS,读写数据后延时0.6uS,把这部分延时调整好,误差不要太大。调用接口函数时就不要再额外增加延时了 2、执行CMD_RESET_ALL后必须延时40mS,按照现在的现象,不是这个问题,只是提醒一下
我再改改,谢谢!