Funpack第十一期--基于LPC55S69-EVK的USB-UART Hub
使用LPC55S69-EVK完成了任务三,实现了SB-UART Hub
标签
嵌入式系统
冷月烟
更新2021-10-20
1245

1.任务目的

实现USB-UART Hub,自己设计通信方式,实现USB到多路UART的收发。

 

2.硬件介绍

FiPUfR_Wv2ETeW9oH7EC4Lg2mnsi

Fg5Gq0Z993M-wcX5-ERAyYIGsCcY

 

3.MCUXpresso Config Tools配置

NXP提供了MCUXpresso Config Tools v10这个非常方便的配置工具,可以快速生成IO初始化以及外设初始化的代码。这里我的主要配置如下:

 

IO初始化

FuqkB6ZhOq4UUBK5hy5Z2RxCYbZ9

配置了两个串口以及USB使用的IO。

 

时钟树

Fhd_ZDGF1UTBjtYTUrD5o6wphV2s

主时钟来源是外部的32MHz的晶振,通过PLL0分频倍频,主频为150MHz。

 

FgeXOneHMPePugIjKXY9qdTZ-A0V

USB时钟来源是内部的96MHz时钟二分频后得到48MHz。

 

FiFpwplWJo6AVRcVx3jX-r8p6Rg7

串口时钟来源也是内部的96MHz时钟二分频后得到48MHz。

 

外设初始化配置

FsPpZkTMDd9D4MPG33l0okzfZfwf

这里将USB配置为从模式,并支持两个串口。

 

FupoLRh-42UxUZnfGbHNQHzCHq0t

将串口配置为115200的频率。并使能收发。

 

4.主要代码

串口中断事件处理

当接受到串口发来的数据的时候,就会通过USB把数据发出去。

/* FLEXCOMM0_IRQn interrupt handler */
void FLEXCOMM0_FLEXCOMM_IRQHANDLER(void) {
  /*  Place your code here */
    uint8_t data;
    /* If new data arrived. */
    if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(FLEXCOMM0_PERIPHERAL))
    {
        data = USART_ReadByte(FLEXCOMM0_PERIPHERAL);
        (void)USB_DeviceCdcAcmSend(s_UsbInterface0CicVcom.cdcAcmHandle, USB_DIC_VCOM_IN_ENDPOINT, &data, 1);
    }
  /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
     Store immediate overlapping exception return operation might vector to incorrect interrupt. */
  #if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
  #endif
}

 

USB接受到数据事件处理

当接受到USB来的数据的时候,就会调用串口的发送将数据给出去。

void USB_DeviceInterface0CicVcomTask(void)
{
    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))
        {
            int32_t i;

            /* Copy Buffer to Send Buff */
            for (i = 0; i < s_recvSize; i++)
            {
                s_currSendBuf[s_sendSize++] = 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, NULL, 0);
            if (error != kStatus_USB_Success)
            {
                /* Failure to send Data Handling code here */
            }
            USART_WriteBlocking(FLEXCOMM0_PERIPHERAL, s_currSendBuf, size);
            
        }
    }
}

 

5.实际演示

接到电脑上时会出现两个串口设备。接上串口模块之后可以实现互相发送。

Fsu6R8b9hlZvlkWrhpT0qLwCQjTB

6.总结感想

作为一款通用性的芯片,而且是第一款M33内核的芯片,LPC55S69实在有太多东西值得挖掘。本身我也是NXP很忠实的用户,每一款新的MCU都会去尝尝鲜。不得不说,LPC55S69的表现确实很棒。

 

7.意见建议

这次活动挺好的,期待下一次的板卡。

附件下载
程序.zip
团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号