当前位置:首页 > 单片机 > 单片机
[导读]因为我看到STM32的USB都没有对发送状态进行检测,当多于传送缓冲器的数据要传送时,估计就会出错了,所以找下这篇文章,但没有找到原始作者,但也在此谢过了!STM32的多包数据传送(转贴)SMT32F103,根据例程 Custo

因为我看到STM32的USB都没有对发送状态进行检测,当多于传送缓冲器的数据要传送时,估计就会出错了,所以找下这篇文章,但没有找到原始作者,但也在此谢过了!

STM32的多包数据传送(转贴)

SMT32F103,根据例程 Custom_HID 修改,利用 EP1 以 EP_INTERRUPT 的方式发送包,

原来的例程每次发送 2 个字节,现在修改后包的长度不超过 64 字节时发送是正常的,但当

一个包长超过 64 字节时就发送失败,没有数据出来(程序没有死机),该改的地方都已经修

改了,不知道哪个地方还没有改到位,谢谢!

现 象 就 是 超 过 63 字 节 的 包 死 活 也 发 不 出 去 , 而 且 发 送 包 的 大 小 还 与

CustomHID_ConfigDescriptor 里面的 EP1 IN endpoint 描述里包大小有关 ,没道理啊,其他

的 MCU 这地方设置为 8 照样发送 256B 以上的包。

在 Custom_HID 例程上修改了如下代码:

1.usb_proc.c 的 CustomHID_Reset()里 SetEPTxCount(ENDP1, 64);

2.关闭 DMA 中断,不让 ADC 采样后发送 EP1 包

3.在 main.c 里 重复发送一个 128B 的包,

while(1){

for(i=0;i<2;i++)

{ SetEPTxAddr(ENDP1, ENDP1_TXADDR+i*64);

SetEPTxValid(ENDP1);

Delay(10000);

}

}

4. 由于一个包是 128B,最大包长是 64B,所以分两次发送出来,奇怪的是所有例程发送包

时都没有查发送状态的处理,也没有找到相应的状态等待函数,这样的话,是不是出现第一

个包还没有发送完,第二个包就冲掉了第一个包的数据?

5. 所以问题很简单,就是如何发送一个多数据包,发送函数要如何写?

以下是关于这个问题的解答:

分两次发送是对的,但关键是每次发送前需要检查上次发送是否完成。

检查一个端点的发送是否结束有 2 种方法,第一种方法是当发送结束(设备收到 ACK)时,有

一个发送结束中断,这个中断由 USB 库处理,并通过 EP1_IN_Callback 这个回调函数交由

用户程序确认,你可以搜索一下,例子中把 EP1_IN_Callback 定义为 NOP_Process,没有处

理这个回调事件。如果要用这种方法检测端点发送结束,你需要自己定义回调函数并做相应

处理。

检 测 端 点 发 送 结 束 的 另 一 个 方 法 是 查 询 这 个 端 点 的 状 态 , 如 果 端 点 状 态 处 于

EP_TX_VALID,说明发送未结束,如果端点状态处于 EP_TX_NAK,说明发送结束。使用

下述调用可以得到端点 1 的发送状态:

GetEPTxStatus(ENDP1)

按照你的思路,可以使用第二种方法实现发送多个数据包的功能。

假定要发送 150 个字节的 MyBuffer,EP1 的最大包长设为 64 字节。

u8 MyBuffer[150];

int packetN;

packetN = 3;

while (1) {

if (packetN < 3) { // 有数据需要发送时置 packetN 为'0'

if (GetEPTxStatus(ENDP1) == EP_TX_NAK) {

if (packetN == 0) { // 拷贝头 64 字节到发送缓冲区

UserToPMABufferCopy(MyBuffer, ENDP1_TXADDR, 64);

SetEPTxCount(ENDP1, 64);

}

else if (packetN == 1) { // 拷贝第 2 个 64 字节到发送缓冲区

UserToPMABufferCopy(MyBuffer+64, ENDP1_TXADDR, 64);

SetEPTxCount(ENDP1, 64);

}

else if (packetN == 2) { // 拷贝最后 22 字节到发送缓冲区

UserToPMABufferCopy(MyBuffer+128, ENDP1_TXADDR, 22);

SetEPTxCount(ENDP1, 22);

}

packetN++;

SetEPTxStatus(ENDP1, EP_TX_VALID);

}

}

...... // 其它操作

}

这里使用了一个变量记录应该发送第几个数据包,当程序的其它部分准备好数据后只要设置

这个变量 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我们希望rn"};

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);//发送递增计数 看模拟的串口数据有没有漏掉的

}

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

2025年8月13日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 即日起开售Asahi Kasei Microdevices (AKM) 的...

关键字: 数模转换器 USB 无线扬声器

物联网与智能化设备快速普及,供电方式的选择直接影响设备部署的灵活性、成本与可靠性。PoE(以太网供电)与USB供电作为两大主流技术,分别在工业网络、智能家居、消费电子等领域占据关键地位。本文将从设备适配性、传输距离、功率...

关键字: PoE USB

在无线技术的发展历程中,部署的简便性往往是成功的关键。像Wi-Fi、蓝牙和早期的蜂窝技术,只有在集成变得简单、无缝且实惠时,才能实现大规模的应用。而如今,Wi-Fi HaLow——一种专为物联网(IoT)设计的远距离、低...

关键字: 物联网 Wi-Fi USB

2025年8月5日 – 专注于引入新品的全球电子元器件和工业自动化产品授权代理商贸泽电子 (Mouser Electronics)即日起开售Microchip Technology的新款AVR® SD 8位MCU。AVR...

关键字: MCU 工业自动化 USB

随着高解析度音频应用的不断发展和广泛部署,诸如USB与I2S之间等不同专业接口之间的高品质音频转换需求日益增长,由此带来了实现高性能、高实时性与高灵活性的新挑战。为此,边缘AI和智能音频专家XMOS携手其全球首家增值分销...

关键字: SoC USB 处理器

【2025年7月24日, 德国慕尼黑讯】全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)近日推出新型英飞凌ID Key系列,进一步扩展其通用串行总线(USB)...

关键字: 控制器 USB 非易失性存储器

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强
关闭