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

STM32的USB多包数据传送(2)

STM32的USB多包数据传送(2)

这里使用了一个变量记录应该发送第几个数据包,当程序的其它部分准备好数据后只要设置
这个变量 packetN=0,上述发送操作就会启动,程序的其它部分只需检测 packetN==3 即可
知道 MyBuffer 是否已经腾空,程序的其它部分可以使用 MyBuffer 继续其它操作,注意这时
数据不一定已经全部发送完毕。

你的另一个问题在于这一行:SetEPTxAddr(ENDP1,ENDP1_TXADDR+i*64);

ENDP1_TXADDR 是专门的发送缓冲区,它的长度是有限的,而且是每 32 位编址中只有低
16 位有效;所以需要使用函数 UserToPMABufferCopy()操作这个发送缓冲区,这个函数已经
在 USB 库的手册中说明。

最后一个问题是:如果你的程序中使用了 ENDP1_RXADDR,因为你改变了 ENDP1 包的长
度,即改变了发送缓冲区的长度,需要在 usb_conf.h 中重新定义以下 ENDP1_RXADDR 的
地址。

//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
下面是我的部分程序 是在官方USB模拟串口程序上改的,专门用于测试发送状态下连续发送数据

u8 my_string[]={"2013我们希望\r\n"};

u16  myint=0;
inc_my_string()
{
myint++;
if(myint>9999)myint=0;
my_string[0]=myint/1000+'0';
my_string[1]=(myint00)/100+'0';
my_string[2]=(myint0)/10+'0';
my_string[3]=(myint)+'0';
}
//通过电脑发送的数据在EP3_OUT_Callback中可以获取到
//发向电脑的数据可以在USB_Send_Data函数中传送

int main(void)
{
  Init_System();//系统初始化
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  USB_Init();//初始化USB
  while (1)
  {
if (GetEPTxStatus(ENDP1) !=EP_TX_VALID)
//奇怪,我把这句换成if(GetEPTxStatus(ENDP1)== EP_TX_NAK)就会漏掉一些递增的数据搞不懂?没时间深究
           {
          inc_my_string();
          USB_Send_Data(my_string,14);//发送递增计数 看模拟的串口数据有没有漏掉的
}

}
}
继承事业,薪火相传
返回列表