打印
[应用相关]

STM32 USB数据接收与数据发送

[复制链接]
706|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
C洛达尔多|  楼主 | 2015-9-30 08:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32的USB设备通信中,难度较大的还应是USB通信协议部分,但是这部分代码却并不是需要我们这些嵌入式工程师去实现,USB通信协议的内容已经交由STM32 USB-FS-Device Lib库实现,我们只要去关心具体的发送和接收函数在什么地方就可以了,而在初学阶段不必过多的关心USB协议的组成。
    在usb_endp.c中,我们拿EP1_OUT_Callback()函数分析。
 /*******************************************************************************
* 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中读取出来,放到用户自己缓冲区中。接着设置端点接收状态有效,因为当接收数据后,端点就会被关闭。最后置位接收带数据标志。
    发送比接收简单多了看看下面的代码就知道了。
 /**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  通过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;  
}




沙发
C洛达尔多|  楼主 | 2015-9-30 08:37 | 只看该作者
把要发送的数据拷贝到PMA中,之后设置端点计数,使能下端点,数据就发送出去了。
     
    总结下:
    数据发送:
UserToPMABufferCopy--->SetEPTxCount--->SetEPTxValid           

数据接收:
 USB_LP_CAN1_RX0_IRQHandler--->USB_Istr---->CTR_LP--->EPx_OUT_Callback

使用特权

评论回复
板凳
fanxsd| | 2015-9-30 08:37 | 只看该作者
学习啦!!

使用特权

评论回复
地板
跟屁虫| | 2015-9-30 09:22 | 只看该作者
现在用USB的确实还是很多啊,谢谢楼主的分享

使用特权

评论回复
5
mmuuss586| | 2015-9-30 09:37 | 只看该作者

使用特权

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

本版积分规则

28

主题

236

帖子

0

粉丝