123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- /* Copyright Statement:
- *
- * This software/firmware and related documentation ("AutoChips Software") are
- * protected under relevant copyright laws. The information contained herein is
- * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
- * the prior written permission of AutoChips inc. and/or its licensors, any
- * reproduction, modification, use or disclosure of AutoChips Software, and
- * information contained herein, in whole or in part, shall be strictly
- * prohibited.
- *
- * AutoChips Inc. (C) 2022. All rights reserved.
- *
- * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
- * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
- * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
- * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
- * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
- * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
- * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
- * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
- * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
- * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
- * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
- * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
- * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
- * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
- * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
- * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
- * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
- * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
- */
- /******************************************************************************
- * @version: V2.0.1 AC7840x Demo
- ******************************************************************************/
- #include "uart.h"
- #include "string.h"
- #include "ckgen_drv.h"
- #include "ckgen_hw.h"
- #include "gpio_drv.h"
- #include "gpio_hw.h"
- #include "uart_drv.h"
- #include "uart_hw.h"
- #include "uart_irq.h"
- #include "dma_drv.h"
- #include "dma_hw.h"
- #include "cfg.h"
- #define UART1_RX_DMA_CHANNEL 0
- #define UART1_TX_DMA_CHANNEL 1
- #define UART1_INSTANCE_ID 1
- //#define UART_DATA_LEN 4 /*数据传输长度*/
- uart_state_t s_uartState = {NULL}; /*UART运行变量状态*/
- UART_INFO uart1_info;
- uint32_t dmaRxBuf[UART1_RECV_DATA_POOL_COUNT>>2];
- uint32_t dmaTxBuf[UART1_TRANSMIT_DATA_POOL_COUNT>>2];
- //uint8_t g_sendflag = 0;
- void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam);
- void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam);
- /* UART rx DMA channel config */
- dma_channel_config_t s_uartRxDmaChConfig =
- {
- .channelPriority = DMA_CHN_PRIORITY_LOW,
- .virtChnConfig = UART1_RX_DMA_CHANNEL,
- .source = DMA_REQ_UART1_RX,
- .callback = (dma_callback_t)UART_RxDMAEventCallback,
- .callbackParam = NULL,
- .enableTrigger = false,
- };
- /* UART tx DMA channel config */
- dma_channel_config_t s_uartTxDmaChConfig =
- {
- .channelPriority = DMA_CHN_PRIORITY_LOW,
- .virtChnConfig = UART1_TX_DMA_CHANNEL,
- .source = DMA_REQ_UART1_TX,
- .callback = (dma_callback_t)UART_TxDMAEventCallback,
- .callbackParam = NULL,
- .enableTrigger = false,
- };
- dma_chn_state_t s_uartRxDmaChState =
- {
- .virtChn = UART1_RX_DMA_CHANNEL, /* dma virtual channel */
- .status = DMA_CHN_NORMAL, /* dma channel normal */
- .callback = NULL, /* no callback function */
- };
- /* UART tx dma channel state */
- dma_chn_state_t s_uartTxDmaChState =
- {
- .virtChn = UART1_TX_DMA_CHANNEL, /* dma virtual channel */
- .status = DMA_CHN_NORMAL, /* dma channel normal */
- .callback = NULL,
- };
- dma_state_t g_dma_state;
- typedef enum
- {
- UART_RX_INIT = 1,
- UART_RX_DATA = 2,
- UART_RX_FINISH = 3,
- UART_TX_STA = 4,
- } uart_rx_step_t;
- uart_rx_step_t g_uartRxStep = UART_RX_INIT;
- /*!
- * @brief Uart transmit event callback
- * @param[in] DMAx: DMA_Type pointer
- * @param[in] wparam: reserve for user's code
- * @param[in] lparam: reserve for user's code
- * @return none
- */
- void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam)
- {
- }
- /*!
- * @brief Uart dma receive handle
- * @param[in] DMAx: DMA_Type pointer
- * @param[in] wparam: reserve for user's code
- * @param[in] lparam: reserve for user's code
- * @return none
- */
- void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam)
- {
- }
- /*!
- * @brief UART1接收中断回调函数
- *
- *
- * @param none
- * @return none
- */
- void UART1_RX_Callback(void *driverState, uint32_t event, void *userData)
- {
- if(event == UART_EVENT_IDLE_LINE){
-
-
- //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
- //UART_SetIdleInterrupt(uart_type, false);
-
- uint32_t rxRemainByte = UART1_RECV_DATA_POOL_COUNT;
- UART_DRV_GetReceiveStatus(UART1_INSTANCE_ID, &rxRemainByte);
- uart1_info.recv_len = UART1_RECV_DATA_POOL_COUNT - rxRemainByte;
-
- UART_DRV_AbortReceivingData(UART1_INSTANCE_ID);
- }else if(event == UART_EVENT_END_TRANSFER){
- //LED3_TOGGLE;
- }else{
-
- }
- }
- /*!
- * @brief UART1发送中断回调函数
- *
- *
- * @param none
- * @return none
- */
- void UART1_TX_Callback(void *driverState, uint32_t event, void *userData)
- {
- if(UART_EVENT_TX_EMPTY == event){
-
-
- }else if(event == UART_EVENT_END_TRANSFER){
- //uart1_info.recv_len = 0;
- //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
- //UART_SetIdleInterrupt(uart_type, true);
- //UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
-
-
- }else{
-
- }
- }
- /**
- * Uart1_Initialize
- *
- * @param[in] none
- * @return none
- *
- * @brief uart 初始化
- */
- void Uart1_Initialize(void)
- {
- uart_user_config_t userConfig;
- memset(&userConfig, 0U, sizeof(userConfig));
-
- /*GPIO Configuration for UART1 */
- GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
- GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
- GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
- GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
-
- switch(config->br_index){
- case BaudRate_4800:
- userConfig.baudRate = 4800;
- break;
- case BaudRate_9600:
- userConfig.baudRate = 9600;
- break;
- case BaudRate_19200:
- userConfig.baudRate = 19200;
- break;
- case BaudRate_38400:
- userConfig.baudRate = 38400;
- break;
- case BaudRate_57600:
- userConfig.baudRate = 57600;
- break;
- case BaudRate_115200:
- userConfig.baudRate = 115200;
- break;
- case BaudRate_230400:
- userConfig.baudRate = 230400;
- break;
- default:
- userConfig.baudRate = 115200;
- break;
- };
-
- userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
- userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
- userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
-
- userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
- userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
- userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
-
- userConfig.rxCallback = UART1_RX_Callback;
- userConfig.rxCallbackParam = NULL;
- userConfig.txCallback = UART1_TX_Callback;
- userConfig.txCallbackParam = NULL;
- UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
-
- UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
- UART_SetIdleFunc(uart_type, true);
- UART_SetIdleInterrupt(uart_type, true);
-
-
- uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
- uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
- uart1_info.recv_len = 0;
- uart1_info.send_len = 0;
-
- UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
-
- }
- int Uart1_TransmitData(uint8_t *pdata, uint16_t length)
- {
- //UART_DRV_SendData(UART1_INSTANCE_ID, pdata, length);
- UART_DRV_SendDataBlocking(UART1_INSTANCE_ID, pdata, length, 50);
- return 0;
- }
- void Uart1_RecvData(void)
- {
- uart1_info.recv_len = 0;
- //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
- //UART_SetIdleFunc(uart_type, true);
- //UART_SetIdleInterrupt(uart_type, true);
- UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
- }
- /*!
- * @brief UART模块配置
- * UART1配置普通UART模式,波特率115200,数据长度为8bit,停止位为1bit
- * 使能接收和发送DMA功能
- * @param none
- * @return none
- */
- void UART1_Init(void)
- {
- uart_user_config_t userConfig;
- /*GPIO Configuration for UART1 */
- GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
- GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
- GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
- GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
- memset(&userConfig, 0U, sizeof(userConfig));
- userConfig.baudRate = 115200; /*波特率配置 */
- userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
- userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
- userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
-
- userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
- userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
- userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
-
- userConfig.rxCallback = UART1_RX_Callback;
- userConfig.rxCallbackParam = NULL;
- userConfig.txCallback = UART1_TX_Callback;
- userConfig.txCallbackParam = NULL;
- UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
-
- UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
- UART_SetIdleFunc(uart_type, true);
- UART_SetIdleInterrupt(uart_type, true);
-
- /*DMA配置*/
- //DMA_DRV_Init(&g_dma_state, NULL, NULL, NULL);
- //DMA_DRV_ChannelInit(&s_uartRxDmaChState, &s_uartRxDmaChConfig);
- //DMA_DRV_ChannelInit(&s_uartTxDmaChState, &s_uartTxDmaChConfig);
-
- uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
- uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
- uart1_info.recv_len = 0;
- uart1_info.send_len = 0;
-
- UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
- }
- /*!
- * @brief UART数据传输处理
- * UART查询接收数据,接收到数据后再将数据发送出去
- *
- * @param none
- * @return none
- */
- void UART1_DATA_Proce(void)
- {
- //uint32_t rxRemainByte = 0;
- #if 0
-
- status_t status;
- status = UART_DRV_ReceiveDataPolling(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
- if (status == STATUS_SUCCESS)
- {
- memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
- uart1_info.send_len = uart1_info.recv_len;
- UART_DRV_SendData(UART1_INSTANCE, uart1_info.send_buffer, uart1_info.send_len);
- }
-
- #else
- if(uart1_info.recv_len > 0){
-
- memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
- uart1_info.send_len = uart1_info.recv_len;
- UART_DRV_SendData(UART1_INSTANCE_ID, uart1_info.send_buffer, uart1_info.send_len);
-
- uart1_info.recv_len = 0;
- }
-
- #endif
- }
|