Contiki 2.6

spi.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2010, Swedish Institute of Computer Science.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * $Id: spi.h,v 1.8 2010/06/23 10:15:28 joxe Exp $
00030  */
00031 
00032 /**
00033  * \file
00034  *         Basic SPI macros
00035  * \author
00036  *         Joakim Eriksson <joakime@sics.se>
00037  *         Niclas Finne <nfi@sics.se>
00038  */
00039 
00040 #ifndef __SPI_H__
00041 #define __SPI_H__
00042 
00043 /* Define macros to use for checking SPI transmission status depending
00044    on if it is possible to wait for TX buffer ready. This is possible
00045    on for example MSP430 but not on AVR. */
00046 #ifdef SPI_WAITFORTxREADY
00047 #define SPI_WAITFORTx_BEFORE() SPI_WAITFORTxREADY()
00048 #define SPI_WAITFORTx_AFTER()
00049 #define SPI_WAITFORTx_ENDED() SPI_WAITFOREOTx()
00050 #else /* SPI_WAITFORTxREADY */
00051 #define SPI_WAITFORTx_BEFORE()
00052 #define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx()
00053 #define SPI_WAITFORTx_ENDED()
00054 #endif /* SPI_WAITFORTxREADY */
00055 
00056 extern unsigned char spi_busy;
00057 
00058 void spi_init(void);
00059 
00060 /* Write one character to SPI */
00061 #define SPI_WRITE(data)                         \
00062   do {                                          \
00063     SPI_WAITFORTx_BEFORE();                     \
00064     SPI_TXBUF = data;                           \
00065     SPI_WAITFOREOTx();                          \
00066   } while(0)
00067 
00068 /* Write one character to SPI - will not wait for end
00069    useful for multiple writes with wait after final */
00070 #define SPI_WRITE_FAST(data)                    \
00071   do {                                          \
00072     SPI_WAITFORTx_BEFORE();                     \
00073     SPI_TXBUF = data;                           \
00074     SPI_WAITFORTx_AFTER();                      \
00075   } while(0)
00076 
00077 /* Read one character from SPI */
00078 #define SPI_READ(data)   \
00079   do {                   \
00080     SPI_TXBUF = 0;       \
00081     SPI_WAITFOREORx();   \
00082     data = SPI_RXBUF;    \
00083   } while(0)
00084 
00085 /* Flush the SPI read register */
00086 #define SPI_FLUSH() \
00087   do {              \
00088     SPI_RXBUF;      \
00089   } while(0);
00090 
00091 
00092 #endif /* __SPI_H__ */