Retry: CH375_WR_CMD_PORT(CMD_CHECK_EXIST); /* 测试CH375是否正常工作 */ CH375_WR_DAT_PORT(0x55); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH375_RD_DAT_PORT() != i ) { /* CH375不正常 K=0 表示只做一次 */ if (k==0){ for (i=80;i!=0;i--) CH375_WR_CMD_PORT(CMD_RESET_ALL); /* 多次重复发命令,执行硬件复位 */ Delay50ms(); /* 延时50ms */ k++; goto Retry;} //返回子程序入口处,再做一次 else //如果还不成功。则返回PC机 消息,USB出错 { //表示CH372的 初始化 失败,需要置失败的标志。不需要回PC机什么命令 error=1; //置失败的标志 } }
/* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); /* 设置为使用内置固件的USB设备方式 */ for (i=50;i!=0;i--) { /* 等待操作成功,通常需要等待10uS-20uS */ if (CH375_RD_DAT_PORT()==CMD_RET_SUCCESS) break; }
注2个写函数: #define CH375_DAT_PORT *(volatile uint16 *)(0x82000000) // 对CH372的数据口做读写操作 #define CH375_CMD_PORT *(volatile uint16 *)(0x82000002) // 对CH372的命令口做读写操作
void CH375_WR_CMD_PORT(unsigned char cmd) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); }
void CH375_WR_DAT_PORT(unsigned char dat) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ delay2us(); CH375_DAT_PORT=dat; delay2us(); }
但初始化不成功,请高手帮我看看哪儿写的不对?我走单步时,if ( CH375_RD_DAT_PORT() != i ) 就符合条件,收到的不是i的取反。我用的是ARM 2214。内存地址影射应该是正确的。