请教一段程序

请大家帮我看看这段程序,主要功能是完成372芯片对数据的接受和发送,本人是初学者,毕业设计师这方面的题目,希望大家多多指导。谢谢大家!

#include #include typedef unsigned char *PUINT8; typedef unsigned char UINT8; typedef unsigned char volatile xdata IOPORT; IOPORT CH372_CMD_PORT _at_ 0x9001; /*命令口地址*/ IOPORT CH372_DAT_PORT _at_ 0x9000; /*数据口地址*/

void Delay( ) /*延时程序*/ { UINT8 i; for ( i=3; i>0; i-- );

}

void CH372_WR_CMD_PORT(UINT8 cmd) /*向命令口写入命令(cmd=15h)*/ { Delay(); CH372_CMD_PORT=cmd; Delay(); } void CH372_WR_DAT_PORT(UINT8 dat) /*向数据口写入数据*/ { CH372_DAT_PORT=dat; Delay(); } UINT8 CH372_RD_DAT_PORT() /*读取数据*/ { Delay(); return(CH372_DAT_PORT); }

void CH372_INIT() /*372初始化*/ { UINT8 i; CH372_WR_CMD_PORT(CMD_SET_USB_MODE); /*设置USB工作模式*/ CH372_WR_DAT_PORT(2); /*设置USB为内置固件方式*/ for(i=100;i>0;i--) if(CH372_RD_DAT_PORT()==CMD_RET_SUCCESS) /*等待操作成功*/ break; IT1=1; /*外部中断1低电平有效*/ IE1=0; /*清中断标志*/ EX1=1; /*允许372中断(372已经连接到单片机的INT1脚)*/ }

UINT8 UsbLength; /*USB缓冲区长度*/ UINT8 UsbBuffer[CH372_MAX_DATA_LEN]; /*USB缓冲区*/

/* CH372中断服务程序,假定CH372的INT#引脚连接到单片机的INT1,使用寄存器组1 */ void CH372Interrupt() interrupt 2 using 1 { PUINT8 buf; UINT8 cnt; UINT8 IntStatus; CH372_WR_CMD_PORT(CMD_GET_STATUS); /*获取中断状态并取消中断*/ IntStatus=CH372_RD_DAT_PORT(); /*获取中断状态*/ IE1=0; switch(IntStatus){ case USB_INT_EP2_OUT: /*接收数据成功*/ CH372_WR_CMD_PORT(CMD_RD_USB_DATA); UsbLength=cnt=CH372_RD_DAT_PORT(); /*首先读出数据块的长度*/ if(cnt) { buf=UsbBuffer; /*指针指向缓冲区*/ do { *buf=CH372_RD_DAT_PORT(); /*接收数据*/ buf++; }while(--cnt); } else break; case USB_INT_EP2_IN: /*发送数据成功*/ CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); cnt=UsbLength; CH372_WR_DAT_PORT(cnt); /*首先写入数据块长度*/ if(cnt) { buf=UsbBuffer; /*指针指向缓冲区*/ do { CH372_WR_DAT_PORT(*buf); /*写入数据*/ buf++; }while(--cnt); CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /*释放缓冲区*/ } else break; default: CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } }

main() { CH372_INIT(); EA=1; while(1); }

现在是什么问题?ch372上电先延时50ms


因为我编的这段程序还没有调试,也不知道接收和发送模块有没有编正确,不知道有没有这方面的软件可以仿真一下,谢谢!


是否正确,对照我们的例程也能比较出来啊,好像还没有软件可以仿真,调试一下试试 USB_INT_EP2_IN中无论是否有后续数据,都需要解锁,CH372_WR_CMD_PORT( CMD_UNLOCK_USB )位置不对


到我们网站上下载ch372evt.zip,下位机参考TEST.C程序,上位机下载ch372dbg.zip进行调试


哪个CH372_WR_CMD_PORT( CMD_UNLOCK_USB )位置不对啊?因为有两个地方出现了这个语句。


USB_INT_EP2_IN中:你的程序只有继续上传数据后,才会CMD_UNLOCK_USB,如果没有数据上传的话,也是需要CMD_UNLOCK_USB的 if(cnt) { .... } CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); break;


谢谢啊!呵呵!


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