📄 spi_lib.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 + -