Thi s library works either for lpc1768 or lpc4088 QSB

Fork of I2SSlave by Suga koubou

Revision:
0:e62e06e11575
Child:
1:1c6ab181537f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/I2SSlave.h	Thu Aug 04 14:53:50 2011 +0000
@@ -0,0 +1,189 @@
+/**
+* @author Daniel Worrall
+*
+* @section LICENSE
+*
+* Copyright (c) 2011 mbed
+*
+* 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.
+*
+* @section DESCRIPTION
+*    I2S port abstraction library cpp file for NXP LPC1768
+*
+*/ 
+
+#include "mbed.h"
+#include "math.h"
+
+#ifndef __MBED_I2SSLAVE_H__
+#define __MBED_I2SSLAVE_H__
+
+/** I2S class defined on the LPC1768 port
+ *
+ */
+extern FunctionPointer akjnh3489v8ncv;
+class I2SSlave{
+
+    public:
+        //Constructor
+        /** Create an I2S object
+         *
+         * @param tx_sda Transmitter serial data line
+         * @param tx_ws Transmitter word select line
+         * @param clk Shared transmitter/receiver clock line
+         * @param rx_sda Receiver serial data line
+         * @param rx_ws Receiver word select line
+         */
+        I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
+        /** Set the data transmission format
+         *
+         * @param bit Set the number of bits per write
+         * @param mode Set STEREO (0) or MONO (1) mode
+         */
+        void format(int bit, bool mode);
+        /** Write a buffer to the I2S port
+         *
+         * @param buffer Address of buffer to pass to I2S port
+         * @param from Start position in buffer to read from
+         * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long)
+         *
+         * Note: sending 8 words to the TXFIFO will trigger an interrupt!
+         */
+        void write(int* buffer, int from,  int length);
+        /** Activate I2S port for data streaming 
+         *
+         * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH
+         * Enables tx/rx interrupts
+         */
+        void start(int mode);
+        /** Deactivate I2S port from data streaming 
+         *
+         * Disable all interrupts
+         */
+        void stop(void);
+        /** Load receive FIFO data into receiver buffer
+         *
+         */
+        void read(void);
+        /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs
+         *
+         * @param function Function to attach
+         *
+         * e.g. myI2sObject.attach(&myfunction);
+         * OR   myI2sObject.attach(&myClass::myStaticMemberFunction);
+         */
+        void attach(void(*fptr)(void)){
+            akjnh3489v8ncv.attach(fptr);
+        }
+        /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
+         *
+         * @param tptr Object pointer
+         * @param mptr Member function pointer
+         *
+         * e.g. myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass
+         */
+        template<typename T>
+        void attach(T *tptr, void(T::*mptr)(void)){
+            akjnh3489v8ncv.attach(tptr, mptr);
+        }
+        /** Return contents of I2S status register
+         *
+         * @returns Content of I2SSTATE register
+         *
+         * bit0: receive/transmit interrupt active
+         * bit1: receive/transmit DMA request 1
+         * bit2: receive/transmit DMA request 2
+         * bit[11:8]: receive FIFO level
+         * bit[19:16]: transmit FIFO level
+         */
+        int status(void);
+        
+        //Receiver buffer
+        int rxBuffer[4];
+        //defines
+        #define STEREO  0
+        #define MONO    1
+        
+        #define I2SFIFO_EMPTY    0
+        #define I2SFIFO_FULL     8
+        
+        #define RAM_LENGTH  1024
+        #define RAM_LIMIT   (RAM_LENGTH - 1) 
+        #define PTR_MAX     ((RAM_LENGTH / 8) - 1)
+        
+        #define NONE        0
+        #define TRANSMIT    1
+        #define RECEIVE     2
+        #define BOTH        3
+
+    private:        
+        /** I2S intitalize function
+         *
+         * @param tx_sda Transmitter serial data line
+         * @param tx_ws Transmitter word select line
+         * @param clk Shared transmitter/receiver clock line
+         * @param rx_sda Receiver serial data line
+         * @param rx_ws Receiver word select line
+         * @return Returns 0 for successful initialisation, -1 for an error
+         */
+        int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
+        /** Set internal clock divide by rate
+         *
+         * @param divideBy Divide by 1, 2, 4 or 8
+         */
+        void setClocks_(int divideBy);
+        /** Set up the pins on the processor itself
+         *
+         * @param tx_sda Transmitter serial data line
+         * @param tx_ws Transmitter word select line
+         * @param clk Shared transmitter/receiver clock line
+         * @param rx_sda Receiver serial data line
+         * @param rx_ws Receiver word select line
+         */
+        void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
+        /** Set the data transmission format 
+         *
+         * @param bit Set the number of bits per write
+         * @param mode Set STEREO (0) or MONO (1) mode
+         */
+        void format_(int bit, bool mode);
+        /** Set slave mode
+         *
+         */
+        void modeConfig_(void);
+        /** Store PinName values
+         * 
+         * @param tx_sda Transmitter serial data line
+         * @param tx_ws Transmitter word select line
+         * @param clk Shared transmitter/receiver clock line
+         * @param rx_sda Receiver serial data line
+         * @param rx_ws Receiver word select line
+         */
+        void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
+        //variables
+        int bit_;
+        bool mode_;
+        PinName tx_sda_; 
+        PinName tx_ws_; 
+        PinName clk_;
+        PinName rx_sda_;
+        PinName rx_ws_;
+};
+
+#endif /*__MBED_I2S_H__*/
\ No newline at end of file