打印
[STM32F1]

发送超过512字节数据

[复制链接]
1035|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangzj|  楼主 | 2015-9-29 20:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pc, ADDR, rc, se, ST
大家好,设备往PC发送数据时,发送函数是UserToPMABufferCopy(&data[index],ENDP1_TXADDR,64);  
我把data定义为512以内,即uint8_t data[512]的话,往PC发送都正常,但是超过512时,下载到STM32里,连USB都没法识别,更别说发送了,不知道是什么问题?
沙发
zwll| | 2015-9-29 20:56 | 只看该作者
其实你就是想知道如何发送大容量的数据吧

使用特权

评论回复
板凳
chuxh| | 2015-9-29 20:57 | 只看该作者
用 Web Service 是最佳的方式。。。

使用特权

评论回复
地板
kangzj|  楼主 | 2015-9-29 20:57 | 只看该作者
zwll 发表于 2015-9-29 20:56
其实你就是想知道如何发送大容量的数据吧

对,呵呵

使用特权

评论回复
5
juventus9554| | 2015-9-29 20:57 | 只看该作者
好像前面要几个什么关键字,具体的忘记了!!

使用特权

评论回复
6
kangzj|  楼主 | 2015-9-29 20:58 | 只看该作者
贴上主程序的源码,方便大神们指导,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(acketN>0acketN--)
                                {
                                        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;
            }
        }
        
}

使用特权

评论回复
7
司徒老鹰| | 2015-9-29 20:58 | 只看该作者
程序差东西吧

使用特权

评论回复
8
kangzj|  楼主 | 2015-9-29 20:58 | 只看该作者
chuxh 发表于 2015-9-29 20:57
用 Web Service 是最佳的方式。。。

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

使用特权

评论回复
9
仙女山| | 2015-9-29 22:01 | 只看该作者
没明白楼主什么意思啊

使用特权

评论回复
10
FireRiver9| | 2015-9-30 19:53 | 只看该作者
不然就切割分段发送吧

使用特权

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

本版积分规则

672

主题

7007

帖子

2

粉丝