CH375 作为设备,向计算机发送数据,并口,出现问题。

我采用并口控制CH375,能够正常的配置完成,使用DEBUG372.EXE测试,DEBUG372.EXE老是卡死,能够找到硬件。 附代码: /****************************************************/ //函数描述: 短延迟 //写入参数: Delaynum,延迟时间:不详 //返回参数: 无 //描述: 延时 /****************************************************/ void SDelay(unsigned int DelayNum) { while(DelayNum--); } /****************************************************/ //函数描述:CH375处于无效状态 //写入参数:无 //返回参数:无 //描述: 读、写无效 /****************************************************/ void CH375Disable() { //add EALLOW; //运行写EALLOW保护寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位设置为输出(1为输出,0为输入) EDIS;

CH375_CS=0; CH375_Read=1; CH375_Write=1; CH375_A0=0; } /****************************************************/ //函数描述:CH375初始化 //写入参数:无 //返回参数:无 //描述: 初始化顺序:硬件复位,自测试(循环),写模式,开中断 /****************************************************/ void CH375Ini() { unsigned char i; CH375Disable(); //CH375无效 CH375_WriteCmd(CMD_RESET_ALL) ; //写入复位命令 for(i=0;i<150;i++) { SDelay(4500); //延时>30MS } while(!CH375SelfTest()) //测试CH375 { } CH375Write_Mode(USBDevice); //设置USB驱动模式,为设备模式(0x02)

} /****************************************************/ //函数描述:CH375自动检测 //写入参数:无 //返回参数:无 //描述: // 测试数据: 0XAA, // 返回数值:0 自测试失败 // 1 自测试成功 /****************************************************/ unsigned char CH375SelfTest() { unsigned char DataTest; CH375_WriteCmd(CMD_CHECK_EXIST); //写入测试命令 SDelay(200); //延时 CH375_WriteData(0xAA); //写入测试数据 DataTest=CH375_ReadData(); //读出测试返回数据 if(DataTest == 0x55) //判断测试返回数据, { return 1; } else { return 0; } } /****************************************************/ //函数描述:CH375写命令函数 //写入参数:命令控制字 //返回参数:无 //描述: /****************************************************/ void CH375_WriteCmd(unsigned char CH375Command) { unsigned int CH375DATA=0xFF00; EALLOW; //运行写EALLOW保护寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位设置为输出 EDIS; GpioDataRegs.GPBDAT.all=0xFFFF; //对GPIOB赋初始值 CH375DATA|=CH375Command; CH375_CS=0; CH375_A0 = 1; //A0为1的时候,写入命令,A0为0的时候,写入数据 CH375_Read=1;

GpioDataRegs.GPBDAT.all=(GpioDataRegs.GPBDAT.all & CH375DATA);

SDelay(200); CH375_Write=0; SDelay(200); CH375_Write=1; CH375Disable(); } /****************************************************/ //函数描述:CH375写数据 //写入参数:数据 //返回参数:无 //描述: // 2009.07.27 : V2.0: 从子程序中去除CH375Disable(),在连续写数据过程中不能将CS变高,移到写完整个数据块后在Disable /****************************************************/ void CH375_WriteData(unsigned char CH375Data) { unsigned char CH375Data_Temp = 0xFF00; EALLOW; //运行写EALLOW保护寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位设置为输出 (1为输出,0为输入) EDIS; GpioDataRegs.GPBDAT.all=0xFFFF; //对GPIOB赋初始值 CH375Data_Temp|=CH375Data; CH375_CS=0; CH375_A0 = 0; //A0为1的时候,写入命令,A0为0的时候,写入数据 CH375_Read=1;

GpioDataRegs.GPBDAT.all&= CH375Data_Temp; //这种处理方法有可能改变读写状态。

SDelay(200); CH375_Write=0; SDelay(200); CH375_Write=1; CH375Disable(); } /****************************************************/ //函数描述:CH375读数据 //写入参数:无 //返回参数:读出数据 //描述: //2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函数 // 原因:在批量数据读取时,CS线不能变低。将这部分功能移动到了数据读取完后再进行Disable /****************************************************/ unsigned char CH375_ReadData() { unsigned char USBData;

EALLOW; //运行写EALLOW保护寄存器 GpioMuxRegs.GPBDIR.all=0xFF00; //GPIOB口低8位设置为输入 EDIS; CH375_CS=0; CH375_A0 = 0; //A0为1的时候,读出中断标志,A0为0的时候,读出数据 CH375_Read=0; CH375_Write=1; SDelay(200);

USBData= (GpioDataRegs.GPBDAT.all)&0xFF;;

