NUC131的M0芯片UART是支持半双工模式的。
在软件上实现半双工模式需要对UART的寄存器进行配置,底层的具体配置方法可以参考NUC131相关的官方文档或者资料手册。一般需要配置数据位、波特率、停止位、校验位等参数,同时也需要配置工作模式等参数以支持半双工模式。
以下是一个示例代码,展示如何使用NUC131的M0芯片UART实现半双工模式:
```c
#include "NUC131.h"
#define BUF_SIZE 16
#define UART_PORT UART0
volatile char g_buf[BUF_SIZE];
volatile uint32_t g_u32comRbytes = 0;
volatile uint32_t g_u32comRhead = 0;
volatile uint32_t g_u32comRtail = 0;
void UART0_IRQHandler(void)
{
uint8_t u8InChar = 0xFF;
uint32_t u32IntSts = UART_PORT->ISR;
if(u32IntSts & UART_ISR_RDA_IF_Msk)
{
/* Get all the input characters */
while(UART_GET_RX_EMPTY(UART_PORT) != 1)
{
/* Get the character from UART Buffer */
u8InChar = UART_READ(UART_PORT);
/* Check if buffer full */
if(g_u32comRbytes < BUF_SIZE)
{
/* Enqueue the character */
g_buf[g_u32comRtail++] = u8InChar;
if(g_u32comRtail >= BUF_SIZE)
g_u32comRtail = 0;
g_u32comRbytes++;
}
}
}
}
void UART0_Init(void)
{
/* Enable UART0 module clock */
CLK_EnableModuleClock(UART0_MODULE);
/* Select UART0 module clock source */
CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_MASK, CLK_CLKDIV_UART(1));
/* Set PA.0 and PA.1 as UART0 RXD and TXD pins */
SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA14_MFP_Msk | SYS_PA_H_MFP_PA15_MFP_Msk);
SYS->PA_H_MFP |= SYS_PA_H_MFP_PA14_MFP_UART0_RXD | SYS_PA_H_MFP_PA15_MFP_UART0_TXD;
SYS->ALT_MFP &= ~(SYS_ALT_MFP_PA14_ALT_Msk | SYS_ALT_MFP_PA15_ALT_Msk);
SYS->ALT_MFP |= SYS_ALT_MFP_PA14_UART0_RXD | SYS_ALT_MFP_PA15_UART0_TXD;
/* Configure UART0 as 115200 baudrate, 8-bit data, no parity, 1-stop bit */
UART_Open(UART_PORT, 115200);
/* Enable UART0 interrupt and receive interrupt */
UART_ENABLE_INT(UART_PORT, UART_IER_RDA_IE_Msk);
NVIC_EnableIRQ(UART0_IRQn);
}
void UART_SendByte(uint8_t u8Data)
{
while(UART_IS_TX_FULL(UART_PORT));
UART_WRITE(UART_PORT, u8Data);
}
void UART_SendString(char *s)
{
while(*s != ' ')
{
while(UART_IS_TX_FULL(UART_PORT));
UART_WRITE(UART_PORT, *s++);
}
}
int main(void)
{
char buffer[32] = {0};
/* Unlock protected registers */
SYS_UnlockReg();
/* Initialize system clock and peripherals */
SystemInit();
/* Initialize UART */
UART0_Init();
/* Lock protected registers */
SYS_LockReg();
while(1)
{
/* Check if there is any data received */
if(g_u32comRbytes)
{
/* Dequeue the character */
buffer[0] = g_buf[g_u32comRhead++];
if(g_u32comRhead >= BUF_SIZE)
g_u32comRhead = 0;
g_u32comRbytes--;
/* Echo the character */
UART_SendByte(buffer[0]);
}
/* Check if there is any incoming data from another device */
if(UART_IS_RX_READY(UART_PORT))
{
/* Dequeue the character */
buffer[0] = UART_READ(UART_PORT);
/* Process the incoming data */
//...
/* Echo the character */
UART_SendByte(buffer[0]);
}
}
}
```