Go to the documentation of this file.00001
00062 #ifndef SPI_DRIVER_H
00063 #define SPI_DRIVER_H
00064
00065 #include "avr_compiler.h"
00066
00067
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
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
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
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