求助CH372芯片的程序设计

那是当然的,不同的下位机程序对应的上位机程序操作是不一样的,你还是好好检查下你的程序吧,如果你要实现和TEST.C一样的例子程序的话,建议你还是跟踪下你单片机的程序,不要盲目的修改程序。


当然不是盲目的在修改程序,

目前修改的程序只是将中断的方式修改为查询的方式来实现数据上传, 对于这样的改动,上位机的操作应该是一样的。


/* CH375中断服务程序,使用寄存器组1 */ void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ]={0}; xWriteCH376Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = xReadCH376Data( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = xReadCH376Data( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收数据包 */ FLAG_SEND_WAIT = 1; /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ // xWriteCH376Data( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ // for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ // FLAG_SEND_WAIT = 1; // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ // xWriteCH376Data( 60 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ // for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */

break; } default: { /* 其它中断,未用到,解锁后退出即可 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }

void main() { unsigned char i; CH376DeviceInit( ); /* 初始化USB设备模式 */ FLAG_SEND_WAIT = 0; mDelaymS(100); // while(1); while(1) { if(FLAG_SEND_WAIT) { xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ xWriteCH376Data( 60 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ FLAG_SEND_WAIT = 0; } } }

这个为什么就不能上传数据, 我只是更改了数据上传的方式,将在中断程序里上传的放到主程序中采用查询方式进行数据上传,怎么就不行呢


S1-T2-C3250 return data error at 26: 13H (C7H) S1-T2-C3250 return data error at 27: 78H (5DH) S1-T2-C3250 return data error at 28: BFH (9AH) S1-T2-C3250 return data error at 29: 1AH (13H) S1-T2-C3250 return data error at 30: C6H (8AH) S1-T2-C3250 return data error at 31: 9DH (32H) S1-T2-C3250 return data error at 32: 54H (FEH) S1-T2-C3250 return data error at 33: 0CH (7FH) S1-T2-C3250 return data error at 34: A1H (C0H) S1-T2-C3250 return data error at 35: BAH (66H) S1-T2-C3250 return data error at 36: B5H (28H) S1-T2-C3250 return data error at 37: 80H (F7H) S1-T2-C3250 return data error at 38: 40H (B8H) S1-T2-C3250 return data error at 39: A8H (95H) S1-T2-C3250 return data error at 40: 46H (8EH) S1-T2-C3250 return data error at 41: 79H (24H) S1-T2-C3250 return data error at 42: 0BH (4CH) S1-T2-C3250 return data error at 43: E3H (C8H) S1-T2-C3250 return data error at 44: 84H (6CH) S1-T2-C3250 return data error at 45: B4H (6AH) S1-T2-C3250 return data error at 46: 3DH (1EH) S1-T2-C3250 return data error at 47: 65H (A4H) S1-T2-C3250 return data error at 48: 6FH (1FH) S1-T2-C3250 return data error at 49: 60H (BEH) S1-T2-C3250 return data error at 50: B6H (22H) S1-T2-C3250 return data error at 51: 45H (E1H) S1-T2-C3250 return data error at 52: B5H (CEH) S1-T2-C3250 return data error at 53: 9FH (B7H) S1-T2-C3250 return data error at 54: 81H (5DH) S1-T2-C3250 return data error at 55: 0DH (FEH) S1-T3-C3251 return length error: 0 (58),DAH,66H... S1-T0-C3252 return data error at 20: F9H (00H)H... S1-T0-C3252 return data error at 21: 19H (00H) S1-T0-C3252 return data error at 23: 89H (00H) S1-T0-C3252 return data error at 24: 09H (00H) S1-T0-C3252 return data error at 25: C1H (00H) S1-T0-C3252 return data error at 26: 3DH (00H) S1-T0-C3252 return data error at 27: EDH (00H) S1-T0-C3252 return data error at 28: 43H (00H) S1-T0-C3252 return data error at 29: A4H (00H) S1-T0-C3252 return data error at 30: A5H (00H) S1-T0-C3252 return data error at 31: 44H (00H) S1-T0-C3252 return data error at 32: 56H (00H) S1-T0-C3252 return data error at 33: E1H (00H) S1-T0-C3252 return data error at 34: 4AH (00H) S1-T0-C3252 return data error at 36: E0H (00H) S1-T0-C3252 return data error at 37: D3H (00H) S1-T0-C3252 return data error at 38: 8DH (00H) S1-T0-C3252 return data error at 39: B3H (00H) S1-T0-C3252 return data error at 40: 13H (00H) S1-T0-C3252 return data error at 41: 0DH (00H) S1-T0-C3252 return data error at 42: 21H (00H) S1-T0-C3252 return data error at 43: F1H (00H) S1-T0-C3252 return data error at 44: 29H (00H) S1-T0-C3252 return data error at 45: 18H (00H) S1-T0-C3252 return data error at 46: DCH (00H) S1-T0-C3252 return data error at 47: E9H (00H) S1-T0-C3252 return data error at 48: 88H (00H) S1-T0-C3252 return data error at 49: EEH (00H) S1-T0-C3252 return data error at 50: 43H (00H) S1-T0-C3252 return data error at 51: BDH (00H) S1-T3-C3255 return length error: 0 (13),0CH,EDH... S1-T1-C3261 return data error at 32: FFH (FFH)H... S1-T1-C3261 return data error at 33: FFH (FFH) S1-T1-C3261 return data error at 34: FFH (FFH) S1-T1-C3261 return data error at 35: FFH (FFH) S1-T1-C3261 return data error at 36: FFH (FFH) S1-T1-C3261 return data error at 37: FFH (FFH) S1-T1-C3261 return data error at 38: FFH (FFH) S1-T1-C3261 return data error at 39: FFH (FFH) S1-T1-C3261 return data error at 40: FFH (FFH) S1-T1-C3261 return data error at 41: FFH (FFH) S1-T1-C3261 return data error at 42: FFH (FFH) S1-T1-C3261 return data error at 43: FFH (FFH) S1-T1-C3261 return data error at 44: FFH (FFH) S1-T1-C3261 return data error at 45: FFH (FFH) S1-T1-C3261 return data error at 46: FFH (FFH) S1-T1-C3261 return data error at 47: FFH (FFH) S1-T3-C3263 return length error: 0 (26),DAH,6BH... S1-T1-C3265 return data error at 10: FFH (FFH)H... S1-T1-C3265 return data error at 11: FFH (FFH) S1-T1-C3265 return data error at 12: FFH (FFH) S1-T1-C3265 return data error at 13: FFH (FFH) S1-T1-C3265 return data error at 14: FFH (FFH)

我用TEST.EXE程序测试, 这个数据可以说明什么问题?


我们TEST例程的功能是:单片机收到PC下传的数据后,把数据取反再回传给PC,你现在程序是这么做的么?你的程序是先下传,置FLAG_SEND_WAIT为1,然后只会在主程序中上传一次,因为上传成功后FLAG_SEND_WAIT没有置1


SCM 程序就是你说的这样,先下传,然后置FLAG_SEND_WAIT为1,然后主程序完成数据的上传,然后再点DEBUG372下传再下传一组数据,再置FLAG_SEND_WAIT为1,继续上传数据,程序流程就是这样,应该很清楚吧 但是结果是 不能完成数据的上传。。 程序的修改唯一的就在于我将中断服务程序中取反再上传的屏蔽了 “ // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ // xWriteCH376Data( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ // for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ ” 而将上传数据修改后放在判断FLAG_SEND_WAIT为1的程序中, 这样的程序有问题? if(FLAG_SEND_WAIT) { xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ xWriteCH376Data( 60 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ FLAG_SEND_WAIT = 0; }


我将下位机程序修改为 TEST.C 一样的了 用TEST.EXE程序 测试结果如下: S1-T1-C2485 return data error at 56: FFH (FFH) S1-T1-C2485 return data error at 57: FFH (FFH) S1-T1-C2485 return data error at 58: FFH (FFH) S1-T1-C2485 return data error at 59: FFH (FFH) S1-T1-C2485 return data error at 60: FFH (FFH) S1-T1-C2485 return data error at 61: FFH (FFH) S1-T1-C2485 return data error at 62: FFH (FFH) S1-T1-C2485 return data error at 63: FFH (FFH) S1-T2-C2490 return length error: 0 (19),71H,89H... S1-T1-C2493 return length error: 0 (2)H,FFH,FFH... S1-T2-C2494 return length error: 0 (47),5FH,45H... S1-T3-C2495 return data error at 1: 32H (85H)1H... S1-T3-C2495 return data error at 2: 7FH (27H) S1-T3-C2495 return data error at 3: 24H (72H) S1-T3-C2495 return data error at 4: A0H (2EH) S1-T3-C2495 return data error at 5: BAH (91H) S1-T3-C2495 return data error at 6: 4FH (52H) S1-T3-C2495 return data error at 7: 32H (3FH) S1-T3-C2495 return data error at 8: B4H (16H) S1-T3-C2495 return data error at 9: 7BH (27H) S1-T3-C2495 return data error at 10: CEH (E5H) S1-T3-C2495 return data error at 11: 30H (C7H)

这些是什么意思? 说明什么问题吗?希望能够指点


这些说明数据或读取长度出错,先用DEBUG372调试,这个调不通,TEST肯定也调不通。


我修改为TEST.C程序后,能用DEBUG372调试通过,端点2上传和下传都没有问题,

但TEST.EXE 是不通的。

还有你忘记回复21楼的问题了


在20楼已经说了TEST例程的功能,而你的程序:for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); 这是把接收到数据取反回传么?


我说过,已经修改为TEST.C的程序 取反回传了。 并且 DEBUG372调试上传和下传都能通过,数据也是取反回传的正确值。 程序如下: /* CH375中断服务程序,使用寄存器组1 */ void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ]={0}; xWriteCH376Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = xReadCH376Data( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = xReadCH376Data( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收数据包 */ FLAG_SEND_WAIT = 1; /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ xWriteCH376Data( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }

void main() { unsigned char i; CH376DeviceInit( ); /* 初始化USB设备模式 */ FLAG_SEND_WAIT = 0; mDelaymS(100); while(1); }

但TEST.EXE是不通 现象是22楼。


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