Xmega Application Note


spi_driver.h
Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00062 #ifndef SPI_DRIVER_H
00063 #define SPI_DRIVER_H
00064 
00065 #include "avr_compiler.h"
00066 
00067 /* Hardware defines */
00068 
00069 #define SPI_SS_bm             0x10 
00070 #define SPI_MOSI_bm           0x20 
00071 #define SPI_MISO_bm           0x40 
00072 #define SPI_SCK_bm            0x80 
00074 /* SPI master status code defines. */
00075 
00076 #define SPI_OK              0     
00077 #define SPI_INTERRUPTED     1     
00078 #define SPI_BUSY            2     
00082 typedef struct SPI_DataPacket
00083 {
00084         PORT_t *ssPort;                     
00085         uint8_t ssPinMask;                  
00086         const uint8_t *transmitData;        
00087         volatile uint8_t *receiveData;      
00088         volatile uint8_t bytesToTransceive; 
00089         volatile uint8_t bytesTransceived;  
00090         volatile bool complete;             
00091 } SPI_DataPacket_t;
00092 
00093 
00095 typedef struct SPI_Master
00096 {
00097         SPI_t *module;                
00098         PORT_t *port;                 
00099         bool interrupted;             
00100         SPI_DataPacket_t *dataPacket; 
00101 } SPI_Master_t;
00102 
00103 
00105 typedef struct SPI_Slave
00106 {
00107         SPI_t *module;      
00108         PORT_t *port;       
00109 } SPI_Slave_t;
00110 
00111 
00112 /* Definitions of macros. */
00113 
00114 
00123 #define SPI_MasterInterruptTransmissionComplete(_spi) ( (_spi)->dataPacket->complete )
00124 
00125 
00126 
00134 #define SPI_MasterSSLow(_port, _pinBM) ( (_port)->OUTCLR = (_pinBM) )
00135 
00136 
00137 
00145 #define SPI_MasterSSHigh(_port, _pinBM) ( (_port)->OUTSET = (_pinBM) )
00146 
00147 
00148 
00154 #define SPI_SlaveWriteByte(_spi, _data) ( (_spi)->module->DATA = (_data) )
00155 
00156 
00157 
00164 #define SPI_SlaveReadByte(_spi) ( (_spi)->module->DATA )
00165 
00166 
00167 
00174 #define SPI_SlaveDataAvailable(_spi) ( (_spi)->module->STATUS & SPI_IF_bm )
00175 
00176 
00177 /* Prototype functions. Documentation found in source file */
00178 
00179 void SPI_MasterInit(SPI_Master_t *spi,
00180                     SPI_t *module,
00181                     PORT_t *port,
00182                                         bool lsbFirst,
00183                     SPI_MODE_t mode,
00184                     SPI_INTLVL_t intLevel,
00185                     bool clk2x,
00186                     SPI_PRESCALER_t clockDivision);
00187 
00188 void SPI_SlaveInit(SPI_Slave_t *spi,
00189                    SPI_t *module,
00190                    PORT_t *port,
00191                    bool lsbFirst,
00192                    SPI_MODE_t mode,
00193                    SPI_INTLVL_t intLevel);
00194 
00195 void SPI_MasterCreateDataPacket(SPI_DataPacket_t *dataPacket,
00196                                 const uint8_t *transmitData,
00197                                 uint8_t *receiveData,
00198                                 uint8_t bytesToTransceive,
00199                                 PORT_t *ssPort,
00200                                 uint8_t ssPinMask);
00201 
00202 void SPI_MasterInterruptHandler(SPI_Master_t *spi);
00203 
00204 uint8_t SPI_MasterInterruptTransceivePacket(SPI_Master_t *spi,
00205                                             SPI_DataPacket_t *dataPacket);
00206 
00207 uint8_t SPI_MasterTransceiveByte(SPI_Master_t *spi, uint8_t TXdata);
00208 
00209 bool SPI_MasterTransceivePacket(SPI_Master_t *spi,
00210                                 SPI_DataPacket_t *dataPacket);
00211 
00212 #endif