标题: [求助]jb16 usb设备数据通讯 [打印本页]
作者: 流浪远方百合 时间: 2005-11-14 15:05 标题: [求助]jb16 usb设备数据通讯
usb的通讯咋就这么麻烦阿!我的usb可以发送单个数据,现在要做发送多个数据,当超过8个就不对了,芯片的端点寄存器是8位,我用变量缓冲tx_buf存放发送的数据,然后在中断中放入端点寄存器的,应该怎么做阿,请各位指点!
作者: seuafu2005 时间: 2005-11-14 16:19
发送数据的databuffer只有8个byte,所以超过8个byte需要分批发送,每次最多发8个。
一般会开一个自己的发送缓存,比如说tx_buf,用一个指针tx_pointer指向缓存的开头,第一次把8个byte放入endpoint的databuffer,tx_pointer加8,等前面8个byte发送出去以后,再发送后面的数据
作者: 流浪远方百合 时间: 2005-11-16 10:46
对呀,我的思路是这样的,但是设备第一次上电发送数据正确,以后的数据就不对了
put(){//将数据放入发送缓冲区
p_tx=TxBuffer;//指针
TxBuffer[TxBuf_WrIdx] = c;
TxBuf_WrIdx = (TxBuf_WrIdx+1) & (MAX_TXBUF_SIZE-1);
}
Handle(){//数据放入端点寄存器,发送,
UCR1 &= ~BM_TX1E;
UIR2 = BM_TXD1FR; n = 0;
if(TxBuf_RdIdx/8!=0)&&(TxBuf_RdIdx%8==0)
p_tx+=8;
dest = &UE1D0;
while((TxBuf_RdIdx != TxBuf_WrIdx) && n<8) {
*dest=*(p_tx+n);
TxBuf_RdIdx = (TxBuf_RdIdx - 1) & (MAX_TXBUF_SIZE-1);
dest++;
n++;
}
UCR1 = ((UCR1^BM_T1SEQ) & BM_T1SEQ) + BM_TX1E + n;
//指针移向下一组数据
}
[此贴子已经被作者于2005-11-15 16:25:06编辑过]
[此贴子已经被作者于2005-11-16 10:46:25编辑过]
作者: seuafu2005 时间: 2005-11-16 10:56
这样的话就不需要用指针了,
直接*dest=TxBuffer[TxBuf_RdIdx]就可以了
MAX_TXBUF_SIZE必须是2^n
作者: 流浪远方百合 时间: 2005-11-16 14:41
谢谢!按照上面的,数据一次最多只可以发送20个????。不知为啥?
MAX_TXBUF_SIZE=32,看datasheet说的UE1D0~UE1D7都是端点1的端点缓冲,那我程序里面的UE1D0是可以用其它的来替换的吧,还有能不能一次多用几个UE1Dx,
作者: seuafu2005 时间: 2005-11-16 16:56
可以发送超过8个了?恭喜,说明功能基本实现了,但是程序还是需要调整。
是的UE1D0-7都可以用,端点发送的时候从D0开始,发送UCR1中定义的数据个数。
作者: 流浪远方百合 时间: 2005-11-17 14:48
UCR1中的n应该是本次包内的字节数吧,很奇怪,最多只能发送20个数据,超过调试软件会提示:设备没有响应,唪鸣器鸣叫(设备上电会鸣叫)。20也不是8的整数倍,19个数据是正确的,其它的缓冲没有溢出,RAM足够大的。刚测试的就是设备会重新上电的鸣叫,在main()的开头的。
[此贴子已经被作者于2005-11-17 14:48:00编辑过]
作者: seuafu2005 时间: 2005-11-17 15:08
往PC发的话,PC应该先有命令过来,说明一共要发多少个字节过去,然后你在发就可以了。
程序再仔细看一下,看看有没有错误。
作者: 流浪远方百合 时间: 2005-11-17 16:20
多谢,好啦!粗心了,把送缓冲的局部数组变量大小定义20,所以溢出了,修改大小就可以啦。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |