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

📄 spi_lib.c

📁 ix2-lib-spi-1_2_0.zip源码
💻 C
字号:
/*C**************************************************************************
* NAME:         spi_lib.c
*----------------------------------------------------------------------------
* Copyright (c) 2002 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      ix2-lib-spi-1_2_0      
* REVISION:     1.2     
*----------------------------------------------------------------------------
* PURPOSE: 
* SPI library low level functions (init, receive and send functions)                                               
* and global variables declarations to use with user software application
*****************************************************************************/



/*_____ I N C L U D E S ____________________________________________________*/
#include "config.h"


/*_____ M A C R O S ________________________________________________________*/

/*_____ D E F I N I T I O N ________________________________________________*/

/*_____ D E C L A R A T I O N ______________________________________________*/

// Here are some global flags to use with SPI library
// These global flags arec used to communicate with higher level functions ( user application )
volatile bit b_SPI_overrun;				// set when an overrun condition occured
volatile bit b_SPI_error;				// General pupose error flag
volatile bit b_SPI_transmit_completed;	// for interrupt transmition use ( set when completed )
volatile bit b_SPI_busy;				// set when SPI interface is in use

// Here the globals variables to communicate with SPI interrupt routine
volatile unsigned char *SPI_string_ptr;	// pointer to data buffer
volatile unsigned char SPI_nb_data;		// number of data


/*F**************************************************************************
* NAME: SPI_transmit_byte
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS:  tx_data: byte to send
* return:  byte received 
*----------------------------------------------------------------------------
* PURPOSE: 
* Send and receive a byte with SPI interface 
*----------------------------------------------------------------------------
* NOTE: 
* If a current SPI transfert is on going, the function performs an active wait polling on SPI event.
* This function can be used both in slave and master mode
*****************************************************************************/
unsigned char SPI_transmit_byte(unsigned char tx_data)
{
	unsigned char rx_data;

	if ( b_SPI_busy )				// If current transfert is on going
	{
		while ( SPSTA == 0);	// Wait SPI event in polling
		switch	( SPSTA )
		{
			case MSK_SPI_SPIF:	//Previous tranfert completed : receive the data
				rx_data=SPDAT;
				b_SPI_busy=1;
			break;
		
			case MSK_SPI_MODF:
				b_SPI_error=1;
				b_SPI_busy=0;
			break;
		
			case MSK_SPI_WCOL:
				b_SPI_overrun=1;
				b_SPI_busy=0;
			break;
		}
	}
	SPDAT=tx_data;
	b_SPI_busy=1;
	return	rx_data;
}


/*F**************************************************************************
* NAME: SPI_get_data
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS: none
* return: byte received 
*----------------------------------------------------------------------------
* PURPOSE: 
* Return the content of the SPI data register 
*----------------------------------------------------------------------------
* NOTE: 
* This function perfrom an active wait polling
*****************************************************************************/
unsigned char SPI_get_data()
{
	unsigned char to_return;
	while ( SPSTA == 0); 	//wait SPI event
		switch	( SPSTA )
		{
			case MSK_SPI_SPIF:
				to_return = SPDAT;
			break;
		
			case MSK_SPI_MODF:
				b_SPI_error=1;
			break;
		
			case MSK_SPI_WCOL:
				b_SPI_overrun=1;
			break;
		}
	b_SPI_busy=0;						// Release SPI interface 
	return to_return;

}



/*F**************************************************************************
* NAME: SPI_put_data
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS: to_transmit: data to send
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
* Send a data byte to the SPI interface
*----------------------------------------------------------------------------
* NOTE: 
* This function should be use in SPI slave mode to load SPI data register
* with the next data to be transmited in slave mode
*****************************************************************************/
void SPI_put_data( unsigned char to_transmit)
{
	SPDAT=to_transmit;
	if ( SPSTA==MSK_SPI_WCOL)	b_SPI_overrun=1;
}



