1. 问一下:CH372EVT里面有C++写的CH372UPDownDlg有数据端点2的下传、数据端点2的上传和中断端点1的上传,我想问的是我在下位机以批量端点2发送数据(上位机只是读数据),我只用你们的数据端点2的上传对话框能不能读到下位机送来的数???如果不行是什么原因??
[Emot]1[/Emot]
1. 问一下:CH372EVT里面有C++写的CH372UPDownDlg有数据端点2的下传、数据端点2的上传和中断端点1的上传,我想问的是我在下位机以批量端点2发送数据(上位机只是读数据),我只用你们的数据端点2的上传对话框能不能读到下位机送来的数???如果不行是什么原因??
[Emot]1[/Emot]
应该可以,不过你的下位机程序要加一条命令就可以了,你在初始化372之后加上下面的程序就可以实现直接上传而不需要先下传在上传:while(1){ /*用来确定主机是否准备好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } 因为你先上传的话,上位机不知道你是否准备好,所以先要知道上位机准备好了没有,如果准备好了就可以发送了
根据你写的C我写的汇编如下:AGAIN: MOV DPTR,#CH375_CMD_PORT MOV A, #CMD_GET_TOGGLE MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#0X20 MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOVX A, @DPTR ANL A,#20H JZ AGAIN 对不对啊??? 还有同步就说明上位机准备好了啊???
对了不是20H吧????应该是10H,这样才是位4,20H是位5了!!
不是同步的意思,这个命令就是先给计算机发一个数据下去,如果计算机返回的数据的位5为1的话,那就说明计算机准备好了
再问一下:为什么是位5?还有我的汇编程序是不是对的?谢谢!
程序这样写: AGAIN: MOV DPTR,#CH375_CMD_PORT MOV A, #CMD_GET_TOGGLE MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#0X20 MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOVX A, @DPTR ANL A,#20H CJNE A,#20H AGAIN
我试了一下,读不了数!奇怪的是我的数据采集也不能工作了!!! 程序如下: STACK EQU 50H ;堆栈区栈顶(向上延伸) CMD_GET_TOGGLE EQU 0AH CH372_CMD_PORT EQU 0BDF1H ;CH372命令口的地址,地址译码后自动片选 CH372_DAT_PORT EQU 0BCF0H ;CH372数据口的地址,地址译码后自动片选 CMD_SET_USB_MODE EQU 15H ;设置USB工作模式的命令代码 CMD_RET_SUCCESS EQU 51H ;设置操作成功的命令代码 CMD_UNLOCK_USB EQU 23H ;设备方式: 释放当前USB缓冲区 CMD_GET_STATUS EQU 22H ;获取中断状态并取消中断请 USB_INT_EP2_IN EQU 0AH ;USB端点2的IN CMD_WR_USB_DATA7 EQU 2BH ;向USB端点2的发送缓冲区写入数据块 ; 定义位标志 FLAG_SEND_WAIT BIT 20H.1 ;发送等待标志,1指示有数据块正在CH372中等待发送 ;**************************************************************************** ; ;对外接口子程序 ; ; 1. CH372_INIT 初始化子程序 ; USE: ACC, R7, DPTR ; ; 2. CH372_UPLOAD 上传数据块子程序(通过批量端点上传) ; ENTRY: R0 指向存放了准备上传数据的缓冲区, R7 准备上传的数据长度, 有效数值是0到64 ; USE: ACC, R0, R7, DPTR ;**************************************************************************** ;主程序 ORG 0000H ;复位后单片机入口 LJMP START ORG 0003H ;CH372中断 LJMP CH372_INTER
START: ; 以下初始化指令不是必要的,将单片机恢复为默认状态 CLR EA ;关中断 MOV SP,#STACK ;置堆栈初值 MOV A,#0FFH MOV P0,A MOV P1,A ;清端口状态 MOV P2,A MOV P3,A CLR A MOV IE,A ;清中断允许控制寄存器 MOV IP,A ;清中断优先级控制寄存器 MOV PSW,A ;清程序状态字 MOV TCON,A ;清定时器/计数器控制寄存器 MOV TMOD,A ;清定时器/计数器工作方式寄存器 MOV PCON,A ;清电源控制寄存器 MOV R7,#0FFH CALL DELAY_MS ;延时等待CH372初始化完成 CALL CH372_INIT ;初始化 SETB EA ;允许中断 WAIT_REQUEST: NOP CALL CH372_UPLOAD LJMP WAIT_REQUEST ;主循环 ; 初始化子程序 ; USE: ACC, R7, DPTR CH372_INIT: CLR FLAG_SEND_WAIT ;清发送等待标志,1指示有数据块正在CH372中等待发送 CLR P2.6 SETB P2.5 SETB P2.4 ; 设置USB工作模式 MOV DPTR,#CH372_CMD_PORT ;命令口地址 MOV A,#CMD_SET_USB_MODE MOVX @DPTR,A ;设置USB工作模式 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR,#CH372_DAT_PORT ;数据口地址 MOV A,#02H MOVX @DPTR,A ;设置为使用内置固件的USB设备方式 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 CH372_INIT_WT: MOVX A,@DPTR ;返回操作状态 XRL A,#CMD_RET_SUCCESS JNZ CH372_INIT_WT ;等待操作成功,通常需要等待10uS-20uS ; 下述三条指令用于启用中断 CLR IT0 ;置外部信号为低电平触发 SETB PX0 ;置高优先级 CLR IE0 ;清中断标志 SETB EX0 ;允许CH372中断 RET
; 上传数据块子程序(通过批量端点上传) ; ENTRY: R0 指向存放了准备上传数据的缓冲区, R7 准备上传的数据长度, 有效数值是0到64 ; USE: ACC, R0, R7, DPTR CH372_UPLOAD: NOP ;为了防止计算机程序没有读取数据而导致单片机一直在此等待,可以计算超时,参考CH372_UP_INT子程序 JB FLAG_SEND_WAIT,CH372_UPLOAD ;如果正在等待发送(前次发送尚未完成)则继续等待,超过正常应该取走数据的时间未取走数据则认定为超时,可以跳出等待 CLR EX0 ;为了防止中途被中断而乱了顺序,必须先禁止中断 ;数据采集 MOV R3,#10H;设定上传的字节数 MOV R1,#38H;设定数据上传的首地址 MOV R2,#04H;置通道数 LOOP_O: MOV DPTR,#3FF8H;选通2.7,且指向通道0 LOOP:MOVX @DPTR,A;启动A/D转换 WAIT:JB P1.0,WAIT;采用查询方式,等待A/D转换结束 MOVX A,@DPTR;读取数据 MOV @R1,A;存储数据 INC R1 INC DPL DJNZ R3,LOOP;循环采集完16个数据 DJNZ R2,LOOP_O; AGAIN: MOV DPTR,#CH375_CMD_PORT MOV A, #CMD_GET_TOGGLE MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#0X20 MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOVX A, @DPTR ANL A,#20H JZ AGAIN MOV R0,#38H MOV R7,#40H CH372_UPLOAD_1: MOV DPTR,#CH372_CMD_PORT ;命令口地址 MOV A,#CMD_WR_USB_DATA7 MOVX @DPTR,A ;向USB端点2的发送缓冲区写入数据块 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR, #CH372_DAT_PORT ;数据口地址 MOV A,#40H MOVX @DPTR,A ;首先写入后续数据长度 CH372_INT_SEND: MOV A,@R0 MOVX @DPTR,A ;发送数据 INC R0 DJNZ R7,CH372_INT_SEND ;继续发送数据直至结束 SETB FLAG_SEND_WAIT ;置等待发送标志 SETB EX0 ;允许中断 RET ; 中断服务子程序 ; USE: 堆栈8字节 CH372_INTER: PUSH PSW ;现场保护 PUSH ACC PUSH DPL PUSH DPH MOV DPTR,#CH372_CMD_PORT ;命令口地址 MOV A,#CMD_GET_STATUS MOVX @DPTR,A ;获取中断状态并取消中断请求 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 ; NOP ;如果时钟频率低于16MHz则无需该指令延时 MOV DPTR,#CH372_DAT_PORT ;数据口地址 MOVX A,@DPTR ;返回操作状态 CLR IE0 ;清中断标志,对应于INT0中断 CH372_INT_1: CJNE A,#USB_INT_EP2_IN,CH372_INT_RET ;批量端点上传成功,发送数据成功 CH372_INT_RET: MOV DPTR,#CH372_CMD_PORT ;命令口地址 MOV A,#CMD_UNLOCK_USB MOVX @DPTR,A ;释放当前USB缓冲区 POP DPH POP DPL POP ACC POP PSW ;恢复寄存器 RETI ;********************************************************************************************
; 以毫秒为单位延时 ; ENTRY: R7 延时毫秒数 ; USE: ACC, R7 DELAY_MS: MOV A,#0FAH ;250*(1*6+2)*0.5=1000uS DELAY_1MS: NOP NOP NOP NOP NOP NOP DJNZ ACC,DELAY_1MS ;每周期延时1毫秒 DJNZ R7,DELAY_MS RET ;******************************************************************************************** END
你将你的AGAIN: MOV DPTR,#CH375_CMD_PORT MOV A, #CMD_GET_TOGGLE MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#0X20 MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOVX A, @DPTR ANL A,#20H CJNE A,#20H AGAIN 程序放到主程序开始的时候你看可以不可以
你是说放在设置工作模式之前吗??
放在设置模式之后
还是不行啊!!麻烦你仔细看看我这个问题到底出在哪儿???
到底是什么地方有问题啊?? 我加上这段程序后在上传数据块子程序(通过批量端点上传)之前和之后都不能工作!!数据采集同样不能工作,如果不加数据采集工作!!请HCN帮忙看看!!
那你就要检查你采集数据的地址和375的地址有没有地址冲突。
可是我能初始化,如果地址有冲突应该不能初始化!!!
你初始化的时候并没有操作采集系统啊!这样的话就在后面有问题了啊,也有客户开始用我们的372没问题,但是一接上LCD就出问题了啊