📄 uart.c
字号:
/**************************************************************************** * * NAME: vUart_SetRxEnable *//*! *\DESCRIPTION Set receive enabled status. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC void vUart_SetRxEnable(bool_t bEnable) /**< Receive interrupt status */{ /* Changing setting ? */ if (bRxEnable != bEnable) { /* Set new value */ bRxEnable = bEnable; /* Update Rx interrupt setting */ vJPI_UartSetInterrupt(UART, bModemInt, FALSE, TRUE, bRxEnable, E_JPI_UART_FIFO_LEVEL_1); /* Not using automatic flow control ? */ #if ! UART_AUTOFLOW /* Set RTS manually */ vUart_SetRts(bRxEnable); #endif }}/**************************************************************************** * * NAME: bUart_GetRxEnable *//*! *\DESCRIPTION Get receive enabled status. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC bool_t bUart_GetRxEnable(void){ return bRxEnable;}/**************************************************************************** * * NAME: vUart_SetTxEnable *//*! *\DESCRIPTION Set transmit enabled status. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC void vUart_SetTxEnable(bool_t bEnable) /**< Transmit enabled status */{ /* Changing setting ? */ if (bTxEnable != bEnable) { /* Set new value */ bTxEnable = bEnable; }}/**************************************************************************** * * NAME: bUart_GetTxEnable *//*! *\DESCRIPTION Get transmit enabled status. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC bool_t bUart_GetTxEnable(void){ return bTxEnable;}/**************************************************************************** * * NAME: vUart_SetBaudRate *//*! *\DESCRIPTION Set baud rate for UART. * * Directly using registers. *//* PARAMETERS Name RW Usage * * RETURNS: * ****************************************************************************/PRIVATE void vUart_SetBaudRate(uint32 u32BaudRate) /**< Baud rate */{ uint8 *pu8Reg; uint8 u8TempLcr; uint16 u16Divisor; uint32 u32Remainder; /* Put UART into clock divisor setting mode */ pu8Reg = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET); u8TempLcr = *pu8Reg; *pu8Reg = u8TempLcr | 0x80; /* Write to divisor registers: Divisor register = 16MHz / (16 x baud rate) */ u16Divisor = (uint16)(16000000UL / (16UL * u32BaudRate)); /* Correct for rounding errors */ u32Remainder = (uint32)(16000000UL % (16UL * u32BaudRate)); if (u32Remainder >= ((16UL * u32BaudRate) / 2)) { u16Divisor += 1; } pu8Reg = (uint8 *)UART_START_ADR; *pu8Reg = (uint8)(u16Divisor & 0xFF); pu8Reg = (uint8 *)(UART_START_ADR + UART_DLM_OFFSET); *pu8Reg = (uint8)(u16Divisor >> 8); /* Put back into normal mode */ pu8Reg = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET); u8TempLcr = *pu8Reg; *pu8Reg = u8TempLcr & 0x7F;}/**************************************************************************** * * NAME: vUart_SetRts *//*! *\DESCRIPTION Set RTS pin. * * Directly using registers. *//* PARAMETERS Name RW Usage * * RETURNS: * ****************************************************************************/PRIVATE void vUart_SetRts(bool_t bEnable) /**< RTS status */{ uint8 *pu8Reg; uint8 u8Val; /* Get offset to Modem Control Register */ pu8Reg = (uint8 *)(UART_START_ADR + UART_MCR_OFFSET); /* Get content of MCR */ u8Val = *pu8Reg; /* Enabling ? */ if (bEnable) { /* Clear bit to set RTS */ u8Val &= 0xFD; } else { /* Set bit to clear RTS */ u8Val |= 0x02; } /* Write new value back to register */ *pu8Reg = u8Val;}/**************************************************************************** * * NAME: vUart_SetAutoFlow *//*! *\DESCRIPTION Set automatic flow control. * * Directly using registers. *//* PARAMETERS Name RW Usage * * RETURNS: * ****************************************************************************/PRIVATE void vUart_SetAutoFlow(bool_t bEnable) /**< Automatic flow control enabled */{ uint8 *pu8Reg; uint8 u8Val; /* Get offset to Modem Control Register */ pu8Reg = (uint8 *)(UART_START_ADR + UART_EFR_OFFSET); /* Get content of MCR */ u8Val = *pu8Reg; /* Enabling ? */ if (bEnable) { /* Set automatic flow control */ u8Val |= 0x10; } else { /* Clear automatic flow control */ u8Val &= 0xEF; } /* Write new value back to register */ *pu8Reg = u8Val;}/**************************************************************************** * * NAME: vUart_HandleUartInterrupt *//*! *\DESCRIPTION Handles UART interrupt. * * Adds received character to receive serial queue, if available. * * Transmits character from transmit serial queue, if available. * * Reacts to change in CTS status when not using automatic flow control. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PRIVATE void vUart_HandleUartInterrupt(uint32 u32Device, /**< Interrupting device */ uint32 u32ItemBitmap) /**< Interrupt bitmask */{ uint8 u8LineStatus; uint8 u8ModemStatus; if (u32Device == UART_DEVICE) { /* Read line status */ u8LineStatus = u8JPI_UartReadLineStatus(UART); /* Data to receive ? */ if ((u32ItemBitmap & 0x000000FF) == E_JPI_UART_INT_RXDATA) { /* Receive character from UART */ vUart_RxCharIsr(u8JPI_UartReadData(UART)); } #if ! UART_AUTOFLOW /* Modem status changed ? */ else if (u32ItemBitmap == E_JPI_UART_INT_MODEM) { /* Read modem status */ u8ModemStatus = u8JPI_UartReadModemStatus(UART); /* Has CTS changed ? */ if (u8ModemStatus & E_JPI_UART_MS_DCTS) { /* Is CTS bit set meaning CTS has just been cleared ? */ if (u8ModemStatus & 0x10) { /* Disable transmit */ vUart_SetTxEnable(FALSE); } /* Is CTS bit is clear meaning CTS has just been set ? */ else { /* Enable transmit */ vUart_SetTxEnable(TRUE); /* OK to transmit now - begin transmitting again */ if (u8LineStatus & E_JPI_UART_LS_THRE) vUart_TxCharIsr(); } } } #endif /* Ready to transmit ? */ else if (u32ItemBitmap == E_JPI_UART_INT_TX) { vUart_TxCharIsr(); } }}/****************************************************************************//*** END OF FILE ***//****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -