当前位置:网站首页>Ch549 / ch548 notes d'apprentissage 9 - procédure de traitement des paramètres du périphérique USB
Ch549 / ch548 notes d'apprentissage 9 - procédure de traitement des paramètres du périphérique USB
2022-07-19 16:12:00 【Pq113 6.】
Table des matières
Traitement du paramètre le plus important est le paramètre0Processus de traitement,Attention aux paramètres0Et les paramètres4La fonction de basculement automatique des bits de synchronisation n'est pas prise en charge.
1. Lecture finale
Quand l'hôteOUTAprès les données,La puce placera les données sur les paramètres correspondantsbufferMoyenne,Alors, lisez çabufferPour obtenir les données correspondantes.Attention!,Dans les deux sensbufferLa première moitié estOUT Buffer.Et les longueurs de données valides partagent un registreUSB_RX_LEN.
uint8_t usbReadBuf(uint8_t port, uint8_t* buf, uint8_t len)
{
xdata uint8_t *pUsbBuf[] =
{
usbEp0Buffer,
#if(EP1_OUT_MEM_SIZE > 0)
usbEp1Buffer,
#else
NULL,
#endif
#if(EP2_OUT_MEM_SIZE > 0)
usbEp2Buffer,
#else
NULL,
#endif
#if(EP3_OUT_MEM_SIZE > 0)
usbEp3Buffer,
#else
NULL,
#endif
#if(EP4_OUT_MEM_SIZE > 0)
usbEp4Buffer,
#else
NULL,
#endif
};
uint8_t length;
if(port > USB_EP_MAX)
return 0;
if(len > USB_RX_LEN)
length = USB_RX_LEN;
if(pUsbBuf[port] != NULL)
{
memcpy(buf, pUsbBuf[port], length);
}
return length;
}2. Le paramètre écrit
Copier les données dans le tampon du paramètre correspondant , Ensuite, définissez le registre de longueur d'envoi pour le paramètre UEPn_T_LEN,Réglage FinalUEPn_CTRL Le registre permet d'envoyer .
uint8_t usbWriteBuf(uint8_t port, uint8_t* buf, uint8_t len)
{
uint8_t length = 0;
switch(port)
{
case 0:
length = (len > EP0_IN_MEM_SIZE) ? len : EP0_IN_MEM_SIZE;
memcpy(usbEp0Buffer, buf, len);
UEP0_T_LEN = length;
UEP0_CTRL = (UEP0_CTRL & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
break;
#if (EP1_IN_MEM_SIZE > 0)
case 1:
length = (len > EP1_IN_MEM_SIZE) ? len : EP1_IN_MEM_SIZE;
memcpy(usbEp1Buffer + EP1_OUT_MEM_SIZE, buf, len);
UEP1_T_LEN = length;
UEP1_CTRL = (UEP1_CTRL & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
break;
#endif
#if (EP2_IN_MEM_SIZE > 0)
case 2:
length = (len > EP2_IN_MEM_SIZE) ? len : EP2_IN_MEM_SIZE;
memcpy(usbEp2Buffer + EP2_OUT_MEM_SIZE, buf, len);
UEP2_T_LEN = len;
UEP2_CTRL = (UEP2_CTRL & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
break;
#endif
#if (EP3_IN_MEM_SIZE > 0)
case 3:
length = (len > EP3_IN_MEM_SIZE) ? len : EP3_IN_MEM_SIZE;
memcpy(usbEp3Buffer + EP3_OUT_MEM_SIZE, buf, len);
UEP3_T_LEN = length;
UEP3_CTRL = (UEP3_CTRL & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
break;
#endif
#if (EP4_IN_MEM_SIZE > 0)
case 4:
length = (len > EP4_IN_MEM_SIZE) ? len : EP4IN_MEM_SIZE;
memcpy(usbEp4Buffer + EP4_OUT_MEM_SIZE, buf, len);
UEP4_T_LEN = length;
UEP4_CTRL = (UEP4_CTRL & ~ MASK_UEP_T_RES) | UEP_T_RES_ACK;
break;
#endif
}
return length;
}3. SETUPProcessus
Traitement des interruptions correspondantes case UIS_TOKEN_SETUPSituation.
3.1 PRESETNAK
UEP0_CTRL = UEP0_CTRL & (~MASK_UEP_T_RES )| UEP_T_RES_NAK;ParamètresNAKIndique le paramètre0Je suis occupé..
3.2 TraitementSETUPDonnées
Cette étape est la même que pour les autres traitements de puces .
3.3 ParamètresACK
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;SETUPÇa doit l'être.DATA0,Donc iciCTRLSet to DATA1,Et la restaurationACKStatut.
CompletSetupLe processus est le suivant:
case UIS_TOKEN_SETUP:
if(ep != 0)
break;
if(USB_RX_LEN != (sizeof(gUsbReqInfo)))
{
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL
break;
}
usbReadBuf(USB_EP0, (uint8_t *)(&gUsbReqInfo), sizeof(gUsbReqInfo));
UEP0_CTRL = UEP0_CTRL & (~MASK_UEP_T_RES )| UEP_T_RES_NAK;
//SetupProcessus de traitement
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //Default DATA1 and return ACK
break;4. INProcessus
Traitement des interruptions correspondantes case UIS_TOKEN_INSituation, Ce processus est divisé en points d'extrémité 0 Et d'autres paramètres .
Point final0Et les paramètres4 Ne supporte pas l'inversion automatique des bits de synchronisation , Donc pour ajouter la commande Flip correspondante .Point final0 Lorsque les données sont supérieures à 0 Seulement si .
case UIS_TOKEN_IN:
if(ep == 0)
{
if(gUsbReqInfo.wLength > 0)
UEP0_CTRL ^= bUEP_T_TOG;
//Point final0 INFonctionnement
}
else
{
void(*usbEpnIntUser[])(void) =
{
usbEp1InUsr,
usbEp2InUsr,
usbEp3InUsr,
usbEp4InUsr,
};
if(ep == 4)
UEP4_CTRL ^= bUEP_T_TOG;
(*usbEpnIntUser[ep - 1])();
}
break;5. OUTProcessus
Traitement des interruptions correspondantes case UIS_TOKEN_OUTSituation,EtINSimilaire.
case UIS_TOKEN_OUT:
if(ep == 0)
{
UEP0_CTRL ^= bUEP_R_TOG;
//Point final0 OUTProcessus de traitement
}
else
{
void(*usbEpnIntUser[])(void) =
{
usbEp1OutUsr,
usbEp2OutUsr,
usbEp3OutUsr,
usbEp4OutUsr,
};
if(ep == 4)
UEP4_CTRL ^= bUEP_R_TOG;
(*usbEpnIntUser[ep - 1])();
}
break;边栏推荐
- Advanced customization of uni app [day13]
- Typescript中对象扩展之动态添加方法与属性修改
- 深度学习环境配置Pytorch
- Sort subsequence and inverted string
- uniapp授权登陆获取用户信息和code
- Woman Yelling At a Cat
- BFD of HCNP Routing & Switching
- Solidworks装配体常见问题汇总(随时更新)
- Excel文件数据导入到MySQL数据库
- Definition and usage of callback function and qsort function in C language
猜你喜欢

Solidworks装配体常见问题汇总(随时更新)

从电机辐射的干扰信号

Solve the problem of "license manager error -8" after matlab installation (the personal test is valid)

ArkUI开发框架组件的生命周期详解

Import excel file data into MySQL database

手写简易Promise代码注释

Anaconda的基本使用与在Pycharm中使用

Mogdb/opengauss permission collation

Liquibase learning 1 - installation, simple use

Sort subsequence and inverted string
随机推荐
Liquibase学习 - 问题解决:启动报错
ArkUI开发框架组件的生命周期详解
[projet de simulation MCU] feu d'alarme (schéma Proteus + Code clé)
Rap phenomenon in wisdom tooth extraction
UGUI源码解析——ClipperRegistry
力扣 565. 数组嵌套
ArrayList源码解析一
使用 QuickExec fiddler命令行
【单片机仿真项目】广告灯(proteus原理图+keil代码)
WPF效果第一百九十二篇之TreeView支持多选
Liquibase learning 3 - loglevel log level, common commands
阿里云OSS图床搭建方法
2022/07 CSI tool installation process record
A long distance
About the problem that only one IP can be accessed after dual network cards are configured
Liquibase学习1 - 安装、简单使用
Is flush stock trading safe?
A few lines of code, let black and white old photos regain their vitality!
Mogdb/opengauss permission collation
我,35岁了。