chen
2024-11-08 cc432b761c884a0bd8e9d83db0a4e26109fc08b1
keil/include/components/se/src/uart_in_spi.c
对比新文件
@@ -0,0 +1,165 @@
/*
 * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
 * its subsidiaries and affiliates (collectly called MKSEMI).
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into an MKSEMI
 *    integrated circuit in a product or a software update for such product,
 *    must reproduce the above copyright notice, this list of conditions and
 *    the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of MKSEMI nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * 4. This software, with or without modification, must only be used with a
 *    MKSEMI integrated circuit.
 *
 * 5. Any software provided in binary form under this license must not be
 *    reverse engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <stdint.h>
#include "mk_common.h"
#include "mk_uart.h"
#include "uart_in_spi.h"
// come from uart_example
#define TEST_UART_POLL_MODE 0
#define TEST_UART_INTERUPT_MODE 1
#define TEST_UART_DMA_MODE 2
#define TEST_UART_MODE TEST_UART_POLL_MODE
#define TEST_PORT_UART UART_ID0
/*******************************************************************************
 * @Function         uart_in_spi_init
 * @Parameters       None.
 * @Returns          void.
 ******************************************************************************/
void uart_in_spi_init(void)
{
    struct UART_CFG_T test_uart_cfg =
    {
        .parity = UART_PARITY_NONE,
        .stop = UART_STOP_BITS_1,
        .data = UART_DATA_BITS_8,
        .flow = UART_FLOW_CONTROL_NONE,
        .rx_level = UART_RXFIFO_CHAR_1,
        .tx_level = UART_TXFIFO_EMPTY,
        .baud = BAUD_921600,
#if (TEST_UART_MODE == TEST_UART_POLL_MODE)
        .dma_en = false,
        .int_rx = false,
        .int_tx = false,
#elif (TEST_UART_MODE == TEST_UART_INTERUPT_MODE)
        .dma_en = false,
        .int_rx = true,
        .int_tx = true,
#elif (TEST_UART_MODE == TEST_UART_DMA_MODE)
        .dma_en = true,
        .int_rx = false,
        .int_tx = false,
#endif
    };
    uart_open(TEST_PORT_UART, &test_uart_cfg);
    return;
}
#define TAG_UART_CMD_START_HIGH ((uint8_t)0xf1)
#define TAG_UART_CMS_START_LOW ((uint8_t)0xbc)
/*******************************************************************************
 *
 * @Function         uart_receive_in_spi
 * @Parameters       rx_buf - the buffer for receiving the data from UART.
 *                   buf_size - the buffer size
 *                   callback - call back function
 * @Returns          the data length.
 ******************************************************************************/
int uart_receive_in_spi(uint8_t *rx_buf, uint16_t buf_size, drv_callback_t callback)
{
    int ret;
    uint16_t len;
    uint8_t tmp_buf[8];
    do
    {
        ret = uart_receive(TEST_PORT_UART, tmp_buf, 1, callback);
        if ((ret != DRV_OK) || (tmp_buf[0] != TAG_UART_CMD_START_HIGH))
        {
            continue;
        }
        ret = uart_receive(TEST_PORT_UART, tmp_buf + 1, 1, callback);
        if ((ret != DRV_OK) || (tmp_buf[1] != TAG_UART_CMS_START_LOW))
        {
            continue;
        }
        ret = uart_receive(TEST_PORT_UART, tmp_buf + 2, 2, callback);
        if (ret != DRV_OK)
        {
            // sofCnt++;
            continue;
        }
        len = (uint16_t)(((uint16_t)tmp_buf[2] << 8) + tmp_buf[3]);
        if ((len < 5) || (len > (255 + 5)))
        {
            continue;
        }
        else
        {
            break;
        }
    } while (1); // (sofCnt < sofMaxCnt);
    ret = uart_receive(TEST_PORT_UART, rx_buf, len, callback);
    if (ret != DRV_OK)
    {
        return ret;
    }
    else
    {
        return len;
    }
}
/*******************************************************************************
 *
 * @Function         uart_send_in_spi
 * @Parameters       tx_buf - the buffer for sending the data from UART.
 *                   len - the data size
 *                   callback - call back function
 * @Returns          tx status.
 ******************************************************************************/
int uart_send_in_spi(uint8_t *tx_buf, uint16_t len, drv_callback_t callback)
{
    return uart_send(TEST_PORT_UART, tx_buf, len, callback);
}