/*F**************************************************************************
* NAME: SPI_transmit_burst_polling
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS: *ptr_buf: data to send
* nb_data: number of data to send
* return: none 
*----------------------------------------------------------------------------
* PURPOSE:
* Transmit a data string throught the SPI interface in polling mode 
*----------------------------------------------------------------------------
* NOTE: 
*****************************************************************************/
void SPI_transmit_burst_polling( unsigned char  *ptr_buf, unsigned char nb_data)
{
unsigned char received;
  while (nb_data != 0)
  {
    SPDAT = *ptr_buf;
    while (SPSTA != MSK_SPI_SPIF);     /* wait for a 8 bit shift completed */
    received = SPDAT;
    *ptr_buf = received;
    ptr_buf++;
    nb_data--;
  }
}


/*F**************************************************************************
* NAME: SPI_set_speed
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS: ratio: SPI clock ratio/XTAL  
* return: bit: status  
*----------------------------------------------------------------------------
* PURPOSE: 
* Configure the baud rate of the SPI, set CR2, CR1, CR0
*----------------------------------------------------------------------------
* NOTE: 
* This function is use only in SPI slave mode
*****************************************************************************/
bit SPI_set_speed (unsigned char ratio)
{
switch ( ratio )
	{
	case 2:
		SPCON |= SPI_RATIO_2;
		return	TRUE;
	break;

	case 4:
		SPCON |= SPI_RATIO_4;
		return	TRUE;
	break;

	case 8:
		SPCON |= SPI_RATIO_8;
		return	TRUE;
	break;

	case 16:
		SPCON |= SPI_RATIO_16;
		return	TRUE;
	break;

	case 32:
		SPCON |= SPI_RATIO_32;
		return	TRUE;
	break;

	case 64:
		SPCON |= SPI_RATIO_64;
		return	TRUE;
	break;

	case 128:
		SPCON |= SPI_RATIO_128;
		return	TRUE;
	break;

	default :
		return	FALSE;
	break;
	}
}

/*F**************************************************************************
* NAME: SPI_transmit_burst_it
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS:  
* *string_ptr: the string which must be send
* data_nb: number of data to send
* return: bit
*----------------------------------------------------------------------------
* PURPOSE: 
* Initialize an SPI tranfert in interrupt mode
* Works in interrupt mode
* If a current transfert is on going, the function returns '0'
*----------------------------------------------------------------------------
* NOTE: 
* This function can be used in slave or master mode
*****************************************************************************/
bit SPI_transmit_burst_it (Uchar *string_ptr, Uchar data_nb)
{
	if ( ~b_SPI_busy )
	{
		b_SPI_busy=1;
		b_SPI_transmit_completed=0;
		b_SPI_error=0;
		b_SPI_overrun=0;
		SPI_string_ptr = string_ptr;
	  	SPI_nb_data = data_nb;
		ENABLE_SPI_IT;
		
		SPDAT=*SPI_string_ptr;
		return 1;
	}
	else	//current transfert on going
	{
		return 0;
	}
}


/*F**************************************************************************
* NAME: SPI_interrupt
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
* PARAMS:  
* *SPI_string_ptr: the string which must be send
* SPI_nb_data: number of data to send
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
* SPI - interruption program for serial transmission ( Master and Slave mode )
*----------------------------------------------------------------------------
* NOTE:
*****************************************************************************/
void SPI_interrupt (void) interrupt IRQ_SPI
{
	switch	( SPSTA )
	{
		case MSK_SPI_SPIF:
			*SPI_string_ptr=SPDAT;
			SPI_nb_data--;
			if ( SPI_nb_data > 0 )
			{
				SPI_string_ptr++;
				SPDAT=*SPI_string_ptr;
			}
			else
			{
				b_SPI_busy=0;
				b_SPI_transmit_completed=1;
			} 
			
		break;
	
		case MSK_SPI_MODF:
			b_SPI_error=1;
			b_SPI_transmit_completed=1;
		break;
	
		case MSK_SPI_WCOL:
			b_SPI_overrun=1;
			b_SPI_transmit_completed=1;
		break;

	}

  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -