[求助]CH372的连接问题……

我的CH372在程序开始进行测试的时候,用USB线连到电脑上测试通不过,把线拔了就能通过,可到下一步设置工作模式的时候,就是等不到CH375_RD_DAT_PORT()返回CMD_RET_SUCCESS,返回值是0x5f,为什么会操作失败? 程序就是按51的例子修改的,我用的是44B0,需要有哪些注意的地方吗?

1、测试命令通常需要做2次,如测试数据为0x55,0xaa 2、CH372的电路设计与手册中是否一样


电路设计应该没有什么问题,我是从别人那拿来用的,人家能用

我的测试只做了一次,先改下程序试试 谢谢啊!有问题我会再来咨询的


回去把程序修改了一下,改为测试两次,通过串口输出的信息显示两次测试均可以通过,可到了模式设置的时候,函数CH375_RD_DAT_PORT()的返回值一直是5f,请问这是怎么回事?


贴出程序看看。一般测试命令通过,设置命令一般都能成功。可能是您写的不正确。


现在从调试的结果看,我的测试程序好像就没有通过,我用的是ARM的44B0,会不会是延时函数的时间跟51的不太一致,程序不能照用啊?下面是我用的测试程序,大部分是照着写的,延时函数改了一下,单片机的时钟频率是40M #include "44b.h" #include "44blib.h" #include "def.h" #include "CH375INC.H" #include "stdio.h"

#define DELAY_START_VALUE 3 //根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 #define TEST_CH375_FIRST 1 #define MY_USB_VENDOR_ID 0x4348 #define MY_USB_PRODUCT_ID 0x5537 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,如果单片机较快则延时 */ CH375_CMD_PORT=cmd; Delay1us(); Delay1us(); }

void CH375_WR_DAT_PORT(U8 dat) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; Delay1us(); }

U8 CH375_RD_DAT_PORT(void) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ Delay1us(); return(CH375_DAT_PORT); }

void CH375_Init(void) { int i; //--------测试CH375与44B0物理连接是否正常及是否正常工作,可选操作,通常不需要------ #ifdef TEST_CH375_FIRST CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH375_WR_DAT_PORT(0x55); /* 写入测试数据,任意数据 */ if ( CH375_RD_DAT_PORT()!=0xaa) { /* CH375不正常 */ for ( i=80; i!=0;i--) { CH375_WR_CMD_PORT(CMD_RESET_ALL); /* 多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); Delay(500); //50ms延时 }

#endif #ifdef MY_USB_VENDOR_ID #ifdef MY_USB_PRODUCT_ID /* 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID, 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改 */ CH375_WR_CMD_PORT( CMD_SET_USB_ID ); /* 设置外部自定义的USB设备VID和PID,可选操作 */ CH375_WR_DAT_PORT( (U8)MY_USB_VENDOR_ID ); /* 写入厂商ID的低字节 */ CH375_WR_DAT_PORT( (U8)(MY_USB_VENDOR_ID>>8) ); /* 写入厂商ID的高字节 */ CH375_WR_DAT_PORT( (U8)MY_USB_PRODUCT_ID ); /* 写入产品ID的低字节 */ CH375_WR_DAT_PORT( (U8)(MY_USB_PRODUCT_ID>>8) ); /* 写入产品ID的高字节 */ #endif #endif

//--------------------设置USB工作模式, 必要操作--------------- CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); //设置为使用内置固件的USB设备方式 20us内完成 for (i=200;i!=0;i--) //等待操作成功,通常需要等待10uS-20uS { if (CH375_RD_DAT_PORT() == CMD_RET_SUCCESS) break; } if (i==0) { Uart_Printf("CH372芯片内部或者物理连接存在硬件错误!!"); while(1); }

}


看来今天是周末,没有人啊

修改了一下测试程序,从串口输出的情况来看,两步测试现在都能通过,只是得经过3~4个while循环,可是模式设置那还是过不去,输出的是5f,请问这是怎么回事?

CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据,任意数据 while (CH375_RD_DAT_PORT()!=0xaa) //CH375不正常 { Uart_Printf("--"); //串口显示信息 CH375_WR_CMD_PORT(CMD_RESET_ALL); //测试CH375是否正常工作 Delay(400); //40ms延时 加了延时后5个循环出了while,可再修改 CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据,任意数据 } CH375_WR_CMD_PORT(0); Delay(500); CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0xaa); //写入测试数据,任意数据 while (CH375_RD_DAT_PORT()!=0x55) //CH375不正常 { Uart_Printf("++"); //串口显示信息 CH375_WR_CMD_PORT(CMD_RESET_ALL); Delay(400); //40ms延时 CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0xaa); //写入测试数据,任意数据 } CH375_WR_CMD_PORT(0); Delay(500); //--------------------设置USB工作模式, 必要操作--------------- CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); //设置为使用内置固件的USB设备方式 20us内完成 for(i=1;i!=0;i--){}; for (i=200;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芯片内部或者物理连接存在硬件错误!!"); while(1); }


唉,没有人啊…… 自己再顶一下 昨晚用示波器测了一下延时用的for语句,发现延时比原来预想的要长得多,达到了5us左右。将模式设置时的for等待语句的循环次数减少为20,电脑就识别372了。不过还有疑问:for循环中有break啊,按说CMD_RET_SUCCESS了以后就跳出了,跟循环次数的下限似乎没有关系,怎么我从100改为20就好了呢?还烦请高手指教! 还有个问题,外面的大循环有10个循环,根据串口输出的信息,程序要运行6~7次才能正确识别372,这又是怎么回事? for(k=10;k!=0;k--) { CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 20us内完成 for (i=10;i!=0;i--) //将原来的100改为20左右,但不要小于10就能识别 { if (CH375_RD_DAT_PORT() == CMD_RET_SUCCESS) break; } if (i==0) { Uart_Printf("CH372芯片内部或者物理连接存在硬件错误!!\n"); } }


没有人帮我解释一下吗?


主函数开始有没有延时50ms?如果没有的话,则很有可能CH372还没有复位好,所以你多次操作才可以


程序开始有延时50ms,测试程序中执行硬件复位时也有40ms的延时,那这种多次复位情况是怎么回事呢?


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