[STM32/8经验] STM32 USB数据接收与数据发送
来源:互联网 发布:首字母大写php 编辑:程序博客网 时间:2024/05/16 00:59
在STM32的USB设备通信中,难度较大的还应是USB通信协议部分,但是这部分代码却并不是需要我们这些嵌入式工程师去实现,USB通信协议的内容已经交由STM32 USB-FS-Device Lib库实现,我们只要去关心具体的发送和接收函数在什么地方就可以了,而在初学阶段不必过多的关心USB协议的组成。
在usb_endp.c中,我们拿EP1_OUT_Callback()函数分析。
在usb_endp.c中,我们拿EP1_OUT_Callback()函数分析。
/*******************************************************************************
* Function Name : EP1_OUT_Callback.
* Description : 端点1输出回调函数
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP1_OUT_Callback(void)
{
* Function Name : EP1_OUT_Callback.
* Description : 端点1输出回调函数
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP1_OUT_Callback(void)
{
//PMA
//设置端点的接收状态为有效,因为端点接收到数据后会端点状态自动设置成停止状态
SetEPRxStatus(ENDP1, EP_RX_VALID);
USB_Received_Flag=1; //设置接收到数据标志位
}
}
这个函数的工作很简单,首先因为数输出端点,是接收数据的,而USB模块接收到的数据又是暂存在PMA双缓冲区中,所以要线把数据从PMA中读取出来,放到用户自己缓冲区中。接着设置端点接收状态有效,因为当接收数据后,端点就会被关闭。最后置位接收带数据标志。
发送比接收简单多了看看下面的代码就知道了。
/**
* @brief 通过USB发送数据
* @param data 数据存储首地址
* @param dataNum 发送的数据字节数
* @retval 发送的字节数
*/
uint32_t USB_SendData(uint8_t *data,uint32_t dataNum)
{
//将数据通过USB发送出去
UserToPMABufferCopy(data, ENDP2_TXADDR, dataNum);//拷贝数据到PMA中
SetEPTxCount(ENDP2, REPORT_COUNT); //从端点2发送64字节数据
SetEPTxValid(ENDP2); //使能端点2的发送状态
return dataNum;
}
* @brief 通过USB发送数据
* @param data 数据存储首地址
* @param dataNum 发送的数据字节数
* @retval 发送的字节数
*/
uint32_t USB_SendData(uint8_t *data,uint32_t dataNum)
{
//将数据通过USB发送出去
UserToPMABufferCopy(data, ENDP2_TXADDR, dataNum);//拷贝数据到PMA中
SetEPTxCount(ENDP2, REPORT_COUNT); //从端点2发送64字节数据
SetEPTxValid(ENDP2); //使能端点2的发送状态
return dataNum;
}
把要发送的数据拷贝到PMA中,之后设置端点计数,使能下端点,数据就发送出去了。
总结下:
数据发送:
UserToPMABufferCopy--->SetEPTxCount--->SetEPTxValid
UserToPMABufferCopy--->SetEPTxCount--->SetEPTxValid
数据接收:
USB_LP_CAN1_RX0_IRQHandler--->USB_Istr---->CTR_LP--->EPx_OUT_Callback
USB_LP_CAN1_RX0_IRQHandler--->USB_Istr---->CTR_LP--->EPx_OUT_Callback
0 0
- [STM32/8经验] STM32 USB数据接收与数据发送
- STM32 USB数据接收与数据发送程序流程分析
- STM32 USB数据接收与数据发送程序流程分析
- STM32 UART(接收 ,发送数据)
- STM32学习笔记之USB数据接收和发送流程分析
- STM32 串口发送数据
- STM32 HAL库 USB CDC程序只能接收一次数据
- 利用STM32 的串口来发送和接收数据实验
- STM32 USB数据发送完成的识别方法
- STM32接收不定长数据
- stm32 usb数据缓冲区疑问
- STM32 UART1 DMA 发送数据
- Stm32串口发送字节数据
- Stm32串口发送字符串数据
- STM32串口发送数据详解
- STM32串口接收不定长数据原理与源程序
- STM32串口接收不定长数据原理与源程序
- STM32串口接收不定长数据原理与源程序
- Android AndroidManifest 清单文件以及权限详解
- 获取数组中子串乘积的最大值
- Java之集合类应用总结
- 第4周、项目1—建立单链表
- 关于寻路算法的一些思考(10):最短路径的用户体验
- [STM32/8经验] STM32 USB数据接收与数据发送
- 第三周项目2 建设“顺序表”算法库
- daxpy dcopy计算
- Processes and Threads 进程与线程
- 拉伸图片:创建一个内容可拉伸,而边角不拉伸的图片
- 第四周 项目3-单链表应用
- IOS解析json报错-[__NSCFString objectFromJSONString]: unrecognized selector sent to 解决办法
- CSS visibility 属性
- Python执行cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)