#include "transfer.h" #if (DT_ENABLE_BROKEN_FRAME_DETECT) static uint8_t timeo_frame = 0; static struct drv_timer_t timerFrameBroken; static void timerFrameBrokenCallback (void *user_data) { timeo_frame = 1; //printf("frame detect clock time up!\r\n"); } #endif static uint8_t DT_Port_IsRecvData (struct transfer_t *xfer) { #if (DT_ENABLE_BROKEN_FRAME_DETECT) if (timeo_frame) { timeo_frame = 0; return BSP_UART_ERR_OK; } else if (BSP_UART_IsFrameEnd((BSP_UART_ID)xfer->if_id) == BSP_UART_ERR_OK) { drv_timer_linkUserData(&timerFrameBroken, xfer); drv_timer_restart(&timerFrameBroken); return BSP_UART_ERR_NO_RECV_FRAME; } return BSP_UART_ERR_NO_RECV_FRAME; #else return BSP_UART_IsFrameEnd((BSP_UART_ID)xfer->if_id); #endif } void DT_Send (struct transfer_t *xfer, uint8_t *data, uint32_t len) { BSP_UART_Send((BSP_UART_ID)xfer->if_id, data, len, 0xFFFF); } /** * @brief 检测是否接收到一帧数据的轮询接口 * @note * @param[in] xfer: 传输控制块对象 * @retval exRESULT */ exRESULT DT_PollingReceive (struct transfer_t *xfer) { exRESULT state = X_RESULT_NO_DATA; if (DT_Port_IsRecvData(xfer) == 0) { state = X_RESULT_RECV_FRAME; } return state; } /** * @brief 数据传输层初始化 * @note * @param[in] xfer: 传输控制块对象 * @param[in] if_id: 传输接口 ID * @param[in] buff: 用于接收数据的缓冲池,单位 byte * @param[in] len: 指示接收到的数据长度,单位 byte * @param[in] buff_size: 数据池最大容量,单位 byte * @retval None */ void DT_Init (struct transfer_t *xfer, uint8_t if_id, uint8_t *buff, uint16_t *len, uint32_t buff_size) { ASSERT(xfer != NULL); xfer->if_id = if_id; xfer->rx_buff = buff; xfer->rx_len = len; xfer->rx_buff_size = buff_size; BSP_UART_Init((BSP_UART_ID)xfer->if_id); BSP_UART_LinkUserData((BSP_UART_ID)xfer->if_id, xfer); BSP_UART_EnableReceive( (BSP_UART_ID)xfer->if_id, xfer->rx_buff, xfer->rx_len, xfer->rx_buff_size); #if (DT_ENABLE_BROKEN_FRAME_DETECT) drv_timer_init(&timerFrameBroken, timerFrameBrokenCallback, BROKEN_FRAME_INTERVAL_TIME, TIMER_RUN_ONE_SHOT); #endif }