打印
[STM32F1]

STM32怎样利用发送超过512字节数据

[复制链接]
1810|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
为爱一拼|  楼主 | 2014-12-28 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,设备往PC发送数据时,发送函数是UserToPMABufferCopy(&data[index],ENDP1_TXADDR,64);  
我把data定义为512以内,即uint8_t data[512]的话,往PC发送都正常,但是超过512时,下载到STM32里,连USB都没法识别,更别说发送了,不知道是什么问题?
沙发
为爱一拼|  楼主 | 2014-12-28 20:59 | 只看该作者
自己先顶一个,其实我的问题就是如何发送大容量的数据

使用特权

评论回复
板凳
搞IT的| | 2014-12-28 23:58 | 只看该作者
用 Web Service 是最佳的方式。。。

使用特权

评论回复
地板
小浣熊| | 2014-12-29 18:01 | 只看该作者
好像前面要几个什么关键字,具体的忘记了!!

使用特权

评论回复
5
为爱一拼|  楼主 | 2014-12-29 18:26 | 只看该作者
贴上主程序的源码,方便大神们指导,uint8_t   data2[512]这里定义超过512的话,程序下到STM32里,PC就不识别STM32的USB了
#include "main.h"
#include "usart.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usbio.h"
extern volatile uint32_t EP1_ReceivedCount;
extern volatile uint32_t EP2_ReceivedCount;

int main(void)
{
  uint16_t  data[256],index;
        uint8_t   data2[512],PacketN,PacketM;
        uint16_t num = 0;
        uint16_t i=0,j=0;
        Set_System();//系统时钟初始化

        USB_Interrupts_Config();
        Set_USBClock();
        USB_Init();
  
        for(i=0;i<256;i++)
        {
                data[i] = i+256;
        }
        for(i=0,j=0;j<256;j++)
        {
                 data2[i] = (uint8_t)(data[j] & 0x00ff);
                 data2[i+1] = (uint8_t)((data[j] >> 8)&0x00ff);
                 i=i+2;               
        }
        PacketN = 8;
        PacketM = 0;
        index = 0;



        while(1)
        {               
                        if(EP1_ReceivedCount > 0)
                        {
                                for(;PacketN>0;PacketN--)
                                {
                                        while(EP_TX_NAK!=GetEPTxStatus(ENDP1));                                        //等待硬件置位端点为EP_TX_NAK(这一条语句很重要)
                                        UserToPMABufferCopy(&data2[index],ENDP1_TXADDR,64);
                                        SetEPTxCount(ENDP1, 64);
                                        SetEPTxValid(ENDP1);
                                        index+=64;
                                }

                                if(PacketM!=0)                                                                           //如果不是64的倍数,就要发送剩余的数据
                                {
                                        while(EP_TX_NAK!=GetEPTxStatus(ENDP1));                                        //等待硬件置位端点为EP_TX_NAK(这一条语句很重要)
                                        UserToPMABufferCopy(&data2[index],ENDP1_TXADDR,PacketM);
                                        SetEPTxCount(ENDP1, PacketM);
                                        SetEPTxValid(ENDP1);         
                                }
                                else                                                                                           //如果是64的倍数,则需要再发一0长度的包
                                {
                                        while(EP_TX_NAK!=GetEPTxStatus(ENDP1));                                        //等待硬件置位端点为EP_TX_NAK
                                        UserToPMABufferCopy(&data2[index],ENDP1_TXADDR,0);
                                        SetEPTxCount(ENDP1, 0);
                                        SetEPTxValid(ENDP1);
                                }
                                index=0;
            }
        }
       
}

使用特权

评论回复
6
为爱一拼|  楼主 | 2014-12-29 18:27 | 只看该作者
小浣熊 发表于 2014-12-29 18:01
好像前面要几个什么关键字,具体的忘记了!!

你好,关键字?我把源码贴在楼上了~~请大神帮忙看下:handshake

使用特权

评论回复
7
为爱一拼|  楼主 | 2014-12-29 18:27 | 只看该作者
搞IT的 发表于 2014-12-28 23:58
用 Web Service 是最佳的方式。。。

这个不太懂哦,我就是bulk传输,下边的源程序发送512都是OK的

使用特权

评论回复
8
kekeke| | 2014-12-29 20:59 | 只看该作者
用 Web Service

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

21

帖子

0

粉丝