***CH341A的BUS方式下,ALE总是高?

斑竹: 您好,前段时间问过CH341A的BUS方式问题,现在板子做出来了,上电后341A的配置都完成了,而且也能够打开和关闭usb口,同时也能响应中断。可是就是无法读写,因为ALE端总是高电平,而且D0~D7也总是高电平,请问这是为什么呢?是不是我还没进入BUS方式?上次贵公司告诉我说在并口方式下直接发送命令就可以了,请问是这样吗?能帮我分析一下吗?谢谢!

将上位机的程序贴出来看看


#include "stdio.h" #include "stdafx.h" #include "ch341dll.h" #define uchar unsigned char #define ulong unsigned long #define uint unsigned int

void CALLBACK myint(ulong status) //中断服务子程序 {

FILE * testfile2; testfile2=fopen("test2.txt","w+t"); fprintf(testfile2,"***INTRRUPT***\n");//若发生中断则输出到文件test2.txt fclose(testfile2); }

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { uchar addr, data; FILE * testfile; testfile=fopen("test.txt","w+t");//建立一个文件,用来输出程序进展中的标志字符 ulong out_len, in_len; uchar out_buf[32]; uchar in_buf[32];

fprintf(testfile,"Start***************\n");

if(CH341OpenDevice(0)==INVALID_HANDLE_VALUE) fprintf(testfile,"Failed!\n"); else fprintf(testfile,"Ok!\n");

CH341InitParallel(0,2); CH341SetIntRoutine(0,myint);

addr=0x00; data=0xf0; out_buf[0] = mCH341A_CMD_IO_ADDR; // BUS方式命令码 out_buf[1] = addr | mCH341A_CMD_IO_ADDR_W; out_buf[2] = data; out_len = 3; // 准备输出3个字节 CH341WriteData(0, out_buf, &out_len); // 向addr写入data CH341GetStatus(0, &in_len); fprintf(testfile,"%x\n",in_len);

CH341CloseDevice(0); fprintf(testfile,"Over***************\n"); fclose(testfile); return 0; }


上面就是我的上位机程序,CH341A外接了74HC373锁存器,和datasheet里的BUS方式连接电路一样用来扩展地址,74HC373的 /OE 端接地,LE 端接 341A的 ALE端,上位机程序中的 addr=0x00 这句我试了多种地址,可是74HC373的输出端电平始终都和D7~D0一样,都是高电平,等于说373根本没起作用啊,原因应该就是 LE端始终为高电平的原因了,我测了ALE的电平,始终都是高。这是怎么回事呢?


万用表不能测到脉冲,必须用数字存储示波器用单次触发方式才能测出。 因为是BUS总线方式,测量其静态电压没有意义。注意:计算机、单片机的总线静态一般默认都是高电平。 因为ALE默认为高电平,所以你用万用表测出的所有状态都是正常的。 但是实际上,CH341收到数据包后: 1、将ALE先置低 2、从D0-D7输出地址,ALE产生高电平通知HC373锁存地址 3、从D0-D7输出数据,将WR#置低电平脉冲通知外部电路写操作进行中 4、将ALE恢复为默认的高电平,D0-D7默认为高电平 所以万用表测不出,可以用下述方法验证: 将WR#接到HC374的CLK,看是否输出数据, 或者按ISA总线的接法、MCS51单片机的接法去验证


如果想你描述的那样,在一次写的操作中 ALE端 岂不是有两个上升沿?锁存器要锁存两次?

-----------_______________-----_________________------------ 默认高 收到数据包 高电平 变低 恢复默认高

那这样最终374的输出就和写操作完毕后的D7~D0默认状态一样,还是全是高,是吗?


还有一个问题,341的datasheet中说只能产生A0~A6 7位地址,A7为0代表要写操作,为1代表要读操作,这里怎么理解呢?


关键是要理解什么是总线,ALE出现多少脉冲没有什么关系,因为总线中的数据是靠WR和RD的脉冲驱动的,刚才请你看MCS51单片机的技术资料,就是便于比较,从而容易理解。HC374是用WR驱动的,CH341保证在WR有效时的ADDR和数据是正确有效的(这是你应该关心的),ALE对你没有意义,它只是中间信号用于锁存地址而已


至于A7你用不到,有人用来提前知道下一步是读或者写操作而已。HC373输出的地址也属于总线信号的一部分


tech,还在吗?刚又有新发现。 我的上位机程序里有一句 是 CH341GetStatus(0, &in_len); fprintf(testfile,"%x\n",in_len); 非中断时输出的结果是efff(1110 1111 1111 1111),中断时输出ebff(1110 1011 1111 1111) datasheet上说 位7-位0 对应CH341 的D7-D0 引脚,位8 对应CH341 的ERR#引脚, 位9 对应CH341 的PEMP 引脚, 位10 对应CH341 的INT#引脚, 位11 对应CH341 的SLCT 引脚,位23 对应CH341 的SDA 引脚。 0到11位都能对上,可是23位为什么是“1”呢?我的电路连接上SDA已经接地了,而且测的电压也是0 啊。这是怎么回事? 还有 我得到的数据的 第12位 那个“0”代表什么?


你显示的只有0到15位,哪有23位?12位的0有变化当然就是INT#中断脚了


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