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

📄 spi.c

📁 Source Code Source Code Source Code Source Code Source Code Source Code Source Code Source Code Sour
💻 C
字号:
/* +-------------------------------------------------------------------+ */
/* | Project : 1920.011 442GA01-M (Ext. Reader RFID 13,56MHz MIFARE)   | */
/* | Module  : RICReg.h                                                | */
/* | Author  : Jaime Rodriguez                                         | */
/* | Company : AVE S.p.A.                                              | */
/* | Released: October, 29 2008                                        | */
/* | Revision: YZ080.00 (FW - First Official Release)                  | */
/* | Revision: YZ081.00 (EEPROM - First Official Release)              | */
/* | Revised : --------------                                          | */
/* | Revisor : --------------                                          | */
/* | Notes   : --------------                                          | */
/* +-------------------------------------------------------------------+ */
/* | Purpose : funzioni di init e gestione della periferica HW SPI     | */
/* |                                                                   | */
/* +-------------------------------------------------------------------+ */
/* | Functions: void init_SPI 	( void )                                   | */
/* |			void SPI_init_4_wire (void)                                | */
/* |			uint8_t SPI_write_Reg ( uint8_t  addr, uint8_t  val_dato ) | */
/* |			uint8_t SPI_read_Reg ( uint8_t  addr)                      | */
/* +-----------------------------------------------------------------------+ */

/* +-------------------------------------------------------------------+ */
/* |                         I N C L U D E S                           | */
/* +-------------------------------------------------------------------+ */

// G L O B A L
#include <avr/io.h>
// L O C A L S
#include "spi.h"

/* +-------------------------------------------------------------------+ */
/* |                M O D U L E   V A R I A B L E S                    | */
/* +-------------------------------------------------------------------+ */

uint8_t SPIdata[SPI_MAX_BUFFER_LEN] ;


//--------------------------------------------------------------------------
//	initSPI
//
//  -Descrizione :	Inizializzazione della periferica HW SPI
//
//
//	-Parametri   :	-
//
//
//	-Return      :  -
//
//
//--------------------------------------------------------------------------

void init_SPI ( void )
{
	// impostazione SPI enable, impostazione SPI master, divisore /32
	SPCR =  (1 << SPE) | (1 << MSTR) | (1 << SPR1);
	SPSR = 	(1 << SPI2X);
}



/* +----------------------------------------------------------------------+ */
/* |                          FUNZIONI PRIVATE                            | */
/* +----------------------------------------------------------------------+ */


//--------------------------------------------------------------------------
//	tx2Byte_spi
//
//  -Descrizione :	Invio sulla SPI di due byte
//
//
//	-Parametri   :	dato1 --> dato da scrivere sulla SPI
//					dato2 --> dato da scrivere sulla SPI
//
//
//	-Return      :  OK--> operazione terminata
//
//
//--------------------------------------------------------------------------

uint8_t tx2Byte_spi ( uint8_t  dato1, uint8_t  dato2 )
{
	PORTB &= ~(1 << PB4 ); // impostazione livello SS basso all'inizio della trasmissione
	/* Start transmission */
	SPDR = dato1;
	/* Wait for transmission complete */
	while(!(SPSR & (1<<SPIF)))
		;

	SPDR = dato2;
	/* Wait for transmission complete */
	while(!(SPSR & (1<<SPIF)))
		;
	PORTB |= (1 << PB4 );	// impostazione livello SS alto alla fine della trasmissione
	return OK;
}


/* +----------------------------------------------------------------------+ */
/* |                          FUNZIONI PUBBLICHE                          | */
/* +----------------------------------------------------------------------+ */


//--------------------------------------------------------------------------
//	SPI_write_Reg
//
//  -Descrizione :	Scrittura di un registro nel RCXXX IC-reader
//
//
//	-Parametri   :	addr --> indirizzo del registro
//					val_dato --> valore da scrivere nel registro
//
//
//	-Return      :  OK --> trasmissione terminata
//					KO --> indirizzo superiore al massimo ammesso
//
//--------------------------------------------------------------------------

uint8_t  SPI_write_Reg ( uint8_t  addr, uint8_t  val_dato )
{
	uint8_t  SPI_dato[2];


	// controllo indirizzo massimo ammesso
	if ( addr > SPI_MAX_ADDRESS )
		return KO;

	// formattazione byte 0 come da specifiche:
	// MSB = 0 	bit6-bit1=address	bit0=0
	SPI_dato[0] = (( addr << 1 ) & ~BIT7 )& ~BIT0 ;
	SPI_dato[1] = val_dato;

	// Invio byte sulla SPI
	tx2Byte_spi ( SPI_dato[0], SPI_dato[1] );

	return OK;
}


//--------------------------------------------------------------------------
//	SPI_read_Reg
//
//  -Descrizione :	Lettura di un registro nel RCXXX IC-reader
//
//
//	-Parametri   :	addr 	--> indirizzo del registro da leggere
//
//
//
//
//	-Return      :  valore letto
//
//
//--------------------------------------------------------------------------

uint8_t  SPI_read_Reg ( uint8_t  addr )
{
	uint8_t  SPI_dato[2];
	uint8_t  data_read = 0;
	//uint time = 0;


	PORTB &= ~(1 << PB4 ); // impostazione livello SS basso all'inizio della trasmissione

	// formattazione byte 0 come da specifiche:
	// MSB = 1 	bit6-bit1=address	bit0=0
	SPI_dato[0] = (( addr << 1 )| BIT7 )& ~BIT0 ;
	SPI_dato[1] = 0;


	// INVIO BYTE 1
	// carico il dato da inviare sulla SPI
	SPDR = SPI_dato[0];
	/* Wait for transmission complete */
	while(!(SPSR & (1<<SPIF)))
		;

	// leggo il dato ricevuto viene sovrascritto al precedente perch

⌨️ 快捷键说明

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