配置GPIO模式为UART
首先是配置IO为复用UART功能,使用
GPIO_ModeSetup(WIFI_UART_RX_PIN_NUM, 1);
GPIO_ModeSetup(WIFI_UART_TX_PIN_NUM, 1);
或
DCL_HANDLE wifi_uart_handle;
wifi_uart_handle = DclGPIO_Open(DCL_GPIO, WIFI_UART_RX_PIN_NUM);
DclGPIO_Control(wifi_uart_handle , GPIO_CMD_SET_MODE_1, NULL);
wifi_uart_handle = DclGPIO_Open(DCL_GPIO, WIFI_UART_TX_PIN_NUM);
DclGPIO_Control(wifi_uart_handle , GPIO_CMD_SET_MODE_1, NULL);
初始化串口
配置IO为UART后才能初始化UART的参数:
DCL_HANDLE handle;
UART_CTRL_POWERON_T power_on_data;
UART_CTRL_OPEN_T open_data;
UART_CTRL_OWNER_T owner_data;
UART_CTRL_DCB_T dcb_data;
handle = DclSerialPort_Open(port, 0);
/* 使能串口 */
power_on_data.bFlag_Poweron = on;
DclSerialPort_Control(handle, UART_CMD_POWER_ON, (DCL_CTRL_DATA_T *)&power_on_data);
/* 获取MOD */
DclSerialPort_Control(handle, SIO_CMD_GET_OWNER_ID, (DCL_CTRL_DATA_T *)&owner_data);
/* 打开串口 */
open_data.u4OwenrId = owner_data.u4OwenrId;
DclSerialPort_Control(handle, SIO_CMD_OPEN, (DCL_CTRL_DATA_T *)&open_data);
/* 切换MOD */
owner_data.u4OwenrId = MOD_xxx;
DclSerialPort_Control(handle, SIO_CMD_SET_OWNER, (DCL_CTRL_DATA_T *)&owner_data);
/* 设置串口参数 */
dcb_data.u4OwenrId = MOD_xxx;
dcb_data.rUARTConfig.u4Baud = UART_BAUD_115200;
dcb_data.rUARTConfig.u1DataBits = len_8;
dcb_data.rUARTConfig.u1StopBits = sb_1;
dcb_data.rUARTConfig.u1Parity = pa_none;
dcb_data.rUARTConfig.u1FlowControl = fc_none;
dcb_data.rUARTConfig.ucXonChar = 0x11;
dcb_data.rUARTConfig.ucXoffChar = 0x13;
dcb_data.rUARTConfig.fgDSRCheck = KAL_FALSE;
DclSerialPort_Control(handle, SIO_CMD_SET_DCB_CONFIG, (DCL_CTRL_DATA_T *)&dcb_data);
DclSerialPort_Close(handle);
串口收数据
static kal_uint16 UART_GetBytes(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, kal_uint8 *status, module_type ownerid)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
#ifdef __MTK_TARGET__
DCL_HANDLE handle;
UART_CTRL_GET_BYTES_T data;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
data.u4OwenrId = ownerid;
data.u2Length = Length;
data.puBuffaddr = Buffaddr;
data.pustatus = status;
handle = DclSerialPort_Open(port, 0);
DclSerialPort_Control(handle, SIO_CMD_GET_BYTES, (DCL_CTRL_DATA_T *)&data);
return data.u2RetSize;
#else
return 0;
#endif
}
系统收到数据后会发送MSG_ID_UART_READY_TO_READ_IND
事件给串口归属的模块,收到消息后将数据读出即可。
串口发数据
static kal_uint16 UART_PutBytes(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, module_type ownerid)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
#ifdef __MTK_TARGET__
DCL_HANDLE handle;
UART_CTRL_PUT_BYTES_T data;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
data.u4OwenrId = ownerid;
data.u2Length = Length;
data.puBuffaddr = Buffaddr;
handle = DclSerialPort_Open(port, 0);
DclSerialPort_Control(handle, SIO_CMD_PUT_BYTES, (DCL_CTRL_DATA_T *)&data);
return data.u2RetSize;
#else
return 0;
#endif
}
发数据前应该等待上一次发送结束再发送:
static DCL_UINT16 UART_CheckTxAllSentOut(DCL_DEV port)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
#ifdef __MTK_TARGET__
DCL_HANDLE handle;
UART_CTRL_CHECK_TSO_T data;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
handle = DclSerialPort_Open(port, 0);
DclSerialPort_Control(handle, UART_CMD_CHECK_TX_SEND_OUT, (DCL_CTRL_DATA_T *)&data);
DclSerialPort_Close(handle);
return data.bFlag;
#else
return 0;
#endif
}
网友评论