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