📄 sci.c
字号:
/******************************************************************************
COPYRIGHT 2002 STMicroelectronics
Source File Name : sci.c
Group : IPSW,CMG-IPDF
Author : MCD Application Team
Date First Issued: 5/3/2002
********************************Documentation**********************************
General Purpose - Contains source code for all the functions of SCI
********************************Revision History*******************************
_______________________________________________________________________________
Date :5/3/2002 Release:1.0
Date March 2004 Release:2.0: customized for ST7MC; now uses the HW
registers description coming with STVD7 3.0
******************************************************************************/
#include "ST7FMC2N6.h" /* ST7FMC peripherals Hardware Registers declaration */
#include "Sci.h" /*Declaration of functions*/
/*---------------------Select the mode of communication ---------------------*/
#define SCI_POLLING_TX /*Polling mode transmission*/
#define SCI_POLLING_RX /*polling mode reception*/
//#define SCI_ITDRV_WITHOUTBUF_TX
/*Interrupt driven without buffer transmission mode*/
//#define SCI_ITDRV_WITHOUTBUF_RX
/*Interrupt driven without buffer reception mode*/
static volatile unsigned char SCI_Error; /*Declaration of Global Variables*/
static volatile unsigned char SCI_MY_DATA;
static const volatile unsigned char *PtrToSCIBuffTx;
static volatile unsigned char *PtrToSCIBuffRx;
static volatile unsigned char SCI_Tx_Buff;
static volatile unsigned char SCI_Tx_String;
static volatile unsigned int SCI_Rx_Buff;
static volatile unsigned char SCI_Rx_String;
static volatile unsigned char SCI_Pol_Stat;
void PrintUnsignedInt( unsigned int x )
{
char b[6], *s = b + 5;
*s-- = '\0';
do
{
*s-- = (char)(x % 10 + '0');
x /= 10;
} while( x );
SCI_PutString( s+1 );
}
void PrintUnsignedChar( unsigned char x )
{
char b[4], *s = b + 3;
*s-- = '\0';
do
{
*s-- = (char)(x % 10 + '0');
x /= 10;
} while( x );
SCI_PutString( s+1 );
}
void PrintSignedChar( signed char x )
{
char b[5], *s = b + 4;
*s-- = '\0';
if (x >= 0)
{
do
{
*s-- = (char)(x % 10 + '0');
x /= 10;
} while( x );
*s-- = '+';
}
else
{
do
{
*s-- = (char)(x % 10 + '0');
x /= 10;
} while( x );
*s-- = '-';
}
SCI_PutString( s+1 );
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_Init
INPUT : 1.SCI_DEFAULT_PARAM1, SCI_WORDLENGTH_9,SCI_ODPARITY_SELECT,
SCI_EVPARITY_SELECT or SCI_WAKEUP_ADDR
2.SCI_MUTE_ENABLE,SCI_BREAK_ENABLE,SCI_DEFAULT_PARAM2
OUTPUT : None
DESCRIPTION : Initializes the SCI in the required mode
COMMENTS : Must be called before starting any sci operation
-----------------------------------------------------------------------------*/
void SCI_Init ( SCI_Type_Param1 Init_Value1, SCI_Type_Param2 Init_Value2)
{
unsigned char temp;
SCICR1 = SCI_DEFAULT_PARAM1; /*Load Default value*/
SCICR2 = SCI_DEFAULT_PARAM2;
temp = SCISR; /*Clear all the flags in Status register*/
temp = SCIDR;
SCIDR = SCI_DEFAULT_PARAM1;
SCICR1 |= Init_Value1; /*Sets SCI in the required mode*/
SCICR2 |= Init_Value2;
SCI_Pol_Stat = SCI_Error = 0; /*Initializes globalvariables*/
SCI_Tx_Buff = 0;
SCI_Tx_String = 0;
SCI_Rx_Buff = SCI_Rx_String = 0;
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_Mode
INPUT : SCI_TX_ENABLE or SCI_RX_ENABLE
OUTPUT : None
DESCRIPTION : Selects the transmitter or receiver mode for SCI
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_Mode(SCI_Mode_Type SCI_Mode_Param)
{
SCICR2 |= SCI_Mode_Param; /*Selects Transmitter or Receiver mode*/
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_Forced_Clear_Flag
INPUT : None
OUTPUT : None
DESCRIPTION : Clears all status flag performs both read and write operation
COMMENTS : Can be used if clearing of all status flag is needed
-----------------------------------------------------------------------------*/
void SCI_Forced_Clear_Flag( void )
{
unsigned char Temp_Variable,temp;
Temp_Variable = SCICR2;
SCICR2 = 0x00;
temp = SCISR; /*Clears all flags in status register*/
SCIDR = 0x00;
SCICR2 = Temp_Variable;
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_IT_Enable
INPUT : SCI_IDLE_LINE,SCI_RECEIVE_OVERRUN,SCI_TRANSMIT_REGISTER_READY,
SCI_FRAME_TRANSMITTED,SCI_PARITY_ERROR
OUTPUT : None
DESCRIPTION : Reset the interrupt masking
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_IT_Enable ( SCI_IT_Type SCI_IT_Param)
{
SCICR1 |= (unsigned char)(SCI_IT_Param & SCI_PARITY_ERROR);
/*Enables the required interrupt*/
SCICR2 |= (unsigned char)(SCI_IT_Param & (~SCI_PARITY_ERROR)) ;
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_Select_Baudrate
INPUT : SCI_PR_X+SCI_TR_Y+SCI_RR_Z
OUTPUT : None
DESCRIPTION : Selects possible baudrate for transmission and reception
COMMENTS : Values are to be precalculated by the user
-----------------------------------------------------------------------------*/
void SCI_Select_Baudrate (SCI_Baudrate_Type Baudrate_Presc)
{
SCIBRR =0x00;
SCIBRR |= Baudrate_Presc; /*Loads the required value in SCIBRR*/
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_Extend_BaudRate
INPUT : SCI_PR_X+SCI_TR_Y+RR_Z,ETPR,ERPR
OUTPUT : None
DESCRIPTION : Selects the possible baudrate with extended prescalar
COMMENTS : Values are to be precalculated by the user
-----------------------------------------------------------------------------*/
#if (defined SCI_72F521 | defined SCI_72F62)
void SCI_Extend_Baudrate (SCI_Baudrate_Type Baudrate_Presc,
unsigned char ETPR,unsigned char ERPR)
{
SCIBRR = 0x00;
SCIBRR |= Baudrate_Presc; /*Loads the required value SCIBRR*/
SCIETPR = ETPR; /*loads the required value in SCIETPR */
SCIERPR = ERPR; /*loads the required value in SCIERPR */
}
#endif
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_PutByte
INPUT : Tx_DATA
OUTPUT : None
DESCRIPTION : Transmits a single data byte
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_PutByte (unsigned char Tx_DATA)
{
unsigned char temp;
#ifdef SCI_POLLING_TX
temp = SCISR; /*Loads the byte to be transmitted*/
SCIDR = Tx_DATA;
#endif
#ifdef SCI_ITDRV_WITHOUTBUF_TX
SCI_Tx_Buff = 1; /*Loads the default value */
SCI_Tx_String = 0;
temp = SCISR;
SCIDR = Tx_DATA; /*Loads the byte to be transmitted*/
SCICR2 |= (unsigned char)TDRE; //Enable INterrupt
#endif
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_IsTransmitCompleted
INPUT : None
OUTPUT : TRUE or FALSE
DESCRIPTION : Checks if the transmission is completed or not
COMMENTS : Must be called after Put_Byte or Put_Buffer or Put_String
-----------------------------------------------------------------------------*/
BOOL SCI_IsTransmitCompleted(void)
{
#if defined SCI_POLLING_TX
if(SCISR & SCISR_TC_OR) /*Checks if transmission is completed*/
{
return (TRUE);
}
else
{
return(FALSE);
}
#else
#if defined SCI_ITDRV_WITHOUTBUF_TX
if (SCI_Tx_String == 1)
{
if((*PtrToSCIBuffTx == '\0') && (SCISR & SCISR_TDRE_OR))
{
return (TRUE);
}
else
{
return (FALSE);
}
}
else if (SCI_Tx_Buff == 0)
{
return (TRUE);
}
else
{
return (FALSE);
}
#else
return(TRUE); /*Dummy return statement*/
#endif
#endif
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_IT_Disable
INPUT : SCI_IDLE_LINE,SCI_RECEIVE_OVERRUN,SCI_TRANSMIT_REGISTER_READY
,SCI_FRAME_TRANSMITTED,SCI_PARITY_ERROR
OUTPUT : None
DESCRIPTION : Disables the interrupt due to a particular flag
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_IT_Disable(SCI_IT_Type SCI_IT_Param)
{
SCICR2 &= (unsigned char)(~(SCI_IT_Param & (~SCI_PARITY_ERROR)));
/*disables the selected interrupt*/
SCICR1 &= (unsigned char)(~(SCI_IT_Param & SCI_PARITY_ERROR));
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_PutBuffer
INPUT : *PtrtoBuffer,NbOfBytes
OUTPUT : None
DESCRIPTION : Transmits data from the user buffer in polling mode and
starts transmission in interrupt driven with buffer mode
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_PutBuffer (const unsigned char *PtrtoBuffer, unsigned char NbOfBytes)
{
unsigned char temp;
#ifdef SCI_POLLING_TX
for (; NbOfBytes > 0 ; NbOfBytes--)
{
temp = SCISR;
SCIDR = *PtrtoBuffer; /*Loads the byte to be transmitted*/
while (!(SCI_IsTransmitCompleted()));
/*Waits for the completion of transmission*/
PtrtoBuffer++; /*Moves the pointer to the next location*/
}
#endif
#ifdef SCI_ITDRV_WITHOUTBUF_TX
PtrToSCIBuffTx = PtrtoBuffer; /*copies the user data to global variables*/
SCI_Tx_Buff = NbOfBytes;
SCI_Tx_String = 0;
temp = SCISR;
SCIDR = *PtrToSCIBuffTx; /*First byte is transmitted to generate the
interrupt*/
SCICR2 |= (unsigned char)TDRE; //Enable INterrupt
#endif
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : SCI_PutString
INPUT : *PtrtoString
OUTPUT : None
DESCRIPTION : Transmits the user string in polling mode and starts
transmission in interrupt driven mode
COMMENTS : None
-----------------------------------------------------------------------------*/
void SCI_PutString(const unsigned char *PtrtoString)
{
unsigned char Val = *PtrtoString, temp;
#ifdef SCI_POLLING_TX
while (Val != '\0') /*Checks for the end of string*/
{
Val= *PtrtoString;
temp = SCISR;
SCIDR = *PtrtoString; /*Copies the character to be transmitted*/
while(!(SCI_IsTransmitCompleted()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -