📄 uart.c
字号:
/*
* No DLE previously detected AND currently inside of a frame.
*/
if (uart->frame_length)
{
/*
* Frame length is not zero (End of Frame) =>
* Skip the current byte and set the flags (EOF).
*/
uart->inframe = 0;
*eof_detected = 1;
uart->frame_length = 0;
bytes_to_process--;
uart->rx_out++;
}
else
{ /* if (!uart->frame_length) */
/*
* Frame length is zero (STX followed by another STX =
* Synchro lost but start of a new frame) =>
* Skip the current byte and keep the flag set.
*/
bytes_to_process--;
uart->rx_out++;
}
}
else if ((!uart->dle_detected) && (!uart->inframe))
{
/*
* No DLE previously detected AND currently outside of a
* frame (Start of Frame) =>
* Skip the current byte and set the flag.
*/
uart->inframe = 1;
bytes_to_process--;
uart->rx_out++;
}
else if ((uart->dle_detected) && (uart->inframe))
{
/*
* DLE previously detected AND currently inside of a frame =>
* Copy the current byte in the output buffer, reset the flag
* and increase the frame length.
*/
uart->dle_detected = 0;
bytes_to_process--;
uart->frame_length++;
*(buffer++) = *(uart->rx_out++);
bytes_written++;
}
else if ((uart->dle_detected) && (!uart->inframe))
{
/*
* DLE previously detected AND currently outside of a frame =>
* Skip the current byte and reset the flag.
*/
uart->dle_detected = 0;
bytes_to_process--;
uart->rx_out++;
}
break; /* case STX */
/*
* Current byte is neither DLE nor STX.
*/
default:
if (uart->inframe)
{
/*
* Currently inside of a frame =>
* Copy the current byte in the output buffer and increase
* the frame length.
*/
bytes_to_process--;
uart->frame_length++;
*(buffer++) = *(uart->rx_out++);
bytes_written++;
}
else
{ /* if (!uart->inframe) */
/*
* Currently outside of a frame =>
* Skip the current byte.
*/
bytes_to_process--;
uart->rx_out++;
}
break; /* default */
}
if (uart->rx_out == &(uart->rx_buffer[0]) + BUFFER_SIZE + 1)
uart->rx_out = &(uart->rx_buffer[0]);
}
return(bytes_written);
}
/*--------------------------------------------------------------
Name: UA_ReadNChars
Description: Reads N characters from the RX buffer.
Parameter:
uart_id : UART id.
buffer : buffer address where the characters are copied.
chars_to_read: number of characters to read.
Return: The number of bytes read.
//--------------------------------------------------------------*/
SYS_UWORD32 UA_ReadNChars (T_tr_UartId uart_id,
char *buffer,
SYS_UWORD32 chars_to_read)
{
SYS_UWORD32 chars_in_rx_buffer;
SYS_UWORD32 chars_to_copy;
SYS_UWORD32 chars_written;
char *rx_in;
t_uart *uart;
uart = &(uart_parameter[uart_id]);
/*
* A copy of the rx_in pointer is used because it may be updated by
* the interrupt handler.
* Get the number of bytes available in the RX buffer.
*/
rx_in = uart->rx_in;
if (uart->rx_out <= rx_in)
chars_in_rx_buffer = (SYS_UWORD32) (rx_in - uart->rx_out);
else
chars_in_rx_buffer = (SYS_UWORD32) (rx_in - uart->rx_out + BUFFER_SIZE + 1);
/*
* No more bytes than those received may be written in the output buffer.
*/
if (chars_in_rx_buffer >= chars_to_read)
chars_to_copy = chars_to_read;
else
chars_to_copy = chars_in_rx_buffer;
chars_written = chars_to_copy;
/*
* Write the received bytes in the output buffer.
*/
while (chars_to_copy)
{
*(buffer++) = *(uart->rx_out++);
chars_to_copy--;
if (uart->rx_out == &(uart->rx_buffer[0]) + BUFFER_SIZE + 1)
uart->rx_out = &(uart->rx_buffer[0]);
}
return(chars_written);
}
/*******************************************************************************
*
* UA_EncapsulateNChars
*
* Purpose : Writes N characters in the TX FIFO in encapsulating them with 2
* STX bytes (one at the beginning and one at the end).
*
* Arguments: In : uart_id : UART id.
* buffer : buffer address from which characters are
* written.
* chars_to_write: number of chars to write.
* Out: none
*
* Returns : Number of chars written.
*
* Warning: Parameters are not verified.
*
******************************************************************************/
SYS_UWORD32 UA_EncapsulateNChars (T_tr_UartId uart_id,
char *buffer,
SYS_UWORD32 chars_to_write)
{
SYS_UWORD32 chars_written;
SYS_UWORD32 chars_in_tx_fifo;
t_uart *uart;
chars_written = 0;
uart = &(uart_parameter[uart_id]);
chars_in_tx_fifo = 0;
/*
* Check if the message has been already encapsulated.
*/
if (!uart->encapsulation_flag)
{
/*
* Write STX in the TX FIFO and set the flag.
*/
UA_WriteChar(uart_id,STX);
chars_in_tx_fifo++;
uart->encapsulation_flag = 1;
}
/*
* Keep one char margin in the TX FIFO for the last STX.
*/
while ((chars_written < chars_to_write) &&
(chars_in_tx_fifo < (FIFO_SIZE-1)))
{
UA_WriteChar(uart_id,*(buffer++));
chars_written++;
chars_in_tx_fifo++;
}
/*
* Append STX byte at the end if the frame is complete.
*/
if (chars_written == chars_to_write)
{
/*
* Write STX in the TX FIFO and reset the flag.
*/
UA_WriteChar(uart_id,STX);
uart->encapsulation_flag = 0;
}
return(chars_written);
}
/*--------------------------------------------------------------
Name: bsp_Usart_rxCallback
Description: Copies data from BSP_USART buffer to RX buffer
Parameter:
irq : if irq set to TRUE otherwise FALSE
reinstallPtr : Reinstall pointer for reinstall after each thresh-hold
cb : Circular buffer for data manupulation.
numBytesAvailable : Number of byte availabe in circular buffer.
state : which state the UART is.
CommPort : which UART.
Return: None
//--------------------------------------------------------------*/
static BspUsart_ResultCode
bsp_Usart_rxCallback( Uint16 irq,
BspUsart_ReInstallMode *reinstallPtr,
BspUtil_CircBuf_Handle cb,
Uint16 numBytesAvailable,
BspUsart_State state,
BspUsart_Id CommPort )
{
Uint16 numRetrieved = 0;
t_uart *uart;
Uint8 uart_id;
uart_id = CommPort-1;
uart = &(uart_parameter[uart_id]);
while( (numBytesAvailable > 0) && (!RX_BUFFER_FULL (uart)) )
{
bspUtil_CircBuf_dequeueUint8( cb, (Uint8*)uart->rx_in++ );
if (uart->rx_in == &(uart->rx_buffer[0]) + BUFFER_SIZE + 1)
uart->rx_in = &(uart->rx_buffer[0]);
numBytesAvailable--;
numRetrieved ++;
}
if (uart->callback_function != NULL)
(*(uart->callback_function)) ();
*reinstallPtr = BSP_USART_REINSTALL_MODE_REINSTALL;
return numRetrieved;
}
unsigned
bsp_USB_rxCallback_pco()
{
Uint16 numRetrieved = 0;
t_uart *uart;
Uint8 uart_id;
Uint16 numBytesAvailable;
numBytesAvailable = COSTENOtoUSB_GetBufferSizeToRead(USB_PCO);
uart_id = USB_PCO;
uart = &(uart_parameter[0]);
while( (numBytesAvailable > 0) && (!RX_BUFFER_FULL(uart)) )
{
COSTENOtoUSB_Read(USB_PCO,(unsigned char*)uart->rx_in++,1);
if (uart->rx_in == &(uart->rx_buffer[0]) + BUFFER_SIZE + 1)
uart->rx_in = &(uart->rx_buffer[0]);
numBytesAvailable--;
numRetrieved++;
}
if (uart->callback_function != NULL)
(*(uart->callback_function)) ();
return numRetrieved;
}
/*--------------------------------------------------------------
Name: UA_EnterSleep
Description: enable UART sleep mode.
Parameter:
T_tr_UartId uart_id
Return: None
//--------------------------------------------------------------*/
SYS_BOOL UA_EnterSleep (T_tr_UartId uart_id)
{
if(UA_GetPortType(uart_id) == UA_TYPE_UART)
{
uart_id += 1;
bspUsart_enableSleepMode(uart_id,1);
return TRUE;
}
else
{
return FALSE;
}
}
/*--------------------------------------------------------------
Name: //UA_WakeUp
Description: Wakes up UART after Deep Sleep.
Parameter:
T_tr_UartId uart_id
Return: None
//--------------------------------------------------------------*/
void UA_WakeUp (T_tr_UartId uart_id)
{
if(UA_GetPortType(uart_id) == UA_TYPE_UART)
{
uart_id += 1;
bspUsart_enableSleepMode(uart_id,0);
}
}
/*--------------------------------------------------------------
Name: //UA_GetPortType
Description: Differentiate between different virtual UART implementations.
Parameter:
T_tr_UartId uart_id
Return: T_tr_UartType
//--------------------------------------------------------------*/
T_tr_UartType UA_GetPortType(T_tr_UartId uart_id)
{
#ifdef USB_MCCI
if(uart_id == USB_PCO)
{
return UA_TYPE_USB;
}
#else
if(uart_id == UA_UART_0 ||
uart_id == UA_UART_1 ||
uart_id == UA_UART_2)
{
return UA_TYPE_UART;
}
#endif
}
/*--------------------------------------------------------------
Name: //UA_USB_setTransmitHoldingRegister
Description: counterpart of dev_Uart_setTransmitHoldingRegister.
Parameter:
const Dev_Uart_Id uartId,
const Dev_Uart_RegisterValue datum
Return: void
//--------------------------------------------------------------*/
void UA_USB_setTransmitHoldingRegister(
const Dev_Uart_Id uartId,
const Dev_Uart_RegisterValue datum)
{
char ctlCode;
if(UA_GetPortType((T_tr_UartId)uartId) != UA_TYPE_USB) return;
ctlCode = datum;
COSTENOtoUSB_Write(USB_UART_ID,
(unsigned char *) &ctlCode,
(unsigned short)1
);
/*
USB_Write(pUSBDeviceObject,
(unsigned char *) &ctlCode,
(unsigned short)1
);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -