⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci.c

📁 该程序是ST7MC驱动三洋压缩机(交流)
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
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 + -