在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
RT1010_EVK板子 主打了音频功能和USB功能。我们今天就通过MCUXpresso 来配置生成代码。
选择建好的工程,右击 管理组件
添加USB 组件
打开配置工具,配置USB对应的引脚
配置时钟:
添加外设组件到工程:
具体参数配置:
确定后,自动生成的对应的USB代码:
我们其余几乎不用管,只要对source里面的 "usb_device_interface_0_cic_vcom.h"和 "usb_device_interface_0_cic_vcom.c"c
2个文件进行修改调用即可:
我们看下C文件里面的代码:
其中最重要的就是USB中断的回调函数:
- /*!
- * @brief Function that processes class specific events.
- *
- * @param handle Handle to USB device class.
- * @param event Class event code.
- * @param param The parameter of the class specific event.
- * @return usb_status_t Status of USB transaction.
- */
- usb_status_t USB_DeviceInterface0CicVcomCallback(class_handle_t handle, uint32_t event, void *param)
- {
- uint32_t len;
- uint8_t *uartBitmap;
- usb_device_cdc_acm_request_param_struct_t *acmReqParam;
- usb_device_endpoint_callback_message_struct_t *epCbParam;
- usb_status_t error = kStatus_USB_Error;
- usb_cdc_acm_info_t *acmInfo = &s_usbCdcAcmInfo;
- acmReqParam = (usb_device_cdc_acm_request_param_struct_t *)param;
- epCbParam = (usb_device_endpoint_callback_message_struct_t *)param;
- switch (event)
- {
- case kUSB_DeviceCdcEventSendResponse:
- {
- if ((epCbParam->length != 0) && (!(epCbParam->length % g_UsbDeviceInterface1DicVcomSetting0DefaultEndpoints[USB_DIC_VCOM_IN_ENDPOINT_INDEX].maxPacketSize)))
- {
- /* If the last packet is the size of endpoint, then send also zero-ended packet,
- ** meaning that we want to inform the host that we do not have any additional
- ** data, so it can flush the output.
- */
- error = USB_DeviceCdcAcmSend(handle, USB_DIC_VCOM_IN_ENDPOINT, NULL, 0);
- }
- else if ((1 == s_UsbDeviceComposite->attach) && (1 == s_UsbInterface0CicVcom.startTransactions))
- {
- if ((epCbParam->buffer != NULL) || ((epCbParam->buffer == NULL) && (epCbParam->length == 0)))
- {
- /* User: add your own code for send complete event */
- /* Schedule buffer for next receive event */
- error = USB_DeviceCdcAcmRecv(handle, USB_DIC_VCOM_OUT_ENDPOINT, s_currRecvBuf,
- g_UsbDeviceInterface1DicVcomSetting0DefaultEndpoints[USB_DIC_VCOM_OUT_ENDPOINT_INDEX].maxPacketSize);
- #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
- defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
- defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
- s_waitForDataReceive = 1;
- USB0->INTEN &= ~USB_INTEN_SOFTOKEN_MASK;
- #endif
- }
- }
- else
- {
- }
- }
- break;
- case kUSB_DeviceCdcEventRecvResponse:
- {
- if ((1 == s_UsbDeviceComposite->attach) && (1 == s_UsbInterface0CicVcom.startTransactions))
- {
- s_recvSize = epCbParam->length;
- #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
- defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
- defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
- s_waitForDataReceive = 0;
- USB0->INTEN |= USB_INTEN_SOFTOKEN_MASK;
- #endif
- if (!s_recvSize)
- {
- /* Schedule buffer for next receive event */
- error = USB_DeviceCdcAcmRecv(handle, USB_DIC_VCOM_OUT_ENDPOINT, s_currRecvBuf,
- g_UsbDeviceInterface1DicVcomSetting0DefaultEndpoints[USB_DIC_VCOM_OUT_ENDPOINT_INDEX].maxPacketSize);
- #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
- defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
- defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
- s_waitForDataReceive = 1;
- USB0->INTEN &= ~USB_INTEN_SOFTOKEN_MASK;
- #endif
- }
- }
- }
- break;
- case kUSB_DeviceCdcEventSerialStateNotif:
- ((usb_device_cdc_acm_struct_t *)handle)->hasSentState = 0;
- error = kStatus_USB_Success;
- break;
- case kUSB_DeviceCdcEventSendEncapsulatedCommand:
- break;
- case kUSB_DeviceCdcEventGetEncapsulatedResponse:
- break;
- case kUSB_DeviceCdcEventSetCommFeature:
- if (USB_DEVICE_CDC_FEATURE_ABSTRACT_STATE == acmReqParam->setupValue)
- {
- if (1 == acmReqParam->isSetup)
- {
- *(acmReqParam->buffer) = s_abstractState;
- }
- else
- {
- *(acmReqParam->length) = 0;
- }
- }
- else if (USB_DEVICE_CDC_FEATURE_COUNTRY_SETTING == acmReqParam->setupValue)
- {
- if (1 == acmReqParam->isSetup)
- {
- *(acmReqParam->buffer) = s_countryCode;
- }
- else
- {
- *(acmReqParam->length) = 0;
- }
- }
- else
- {
- }
- error = kStatus_USB_Success;
- break;
- case kUSB_DeviceCdcEventGetCommFeature:
- if (USB_DEVICE_CDC_FEATURE_ABSTRACT_STATE == acmReqParam->setupValue)
- {
- *(acmReqParam->buffer) = s_abstractState;
- *(acmReqParam->length) = COMM_FEATURE_DATA_SIZE;
- }
- else if (USB_DEVICE_CDC_FEATURE_COUNTRY_SETTING == acmReqParam->setupValue)
- {
- *(acmReqParam->buffer) = s_countryCode;
- *(acmReqParam->length) = COMM_FEATURE_DATA_SIZE;
- }
- else
- {
- }
- error = kStatus_USB_Success;
- break;
- case kUSB_DeviceCdcEventClearCommFeature:
- break;
- case kUSB_DeviceCdcEventGetLineCoding:
- *(acmReqParam->buffer) = s_lineCoding;
- *(acmReqParam->length) = LINE_CODING_SIZE;
- error = kStatus_USB_Success;
- break;
- case kUSB_DeviceCdcEventSetLineCoding:
- if (1 == acmReqParam->isSetup)
- {
- *(acmReqParam->buffer) = s_lineCoding;
- }
- else
- {
- *(acmReqParam->length) = 0;
- }
- error = kStatus_USB_Success;
- break;
- case kUSB_DeviceCdcEventSetControlLineState:
- {
- s_usbCdcAcmInfo.dteStatus = acmReqParam->setupValue;
- /* activate/deactivate Tx carrier */
- if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_CARRIER_ACTIVATION)
- {
- acmInfo->uartState |= USB_DEVICE_CDC_UART_STATE_TX_CARRIER;
- }
- else
- {
- acmInfo->uartState &= (uint16_t)~USB_DEVICE_CDC_UART_STATE_TX_CARRIER;
- }
- /* activate carrier and DTE. Com port of terminal tool running on PC is open now */
- if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE)
- {
- acmInfo->uartState |= USB_DEVICE_CDC_UART_STATE_RX_CARRIER;
- }
- /* Com port of terminal tool running on PC is closed now */
- else
- {
- acmInfo->uartState &= (uint16_t)~USB_DEVICE_CDC_UART_STATE_RX_CARRIER;
- }
- /* Indicates to DCE if DTE is present or not */
- acmInfo->dtePresent = (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE) ? true : false;
- /* Initialize the serial state buffer */
- acmInfo->serialStateBuf[0] = NOTIF_REQUEST_TYPE; /* bmRequestType */
- acmInfo->serialStateBuf[1] = USB_DEVICE_CDC_NOTIF_SERIAL_STATE; /* bNotification */
- acmInfo->serialStateBuf[2] = 0x00; /* wValue */
- acmInfo->serialStateBuf[3] = 0x00;
- acmInfo->serialStateBuf[4] = 0x00; /* wIndex */
- acmInfo->serialStateBuf[5] = 0x00;
- acmInfo->serialStateBuf[6] = UART_BITMAP_SIZE; /* wLength */
- acmInfo->serialStateBuf[7] = 0x00;
- /* Notify to host the line state */
- acmInfo->serialStateBuf[4] = acmReqParam->interfaceIndex;
- /* Lower byte of UART BITMAP */
- uartBitmap = (uint8_t *)&acmInfo->serialStateBuf[NOTIF_PACKET_SIZE + UART_BITMAP_SIZE - 2];
- uartBitmap[0] = acmInfo->uartState & 0xFFu;
- uartBitmap[1] = (acmInfo->uartState >> 8) & 0xFFu;
- len = (uint32_t)(NOTIF_PACKET_SIZE + UART_BITMAP_SIZE);
- if (0 == ((usb_device_cdc_acm_struct_t *)handle)->hasSentState)
- {
- error = USB_DeviceCdcAcmSend(handle, USB_CIC_VCOM_IN_ENDPOINT, acmInfo->serialStateBuf, len);
- if (kStatus_USB_Success != error)
- {
- usb_echo("kUSB_DeviceCdcEventSetControlLineState error!");
- }
- ((usb_device_cdc_acm_struct_t *)handle)->hasSentState = 1;
- }
- /* Update status */
- if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_CARRIER_ACTIVATION)
- {
- /* To do: CARRIER_ACTIVATED */
- }
- else
- {
- /* To do: CARRIER_DEACTIVATED */
- }
- if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE)
- {
- /* DTE_ACTIVATED */
- if (1 == s_UsbDeviceComposite->attach)
- {
- s_UsbInterface0CicVcom.startTransactions = 1;
- #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
- defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
- defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
- s_waitForDataReceive = 1;
- USB0->INTEN &= ~USB_INTEN_SOFTOKEN_MASK;
- s_comOpen = 1;
- usb_echo("USB_APP_CDC_DTE_ACTIVATED\r\n");
- #endif
- }
- }
- else
- {
- /* DTE_DEACTIVATED */
- if (1 == s_UsbDeviceComposite->attach)
- {
- s_UsbInterface0CicVcom.startTransactions = 0;
- }
- }
- }
- break;
- case kUSB_DeviceCdcEventSendBreak:
- break;
- default:
- break;
- }
- return error;
- }
复制代码 对应POINT中断的事件都有对应的处理,我们可以将自己的中断事件,写入。
C文件里面还提供了一个实例TAST:
- /*!
- * @brief Interface task function.
- */
- void USB_DeviceInterface0CicVcomTask(void)
- {
- uint8_t tmpdata[DATA_BUFF_SIZE];
- uint8_t tmpdata2[DATA_BUFF_SIZE];
- int32_t i,j;
- usb_status_t error = kStatus_USB_Error;
- if ((1 == s_UsbDeviceComposite->attach) && (1 == s_UsbInterface0CicVcom.startTransactions))
- {
- /* User Code */
- if ((0 != s_recvSize) && (0xFFFFFFFFU != s_recvSize))
- {
- j=0;
- /* Copy Buffer to Send Buff */
- for (i = 0; i < s_recvSize; i++)
- {
- s_currSendBuf[s_sendSize++] = s_currRecvBuf[i];
- tmpdata[j++] = s_currRecvBuf[i];
- }
- s_recvSize = 0;
- }
- /* if (s_sendSize)
- {
- uint32_t size = s_sendSize;
- s_sendSize = 0;
- error = USB_DeviceCdcAcmSend(s_UsbInterface0CicVcom.cdcAcmHandle, USB_DIC_VCOM_IN_ENDPOINT, s_currSendBuf, size);
- if (error != kStatus_USB_Success)
- {
- // Failure to send Data Handling code here
- }
- }*/
- //命令格式SSXXPP XX代表数字
- if((tmpdata[0]==0x53)&&(tmpdata[1]==0x53)&&(tmpdata[j-2]==0x50)&&(tmpdata[j-1]==0x50))
- {
- //USB_DeviceCdcAcmSend(s_UsbInterface0CicVcom.cdcAcmHandle, USB_DIC_VCOM_IN_ENDPOINT, tmpdata, j);
- if(tmpdata[2]==0x31)
- {
- USB_CDC_SendStr("LED ON\r\n");
- }
- else if (tmpdata[2]==0x32)
- {
- USB_CDC_SendStr("LED OFF\r\n");
- }
- else
- {
- sprintf(tmpdata2,"CMD ERR,YOU SEND MESSAGE IS %s\r\n",tmpdata);
- USB_CDC_SendStr(tmpdata2);
- }
- tmpdata[0]=0;
- tmpdata[1]=0;
- }
- #if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
- defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
- defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
- if ((s_waitForDataReceive))
- {
- if (s_comOpen == 1)
- {
- /* Wait for all the packets been sent during opening the com port. Otherwise these packets may
- * wake up the system.
- */
- usb_echo("Waiting to enter lowpower ...\r\n");
- for (uint32_t i = 0U; i < 16000000U; ++i)
- {
- __ASM("NOP"); /* delay */
- }
- s_comOpen = 0;
- }
- usb_echo("Enter lowpower\r\n");
- BOARD_DbgConsole_Deinit();
- USB0->INTEN &= ~USB_INTEN_TOKDNEEN_MASK;
- USB_EnterLowpowerMode();
- s_waitForDataReceive = 0;
- USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK;
- BOARD_DbgConsole_Init();
- usb_echo("Exit lowpower\r\n");
- }
- #endif
- }
- }
复制代码 我们在这里修改也可以,目前默认的就是把接收到的数据再次发送回去。
我们可以对接收的数据进行分析,完成对应事件的处理。这样一个基于USB CDC的通讯系统就完成了。
这里封装了一个USB CDC的发送函数:
- void USB_CDC_SendStr(char* Str)
- {
- if(strlen(Str)>DATA_BUFF_SIZE) return;
- USB_DeviceCdcAcmSend(s_UsbInterface0CicVcom.cdcAcmHandle, USB_DIC_VCOM_IN_ENDPOINT,(uint8_t*) Str, strlen(Str));
- }
复制代码 然后我们在main函数while循环里面调用即可:
- USB_DeviceInterface0CicVcomTask();
复制代码 好了USB CDC的使用就到这里了。
|
|