首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]jb16 usb设备数据通讯

[求助]jb16 usb设备数据通讯

usb的通讯咋就这么麻烦阿!我的usb可以发送单个数据,现在要做发送多个数据,当超过8个就不对了,芯片的端点寄存器是8位,我用变量缓冲tx_buf存放发送的数据,然后在中断中放入端点寄存器的,应该怎么做阿,请各位指点!
不断学习,摸索中进步!
发送数据的databuffer只有8个byte,所以超过8个byte需要分批发送,每次最多发8个。
一般会开一个自己的发送缓存,比如说tx_buf,用一个指针tx_pointer指向缓存的开头,第一次把8个byte放入endpoint的databuffer,tx_pointer加8,等前面8个byte发送出去以后,再发送后面的数据

对呀,我的思路是这样的,但是设备第一次上电发送数据正确,以后的数据就不对了

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编辑过]

不断学习,摸索中进步!
这样的话就不需要用指针了,
直接*dest=TxBuffer[TxBuf_RdIdx]就可以了
MAX_TXBUF_SIZE必须是2^n
谢谢!按照上面的,数据一次最多只可以发送20个????。不知为啥?
MAX_TXBUF_SIZE=32,看datasheet说的UE1D0~UE1D7都是端点1的端点缓冲,那我程序里面的UE1D0是可以用其它的来替换的吧,还有能不能一次多用几个UE1Dx,
不断学习,摸索中进步!
可以发送超过8个了?恭喜,说明功能基本实现了,但是程序还是需要调整。
是的UE1D0-7都可以用,端点发送的时候从D0开始,发送UCR1中定义的数据个数。
UCR1中的n应该是本次包内的字节数吧,很奇怪,最多只能发送20个数据,超过调试软件会提示:设备没有响应,唪鸣器鸣叫(设备上电会鸣叫)。20也不是8的整数倍,19个数据是正确的,其它的缓冲没有溢出,RAM足够大的。刚测试的就是设备会重新上电的鸣叫,在main()的开头的。

[此贴子已经被作者于2005-11-17 14:48:00编辑过]

不断学习,摸索中进步!
往PC发的话,PC应该先有命令过来,说明一共要发多少个字节过去,然后你在发就可以了。
程序再仔细看一下,看看有没有错误。
多谢,好啦!粗心了,把送缓冲的局部数组变量大小定义20,所以溢出了,修改大小就可以啦。
不断学习,摸索中进步!
返回列表