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__ */