00001
00059 #ifndef SPI_DRIVER_H
00060 #define SPI_DRIVER_H
00061
00062 #include "avr_compiler.h"
00063
00064
00065
00066 #define SPI_SS_bm 0x10
00067 #define SPI_MOSI_bm 0x20
00068 #define SPI_MISO_bm 0x40
00069 #define SPI_SCK_bm 0x80
00071
00072
00073 #define SPI_OK 0
00074 #define SPI_INTERRUPTED 1
00075 #define SPI_BUSY 2
00079 typedef struct SPI_DataPacket
00080 {
00081 PORT_t *ssPort;
00082 uint8_t ssPinMask;
00083 const uint8_t *transmitData;
00084 volatile uint8_t *receiveData;
00085 volatile uint8_t bytesToTransceive;
00086 volatile uint8_t bytesTransceived;
00087 volatile bool complete;
00088 } SPI_DataPacket_t;
00089
00090
00092 typedef struct SPI_Master
00093 {
00094 SPI_t *module;
00095 PORT_t *port;
00096 bool interrupted;
00097 SPI_DataPacket_t *dataPacket;
00098 } SPI_Master_t;
00099
00100
00102 typedef struct SPI_Slave
00103 {
00104 SPI_t *module;
00105 PORT_t *port;
00106 } SPI_Slave_t;
00107
00108
00109
00110
00111
00120 #define SPI_MasterInterruptTransmissionComplete(_spi) ( (_spi)->dataPacket->complete )
00121
00122
00123
00131 #define SPI_MasterSSLow(_port, _pinBM) ( (_port)->OUTCLR = (_pinBM) )
00132
00133
00134
00142 #define SPI_MasterSSHigh(_port, _pinBM) ( (_port)->OUTSET = (_pinBM) )
00143
00144
00145
00151 #define SPI_SlaveWriteByte(_spi, _data) ( (_spi)->module->DATA = (_data) )
00152
00153
00154
00161 #define SPI_SlaveReadByte(_spi) ( (_spi)->module->DATA )
00162
00163
00164
00171 #define SPI_SlaveDataAvailable(_spi) ( (_spi)->module->STATUS & SPI_IF_bm )
00172
00173
00174
00175
00176 void SPI_MasterInit(SPI_Master_t *spi,
00177 SPI_t *module,
00178 PORT_t *port,
00179 bool lsbFirst,
00180 SPI_MODE_t mode,
00181 SPI_INTLVL_t intLevel,
00182 bool clk2x,
00183 SPI_PRESCALER_t clockDivision);
00184
00185 void SPI_SlaveInit(SPI_Slave_t *spi,
00186 SPI_t *module,
00187 PORT_t *port,
00188 bool lsbFirst,
00189 SPI_MODE_t mode,
00190 SPI_INTLVL_t intLevel);
00191
00192 void SPI_MasterCreateDataPacket(SPI_DataPacket_t *dataPacket,
00193 const uint8_t *transmitData,
00194 uint8_t *receiveData,
00195 uint8_t bytesToTransceive,
00196 PORT_t *ssPort,
00197 uint8_t ssPinMask);
00198
00199 void SPI_MasterInterruptHandler(SPI_Master_t *spi);
00200
00201 uint8_t SPI_MasterInterruptTransceivePacket(SPI_Master_t *spi,
00202 SPI_DataPacket_t *dataPacket);
00203
00204 uint8_t SPI_MasterTransceiveByte(SPI_Master_t *spi, uint8_t TXdata);
00205
00206 bool SPI_MasterTransceivePacket(SPI_Master_t *spi,
00207 SPI_DataPacket_t *dataPacket);
00208
00209 #endif