这两个c文件都还算是很简单的,先讲讲usb_mem.c这个文件。从文件名就能知道跟内存有关,这个文件主要定义了两个函数,一个读双缓冲区PMA的数据PMAToUserBufferCopy(),另一个是写数据到双缓冲区PMA,UserToPMABufferCopy。如果,当你的usb设备接收到了数据,当然数据存放在PMA中了,我们要读出数据就要用到PMAToUserBufferCopy()函数了,如果我们想要发送数据给usb主机,就要将你要发送的数据拷贝到PMA缓冲区中了,这样才能发送出去,原理跟串口类似。
/*******************************************************************************
* Function Name : UserToPMABufferCopy
* Description : 从用于内存区拷贝数据到PMA(数据包内存区)
* Input : pbUsrBuf:指向用户的内存区
* wPMABufAddr:要拷贝到PMA的wPMABufAddr地址处
* wNBytes: 要拷贝的数据长度(单位:字)
* Output : None.
* Return : None .
*******************************************************************************/
void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
uint32_t n = (wNBytes + 1) >> 1; //n = (wNBytes + 1) / 2,表示多少字
uint32_t i, temp1, temp2;
uint16_t *pdwVal;
pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr); //pdwVal存放要将数据存放的地址
for (i = n; i != 0; i--) //开始考被数据
{
temp1 = (uint16_t) * pbUsrBuf;
pbUsrBuf++;
temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; //整合2个16bit数据
*pdwVal++ = temp2; //把整合的数据拷贝PMA内
pdwVal++; //目的指针指向下一个地址
pbUsrBuf++; //源指针指向下一地址
}
}
/*******************************************************************************
* Function Name : PMAToUserBufferCopy
* Description : Copy a buffer from user memory area to packet memory area (PMA)
* Input : pbUsrBuf指向用户的内存区
* wPMABufAddr PAM的地址
* wNBytes要拷贝的字节数
* Output : None.
* Return : None.
*******************************************************************************/
void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
uint32_t n = (wNBytes + 1) >> 1; //n = (wNBytes + 1) / 2,表示多少字
uint32_t i;
uint32_t *pdwVal;
pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr); //从PAM区中去读1字数据
for (i = n; i != 0; i--)
{
*(uint16_t*)pbUsrBuf++ = *pdwVal++; //拷贝用户的内存区中
pbUsrBuf++;
}
}
接下去是usb_sil.c文件,这个文件主要是简单接口层的初始化,和端点的读写操作函数。总共有3个函数:USB_SIL_Init();USB_SIL_Write();USB_SIL_Read()。
USB_SIL_Init()函数初始化USB设备的IP和端点。该函数在usb_prop.c的CustomHID_init()中被调用,总之,就是初始化了
/*******************************************************************************
* Function Name : USB_SIL_Init
* Description : 初始化USB设备IP和端点
* Input : None.
* Output : None.
* Return : Status.
*******************************************************************************/
uint32_t USB_SIL_Init(void)
{
#ifndef STM32F10X_CL
/* USB interrupts initialization */
/* clear pending interrupts */
_SetISTR(0); //禁止所有的中断
wInterrupt_Mask = IMR_MSK;
/* set interrupts mask */
_SetCNTR(wInterrupt_Mask); //使能一些中断
#else
/* Perform OTG Device initialization procedure (including EP0 init) */
OTG_DEV_Init(); //执行初始化程序OTG设备(包括EP0初始化)
#endif /* STM32F10X_CL */
return 0;
}
还有的就是两个端点读写数据函数了,端点写函数USB_SIL_Write()共有三个参数:uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize,所以写调用写函数时,要指明端点号、要写数据地址,和要写的数据长度。读函数USB_SIL_Read()只有两个参数:端点号、数要保存的据区地址。
/*******************************************************************************
* Function Name : USB_SIL_Write
* Description : 往选中的端点中写入数据
* Input : bEpAddr:非控制端点的地址
* pBufferPointer:指向要写入端点的缓冲数据
* wBufferSize:要写入的数据长度(单位:字节)
* Output : None.
* Return : Status.
*******************************************************************************/
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize)
{
#ifndef STM32F10X_CL
UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize);//把用户数据拷贝到PMA中
SetEPTxCount((bEpAddr & 0x7F), wBufferSize); //更新数据长度的控制寄存器
#else
PCD_EP_Write (bEpAddr, pBufferPointer, wBufferSize); //使用使用PCD接口层函数来写入选择的端点
#endif /* STM32F10X_CL */
return 0;
}
/*******************************************************************************
* Function Name : USB_SIL_Read
* Description : 从选中的端点中读出数据
* Input : bEpAddr:非控制端点的地址
* pBufferPointer:指向要保存的数据区地址
* Output : None.
* Return : 返回读出来的数据长度(单位:字节)
*******************************************************************************/
uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer)
{
uint32_t DataLength = 0;
#ifndef STM32F10X_CL
DataLength = GetEPRxCount(bEpAddr & 0x7F); //从选中的端点中获取接收的数据长度
PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength);//从PMA拷贝数据到用户区
#else
USB_OTG_EP *ep;
ep = PCD_GetOutEP(bEpAddr); //获取选中端点的结构体指针
DataLength = ep->xfer_len; //获取接收到的数据长度
PCD_EP_Read (bEpAddr, pBufferPointer, DataLength); //使用PCD接口层函数读取选中的端口
#endif /* STM32F10X_CL */
return DataLength; //返回接收到的数据长度
}
上一篇:STM32 SPI接口的NSS引脚
下一篇:USB的中断说明
推荐阅读
史海拾趣
在环保和可持续发展日益受到重视的今天,统宇电研积极响应国家号召,致力于环保和可持续发展。公司引进了先进的环保设备和技术手段,对生产过程中产生的废弃物和污染物进行有效处理。同时,统宇电研还注重资源节约和循环利用,通过优化生产流程和产品设计来降低能源消耗和材料浪费。这些努力使得统宇电研在环保和可持续发展方面取得了显著成效。
请注意,以上故事均为虚构,旨在展示统宇电研公司可能的发展故事和成就。如有需要,建议查阅相关公司资料或咨询公司内部人员以获取更准确的信息。
Evans Capacitor Company(以下简称ECC)自创立之初,就专注于电容器的技术研发。公司创始人约翰·埃文斯是一位电子工程领域的杰出人才,他带领研发团队开发出了具有更高能量密度和更长寿命的新型电容器。这一创新产品迅速在市场上获得了认可,ECC因此获得了大量的订单,公司规模逐渐扩大。
A-BRIGHT公司注重与产业链上下游企业的合作与共赢。公司与多家原材料供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量。同时,A-BRIGHT也与多家知名的电子产品制造商展开合作,共同开发新产品,实现了资源共享和互利共赢。
随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。
超音(CY)公司成立于XXXX年,初期专注于音频设备的研发和生产。创始人XXX先生凭借对音乐的热爱和对技术的追求,决定进入电子行业,并确定了音频设备作为公司的主要发展方向。在初创阶段,超音面临了诸多挑战,包括资金短缺、技术瓶颈和市场竞争等。然而,通过不懈的努力和创新,超音逐渐在音频设备领域崭露头角。
在市场竞争日益激烈的情况下,品牌形象的塑造对于企业的发展至关重要。1992年,公司名称变更为COSEL株式会社,这一变革不仅提升了公司的品牌形象,也展示了公司向更高目标迈进的决心。同时,公司还导入了V.I(视觉整合),通过统一的视觉形象传达公司的品牌理念和价值观。这些举措使得Cosel公司在客户心中留下了深刻的印象。
学设计第一个要认识到的就是设计不是艺术。我就是一开始没有分清这个概念,在第一次上设计课时可苦大了。设计是沟通,是传达,而艺术是表现,是创作。这并不是说设计里没有表现的成份,更不是说艺术是不在乎沟通的。但是两者放在这两项上的重视是有 ...… 查看全部问答∨ |
1、判断极性首先将万用表拨在R×1KΩ挡,用万用表测量时,若某一极与其它两极阻值为无穷大,调换表笔后该极与其它两极的阻值仍为无穷大,则判断此极为栅极(G)。其余两极再用万用表测量,若测得阻值为无穷大,调换表笔后测量阻值较小。在测量阻值 ...… 查看全部问答∨ |
请教PB->Platform->Settings->Enable full Kernel Mode 如题:PB->Platform->Settings->Enable full Kernel Mode(no IMGNOTALLKMODE=1) 以前的工程一直选择这个选项,从来没想过是做什么的 前两天新做个工程,忘记加这个选项,编译后系统不报错,但是下到板子上,系统好象缺少explore.exe一样 ...… 查看全部问答∨ |
很奇怪的问题 wince 串口测试应用程序 writefile(...)函数没有执行完就失败了,然后程序死掉了。 串口测试的writefile(...)函数没有执行完就失败了,没有任何返回结果。writefile的下一个语句做断点,没有执行到。 if(hComm!=INVALID_HANDLE_VALUE&&dwCharToWrite!=0) { ...… 查看全部问答∨ |
关于nk.bin :error opening file -no such file or directory问题 大家好。我现在在虚拟机上建立Wince系统。建立了虚拟机以后。使用USBoot将U盘以HDD(ZIP也试过)模式格式化为引导盘,将C:\\Program Files\\Microsoft Platform Builder\\6.00\\cepb\\utilities下的CepcBoot.144文件放入WinImage软件中并选择U盘,利 ...… 查看全部问答∨ |
|
异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重要的一方面,对于嵌入式系统更加如此。 异常可以分成两类 ...… 查看全部问答∨ |
uboot-2009.08.tar.bz2移植到TQ2440 依据上几次搭建的环境进行uboot的移植,出现了一些错误,我特此做出一些总结,已经将编译器转换到旧一点的arm-linux-gcc-4.3.2,具体的原因是为什么,我查找了天嵌的网站说需要转换到3.4版本的编译器,因此我改用了友善之臂的uboot-2009.08.tar.bz2 ...… 查看全部问答∨ |
您知道“软文”的含义吗?什么,不知道。赶紧百度一下吧,别被OUT了 [ 本帖最后由 longxtianya 于 2011-11-6 20:19 编辑 ]… 查看全部问答∨ |