SDelay(200); CH375_Read=1; CH375Disable(); return USBData; } /****************************************************/ //函数描述:CH375写模式 //写入参数:模式数据 //返回参数:无 //描述: // 写完命令自测试 /****************************************************/ void CH375Write_Mode(unsigned char CH375Mode) { //add CH375_WriteCmd(CMD_SET_USB_MODE); SDelay(20); CH375_WriteData(CH375Mode); while(CH375_ReadData()!=CMD_RET_SUCCESS) { } //UartTrans("USB Set Mode OK!\n",17); CH375Disable(); } /****************************************************/ //函数描述:CH375缓冲区复位 //写入参数:无 //返回参数:无 //描述: // 长度清零、缓冲区清零 /****************************************************/ void USBReset() { unsigned char Count_Temp; for(Count_Temp=0;Count_Temp { USBBuffer[Count_Temp]=0; } USBData_Len = 0; } /****************************************************/ //函数描述:CH375发送数据 //写入参数:数据以及数据包的长度 //返回参数:无 //描述: // /****************************************************/ void USBSend_Data(unsigned char *USBSendBuffer,unsigned char SendBuffer_Len) { //add unsigned char Count_Temp; CH375_WriteCmd(CMD_WR_USB_DATA7); CH375_WriteData(SendBuffer_Len); for(Count_Temp=0;Count_Temp { CH375_WriteData(*(USBSendBuffer+Count_Temp)); } CH375Disable(); } /****************************************************/ //函数描述:CH375中断 //写入参数:无 //返回参数:无 //描述: // 中断源:INT0 // 缓冲区:USBBuffer[] // 长度 :USBData_Len ,Maxlen=64 /****************************************************/ void USBint() {

unsigned char USBStatus; unsigned char Count_Temp; CH375_WriteCmd(CMD_GET_STATUS); SDelay(1); USBStatus=CH375_ReadData(); switch(USBStatus) { case USB_INT_EP1_OUT: {

} break; case USB_INT_EP1_IN: CH375_WriteCmd(CMD_UNLOCK_USB); break; case USB_INT_EP2_OUT: { CH375_WriteCmd(CMD_RD_USB_DATA); USBData_Len=CH375_ReadData(); //接收长度 if(USBData_Len>64) { USBData_Len=64; } for(Count_Temp=0;Count_Temp< USBData_Len;Count_Temp++) //接收数据块 { USBBuffer[Count_Temp]=CH375_ReadData(); } USBRecFlag=1; CH375Disable(); } break; case USB_INT_EP2_IN: CH375_WriteCmd(CMD_UNLOCK_USB); break; case USB_INT_USB_SUSPEND: break; case USB_INT_WAKE_UP: break; default: break; } } 请教高人指点。[Emot]1[/Emot]

问题已经解决,能够正确向电脑发送数据,可是,怎么接收数据啊。


可以接收数据咯。上面的程序是没有问题的。只是注意赋初值,还有那个CH372调试软件的使用。


我的也能正常配置,电脑能发现硬件,但使用CH372DEBUG.exe为什么接收和发送数据


interrupt void xint1(void) { unsigned char InterruptStatus; //定义中断状态 unsigned char mLength; unsigned char SendLength=64; //上传数据长度 CH375_WR_CMD_PORT(GET_STATUS); //向CH375发送中断状态获取命令 InterruptStatus = CH375_RD_DAT_PORT();//获取中断状态,并通知CH375取消中断请求 // 分析中断状态,并做相应处理 switch(InterruptStatus){ case USB_INT_EP2_OUT: // 端点2数据下传 CH375_WR_CMD_PORT( RD_USB_DATA );// 向CH375发送读数据命令 mLength =CH375_RD_DAT_PORT( );//从CH375下传缓冲区读取数据块 if ( mLength == 0 ) { /* 长度为0,没有数据,在某些应用中也可以将长度0定义为一种特殊命令 */ p_xram=data_buffer; p_ser=data_buffer; return; } do { *p_xram = CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */ p_xram++; } while ( -- mLength ); break; case USB_INT_EP2_IN: //端点2数据上传 CH375_WR_CMD_PORT(WR_USB_DATA7); //向ch375发送写数据命令 CH375_WR_DAT_PORT(SendLength); //首先写入要发送数据长度 do { CH375_WR_DAT_PORT(*p_ser); p_ser++; }while(--SendLength); CH375_WR_CMD_PORT(UNLOCK_USB); break; case USB_INT_EP1_OUT: CH375_WR_CMD_PORT(UNLOCK_USB); break; case USB_INT_EP1_IN: CH375_WR_CMD_PORT(UNLOCK_USB); break; default: CH375_WR_CMD_PORT(UNLOCK_USB); break; } } 这是中断服务程序,请求帮忙


我的也能正常配置,电脑能发现硬件,但使用CH372DEBUG.exe为什么接收和发送数据? 你的问题是什么?看不懂哎


不好意思,打错了。我的是DSP和pc机的通信。采用并口控制CH375,能够正常的配置完成,能找到硬件,使用DEBUG372.EXE测试,上传和下传都没反应,而且经常卡死。这是为什么?求指导。前面贴的是中断服务程序。


你先下传数据,看看是否可以收到下传的数据。中断函数里面的意思是收到下传的数据包后,按位取反后上传,如果没有点击下传,直接点击上传,这个时候软件上并没有上传数据,导致CH372DBG软件一直在读数据,就产生了你看到卡死的现象了。


只有登录才能回复,可以选择微信账号登录