MMEx with SPI Slave to allow legacy devices to communicate with modern media such as USB, SD cards, the internet and all of the mbed\'s other interfaces
Dependencies: NetServices MSCUsbHost mbed TMP102 SDFileSystem
spissp/spissp.h
- Committer:
- DeMein
- Date:
- 2011-02-27
- Revision:
- 0:67a55a82ce06
File content as of revision 0:67a55a82ce06:
/* MMEx for MBED - SPI interfacing and ringbuffer functions * Copyright (c) 2011 MK * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** \file spissp.h \brief SPI interfacing and ringbuffer functions */ #ifndef SPISSP_H #define SPISSP_H #include "mbed.h" #include "lpc17xx_ssp.h" #include "globaldefs.h" // macros for managing the SSP interface SSP0 only! #define tx_fifo_notfull (LPC_SSP0->SR & SSP_STAT_TXFIFO_NOTFULL) #define tx_fifo_empty (LPC_SSP0->SR & SSP_STAT_TXFIFO_EMPTY) #define rx_fifo_notempty (LPC_SSP0->SR & SSP_STAT_RXFIFO_NOTEMPTY) #define rx_fifo_full (LPC_SSP0->SR & SSP_STAT_RXFIFO_FULL) #define irq_RTMIS (LPC_SSP0->MIS & SSP_MIS_RT) // RX FIFO timeout #define irq_RXMIS (LPC_SSP0->MIS & SSP_MIS_RX) // RX FIFO half full #define irq_RISOVR (LPC_SSP0->RIS & SSP_RIS_ROR) // receive overrun #define DBG_OFF 0 #define DBG_ON 1 #define DBG_FULL 2 /** Library for the interrupt driven SPI SLave * */ class spislirq { public: /** initialize the SPI interface * */ spislirq(int PortNum); /** initialization of SPI Slave and buffers * */ void init(); /** attach callback for network (or other?) polling * */ void attach(void (*function)(void)) { _callback.attach(function); } /** attach callback for network (or other?) polling * */ /** disable SSP0 interrupts * will discard the byte if buffer full */ void disable_irq(void); /** enable SSP0 interrupts * will discard the byte if buffer full */ void enable_irq(void); /** add one byte to the transmit buffer, no blocking, no protocol * will discard the byte if buffer full * * @param c byte to send */ void txx_add(unsigned char c); /** returns the number of bytes available in the transmit buffer * * @return available space in transmit buffer */ int tx_room(); /** returns the amount af actual bytes used in the transmit buffer * * @return bytes used in transmit buffer */ int tx_use(); /** returns the number of bytes available in the receive buffer * * @return available space in transmit buffer */ int rx_room(); /** returns the percentage used in the transmit buffer * * @return percentage from 0 to 100 */ int tx_perc(); /** returns the percentage used in the receive buffer * * @return percentage from 0 to 100 */ int rx_perc(); /** returns the amount af actual bytes used in the receive buffer * * @return bytes used in receive buffer */ int rx_use(); /** empties the transmit buffer */ void flush_tx(); /** empties the receive buffer */ void flush_rx(); /** add one byte to the transmit buffer, no protocol handling is done * * @param Bt byte to send * @return 0 when succesfull, will block until there is room in the buffer * */ int tx_add(unsigned char Bt); /** add one byte to the transmit buffer with protocol handling, * function will block until there is room in the transmit buffer * * @param Bt byte to send */ void tx_addp(unsigned char Bt); /** adds a complete string to the transmit buffer, with protocol processing. * function will block until there is room in the transmit buffer * * @param S string to be transmitted * @return always returns 0 */ int tx_string(char S[]); /** read one byte from the receive buffer without protocol processing * * @return the character read, blocks if RX buffer is empty! * */ int rx_read(); /** inserts one byte in the receive buffer without protocol processing * used for command batch processing * * @return the character read, blocks if RX buffer is empty! * */ int rx_add(unsigned char c); /** peeks in receive buffer, reads next pending input char without advancing buffer pointer * * @return the character read, blocks if RX buffer is empty! * */ int rx_peek(); /** read one byte, will wait until a valid char is read, * this function is blocking and will process escape characters, * when an escape is seen, will try to read the next char * * @param mode command line processing or data read (ignored) * @return character read, or -1 when >F seen, -2 when >I seen * */ int rxx_read(bool mode); void DBG_set(int l); /** check if the TX buffer is empty * @return true if the TX buffer is empty */ bool tx_empty(); /** check if the TX buffer is full * @return true if the TX buffer is full */ bool tx_full(); /** check if the RX buffer is empty * @return true if the RX buffer is empty */ bool rx_empty(); /** check if the RX buffer is full * @return true if the RX buffer is full */ bool rx_full(); private: SPISlave smldl; // uses SPI Class from MBED library Serial pc; DigitalOut _led4; FunctionPointer _callback; int hex2int(char C); void spi_isr(); // interrupt service routine static void _spi_isr(void); static spislirq *instance; void DBG_outchar(char C); void DBG_inchar(char C); void DBG_chr(char* src, char c); void do_callback(void) { _callback.call(); }; // buffers and pointers in buffers #define bufsize 255 unsigned char rxxbuf[bufsize]; // receive buffer unsigned char txxbuf[bufsize]; // transmit buffer int tx_in; int tx_out; int rx_in; int rx_out; int DBG_level; }; #endif