ch375调试中断问题

void CH375_INIT() { unsigned char i; unsigned char xdata str[20]; lcd_init() ;

CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据 i = CH375_RD_DAT_PORT(); //返回数据应该是测试数据取反

if(i != ~0x55) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(15); //延时50ms sprintf(str,"####################"); print_str(2,0,str); } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 */ delay_ms(50); i = CH375_RD_DAT_PORT(); if(i == CMD_RET_SUCCESS) { sprintf(str,"枚举成功!%bx ",CMD_RET_SUCCESS); print_str(1,0,str); } else { sprintf(str,"枚举失败!%x ",CMD_RET_ABORT); print_str(1,0,str); } /*******************外部中断0初始化*************************/ IT0 = 0; //低电平触发 EX0 = 1; //开外部中断0 EA = 1; //开中断总开关 }

void CH375_ISR() interrupt 0 using 2 { unsigned char status = 0; unsigned char i, length; unsigned char buffer[20]; uchar xdata str2[20]; EA = 0;

CH375_WR_CMD_PORT(CMD_GET_STATUS); //获取中断状态并取消中断请求 status = CH375_RD_DAT_PORT(); //获取中断状态 sprintf(str2,"status: %bx ",status); print_str(2,0,str2); switch (status) { //分析中断状态处理 case USB_INT_EP2_OUT: //批量端点下传成功 { CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 length = CH375_RD_DAT_PORT(); //首先读取后续数据长度 for(i=0; i { buffer[i] = CH375_RD_DAT_PORT(); //接收数据包 } buffer[i] = '\0'; CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(length); // 首先写入后续数据长度,回传刚接收到的数据长度 for ( i=0;i< length; i++) { CH375_WR_DAT_PORT(buffer[i]+1); // 数据取反后返回,由计算机应用程序测试数据是否正确 */ } break; } case USB_INT_EP2_IN: //批量数据上传成功 { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } } // EA = 1; }

想问沁恒的工程师们一个问题,我最近做一个项目,用的是华邦单片机做USB设备开发,CH375枚举成功,发送数据后也能响应中断,但是在中断服务程序中用CH375_WR_CMD_PORT(CMD_GET_STATUS);获得中断状态,返回中断状态傎都是0,测中断引脚一直为低电平,也就是说CH375_WR_CMD_PORT(CMD_GET_STATUS)命令执行不成功,不然的话,这个引脚会变成高电平,请问我的说法是不是正确?上面贴的是初始化和中断程序,问题急待解决,匆吝赐教!

下面的字体怎么变成这样,我没有设置啊,再贴下

void CH375_INIT() { unsigned char i; unsigned char xdata str[20];

lcd_init()

CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据 i = CH375_RD_DAT_PORT(); //返回数据应该是测试数据取反

if(i != ~0x55) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(15); //延时50ms sprintf(str,"####################"); print_str(2,0,str); } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 */ delay_ms(50); i = CH375_RD_DAT_PORT(); if(i == CMD_RET_SUCCESS) { sprintf(str,"枚举成功!%bx ",CMD_RET_SUCCESS); print_str(1,0,str); } else { sprintf(str,"枚举失败!%x ",CMD_RET_ABORT); print_str(1,0,str); } /*******************外部中断0初始化*************************/ IT0 = 0; //低电平触发 EX0 = 1; //开外部中断0 EA = 1; //开中断总开关 }

void CH375_ISR() interrupt 0 using 2 { unsigned char status = 0; unsigned char i, length; unsigned char buffer[20]; uchar xdata str2[20]; EA = 0;

CH375_WR_CMD_PORT(CMD_GET_STATUS); //获取中断状态并取消中断请求 status = CH375_RD_DAT_PORT(); //获取中断状态

sprintf(str2,"status: %bx ",status); print_str(2,0,str2); switch (status) { //分析中断状态处理 case USB_INT_EP2_OUT: //批量端点下传成功 { CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 length = CH375_RD_DAT_PORT(); //首先读取后续数据长度 for(i=0; i{ buffer = CH375_RD_DAT_PORT(); //接收数据包 } buffer = '\0'; CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(length); // 首先写入后续数据长度,回传刚接收到的数据长度 for ( i=0;i< length; i++) { CH375_WR_DAT_PORT(buffer+1); // 数据取反后返回,由计算机应用程序测试数据是否正确 */ } break; } case USB_INT_EP2_IN: //批量数据上传成功 { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } } // EA = 1; }

想问沁恒的工程师们一个问题,我最近做一个项目,用的是华邦单片机做USB设备开发,CH375枚举成功,发送数据后也能响应中断,但是在中断服务程序中用CH375_WR_CMD_PORT(CMD_GET_STATUS);获得中断状态,返回中断状态傎都是0,测中断引脚一直为低电平,也就是说CH375_WR_CMD_PORT(CMD_GET_STATUS)命令执行不成功,不然的话,这个引脚会变成高电平,请问我的说法是不是正确?上面贴的是初始化和中断程序,问题急待解决,匆吝赐教!


/******************************************* CH375B驱动程序V0.1 MCU:W78E356A OSC:40MHz *******************************************/ #include #include

#include "CH375INC.H" #include "W78E365.H"

/******************************************* INT:pin12(INT0) CH375_CS:此引脚接地 CH375_WR:p10 CH375_RD:p11 CH375_A0:p12

********************************************/ #define OSC 24 #define CH375_DQ P0

sbit CH375_RD = P1^4; sbit CH375_A0 = P1^6; sbit CH375_WR = P1^7;

extern void lcd_init(); extern void print_str(unsigned char x,unsigned char y,unsigned char *str); extern void usart_print(unsigned char *str);

//******************************************************** //晶体用 40MHz //******************************************************** void delay_us(int n) { uchar i;

while(n--) { for( i = 0;i<(OSC/12);i++) { ; } } }

void delay_ms( int n) { while(n--) { delay_us(1000); } }

void CH375_WR_CMD_PORT( unsigned char cmd ) { delay_us(2); CH375_DQ = cmd; CH375_A0 = 1; //选择CH375的命令口 CH375_RD = 1; CH375_WR = 0; _nop_();_nop_(); CH375_WR = 1; CH375_A0 = 0; CH375_RD = 1; P0 = 0xff; delay_us(2); }

void CH375_WR_DAT_PORT( unsigned char dat ) { delay_us(1); CH375_DQ = dat; CH375_A0 = 0; CH375_RD = 1; CH375_WR = 0; _nop_();_nop_(); //CH375_WR产生宽度至少为80nS的低电平脉冲 CH375_WR = 1; CH375_A0 = 0; CH375_RD = 1; P0 = 0xff; delay_us(1); }

unsigned char CH375_RD_DAT_PORT(void) { unsigned char dat = 0; delay_us(2); P0 = 0xFF; //将数据端口设置为输入 CH375_A0 = 0; CH375_RD = 0; CH375_WR = 1; dat = P0; CH375_RD = 1; CH375_A0 = 0; delay_us(2); return dat; }

void CH375_INIT() { unsigned char i; unsigned char xdata str[20]; lcd_init() ;

CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据 i = CH375_RD_DAT_PORT(); //返回数据应该是测试数据取反

if(i != ~0x55) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(15); //延时50ms sprintf(str,"####################"); print_str(2,0,str); } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 */ delay_ms(50); i = CH375_RD_DAT_PORT(); if(i == CMD_RET_SUCCESS) { sprintf(str,"枚举成功!%bx ",CMD_RET_SUCCESS); print_str(1,0,str); } else { sprintf(str,"枚举失败!%x ",CMD_RET_ABORT); print_str(1,0,str); } /*******************外部中断0初始化*************************/ IT0 = 0; //低电平触发 EX0 = 1; //开外部中断0 EA = 1; //开中断总开关 }

void CH375_ISR() interrupt 0 using 2 { unsigned char status = 0; unsigned char i, length; unsigned char buffer[20]; uchar xdata str2[20]; EA = 0;

CH375_WR_CMD_PORT(CMD_GET_STATUS); //获取中断状态并取消中断请求 status = CH375_RD_DAT_PORT(); //获取中断状态 sprintf(str2,"status: %bx ",status); print_str(2,0,str2); switch (status) { //分析中断状态处理 case USB_INT_EP2_OUT: //批量端点下传成功 { CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 length = CH375_RD_DAT_PORT(); //首先读取后续数据长度 for(i=0; i { buffer[i] = CH375_RD_DAT_PORT(); //接收数据包 } buffer[i] = '\0'; CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(length); // 首先写入后续数据长度,回传刚接收到的数据长度 for ( i=0;i< length; i++) { CH375_WR_DAT_PORT(buffer[i]+1); // 数据取反后返回,由计算机应用程序测试数据是否正确 */ } break; } case USB_INT_EP2_IN: //批量数据上传成功 { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } } // EA = 1; }


完整的程序已经贴上


unsigned char CH375_RD_DAT_PORT(void) { unsigned char dat = 0; delay_us(2); P0 = 0xFF; //将数据端口设置为输入 CH375_WR = 1; CH375_A0 = 0; CH375_RD = 0; _nop_();_nop_(); dat = P0; CH375_RD = 1; CH375_A0 = 0; delay_us(2); return dat; } 在程序中看到你是外挂了一个LCD,ch375的片选是直接接地的,LCD 的连线有没有和ch375的连线复用,如果有的话,要注意的是在操作ch375的时候,不能片选到你的lcd


sbit RS = P1^5; //0:命令,1:数据 sbit RW = P3^4; //0:写操作,1:读操作 sbit EN = P3^7; //高电平使能

对,ch375的片选是直接接地的,上面是LCD的控制线,LCD数据线也是P0端口,数据端口复用这样会不会有问题呢?


LCD我是用来显示调试信息的


只要两个不同时操作就可以了,也可以先把lcd那部分去掉,上位机使用DEBUG372调试.


是啊,应该没有问题啊,我换了用串口调试,应该说能枚举,证明读写时序正常,可为什么中断之后又不能正常读写呢?


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