Daniel Worrall / I2SSlave
Committer:
user Daniel Worrall
Date:
Thu Aug 04 14:53:50 2011 +0000
Revision:
0:e62e06e11575
Child:
1:1c6ab181537f
version 2.31

Who changed what in which revision?

UserRevisionLine numberNew contents of line
user Daniel Worrall0:e62e06e11575 1/**
user Daniel Worrall0:e62e06e11575 2* @author Daniel Worrall
user Daniel Worrall0:e62e06e11575 3*
user Daniel Worrall0:e62e06e11575 4* @section LICENSE
user Daniel Worrall0:e62e06e11575 5*
user Daniel Worrall0:e62e06e11575 6* Copyright (c) 2011 mbed
user Daniel Worrall0:e62e06e11575 7*
user Daniel Worrall0:e62e06e11575 8* Permission is hereby granted, free of charge, to any person obtaining a copy
user Daniel Worrall0:e62e06e11575 9* of this software and associated documentation files (the "Software"), to deal
user Daniel Worrall0:e62e06e11575 10* in the Software without restriction, including without limitation the rights
user Daniel Worrall0:e62e06e11575 11* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
user Daniel Worrall0:e62e06e11575 12* copies of the Software, and to permit persons to whom the Software is
user Daniel Worrall0:e62e06e11575 13* furnished to do so, subject to the following conditions:
user Daniel Worrall0:e62e06e11575 14*
user Daniel Worrall0:e62e06e11575 15* The above copyright notice and this permission notice shall be included in
user Daniel Worrall0:e62e06e11575 16* all copies or substantial portions of the Software.
user Daniel Worrall0:e62e06e11575 17*
user Daniel Worrall0:e62e06e11575 18* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
user Daniel Worrall0:e62e06e11575 19* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
user Daniel Worrall0:e62e06e11575 20* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
user Daniel Worrall0:e62e06e11575 21* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
user Daniel Worrall0:e62e06e11575 22* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
user Daniel Worrall0:e62e06e11575 23* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
user Daniel Worrall0:e62e06e11575 24* THE SOFTWARE.
user Daniel Worrall0:e62e06e11575 25*
user Daniel Worrall0:e62e06e11575 26* @section DESCRIPTION
user Daniel Worrall0:e62e06e11575 27* I2S port abstraction library cpp file for NXP LPC1768
user Daniel Worrall0:e62e06e11575 28*
user Daniel Worrall0:e62e06e11575 29*/
user Daniel Worrall0:e62e06e11575 30
user Daniel Worrall0:e62e06e11575 31#include "mbed.h"
user Daniel Worrall0:e62e06e11575 32#include "math.h"
user Daniel Worrall0:e62e06e11575 33
user Daniel Worrall0:e62e06e11575 34#ifndef __MBED_I2SSLAVE_H__
user Daniel Worrall0:e62e06e11575 35#define __MBED_I2SSLAVE_H__
user Daniel Worrall0:e62e06e11575 36
user Daniel Worrall0:e62e06e11575 37/** I2S class defined on the LPC1768 port
user Daniel Worrall0:e62e06e11575 38 *
user Daniel Worrall0:e62e06e11575 39 */
user Daniel Worrall0:e62e06e11575 40extern FunctionPointer akjnh3489v8ncv;
user Daniel Worrall0:e62e06e11575 41class I2SSlave{
user Daniel Worrall0:e62e06e11575 42
user Daniel Worrall0:e62e06e11575 43 public:
user Daniel Worrall0:e62e06e11575 44 //Constructor
user Daniel Worrall0:e62e06e11575 45 /** Create an I2S object
user Daniel Worrall0:e62e06e11575 46 *
user Daniel Worrall0:e62e06e11575 47 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 48 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 49 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 50 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 51 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 52 */
user Daniel Worrall0:e62e06e11575 53 I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 54 /** Set the data transmission format
user Daniel Worrall0:e62e06e11575 55 *
user Daniel Worrall0:e62e06e11575 56 * @param bit Set the number of bits per write
user Daniel Worrall0:e62e06e11575 57 * @param mode Set STEREO (0) or MONO (1) mode
user Daniel Worrall0:e62e06e11575 58 */
user Daniel Worrall0:e62e06e11575 59 void format(int bit, bool mode);
user Daniel Worrall0:e62e06e11575 60 /** Write a buffer to the I2S port
user Daniel Worrall0:e62e06e11575 61 *
user Daniel Worrall0:e62e06e11575 62 * @param buffer Address of buffer to pass to I2S port
user Daniel Worrall0:e62e06e11575 63 * @param from Start position in buffer to read from
user Daniel Worrall0:e62e06e11575 64 * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long)
user Daniel Worrall0:e62e06e11575 65 *
user Daniel Worrall0:e62e06e11575 66 * Note: sending 8 words to the TXFIFO will trigger an interrupt!
user Daniel Worrall0:e62e06e11575 67 */
user Daniel Worrall0:e62e06e11575 68 void write(int* buffer, int from, int length);
user Daniel Worrall0:e62e06e11575 69 /** Activate I2S port for data streaming
user Daniel Worrall0:e62e06e11575 70 *
user Daniel Worrall0:e62e06e11575 71 * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH
user Daniel Worrall0:e62e06e11575 72 * Enables tx/rx interrupts
user Daniel Worrall0:e62e06e11575 73 */
user Daniel Worrall0:e62e06e11575 74 void start(int mode);
user Daniel Worrall0:e62e06e11575 75 /** Deactivate I2S port from data streaming
user Daniel Worrall0:e62e06e11575 76 *
user Daniel Worrall0:e62e06e11575 77 * Disable all interrupts
user Daniel Worrall0:e62e06e11575 78 */
user Daniel Worrall0:e62e06e11575 79 void stop(void);
user Daniel Worrall0:e62e06e11575 80 /** Load receive FIFO data into receiver buffer
user Daniel Worrall0:e62e06e11575 81 *
user Daniel Worrall0:e62e06e11575 82 */
user Daniel Worrall0:e62e06e11575 83 void read(void);
user Daniel Worrall0:e62e06e11575 84 /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs
user Daniel Worrall0:e62e06e11575 85 *
user Daniel Worrall0:e62e06e11575 86 * @param function Function to attach
user Daniel Worrall0:e62e06e11575 87 *
user Daniel Worrall0:e62e06e11575 88 * e.g. myI2sObject.attach(&myfunction);
user Daniel Worrall0:e62e06e11575 89 * OR myI2sObject.attach(&myClass::myStaticMemberFunction);
user Daniel Worrall0:e62e06e11575 90 */
user Daniel Worrall0:e62e06e11575 91 void attach(void(*fptr)(void)){
user Daniel Worrall0:e62e06e11575 92 akjnh3489v8ncv.attach(fptr);
user Daniel Worrall0:e62e06e11575 93 }
user Daniel Worrall0:e62e06e11575 94 /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
user Daniel Worrall0:e62e06e11575 95 *
user Daniel Worrall0:e62e06e11575 96 * @param tptr Object pointer
user Daniel Worrall0:e62e06e11575 97 * @param mptr Member function pointer
user Daniel Worrall0:e62e06e11575 98 *
user Daniel Worrall0:e62e06e11575 99 * e.g. myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass
user Daniel Worrall0:e62e06e11575 100 */
user Daniel Worrall0:e62e06e11575 101 template<typename T>
user Daniel Worrall0:e62e06e11575 102 void attach(T *tptr, void(T::*mptr)(void)){
user Daniel Worrall0:e62e06e11575 103 akjnh3489v8ncv.attach(tptr, mptr);
user Daniel Worrall0:e62e06e11575 104 }
user Daniel Worrall0:e62e06e11575 105 /** Return contents of I2S status register
user Daniel Worrall0:e62e06e11575 106 *
user Daniel Worrall0:e62e06e11575 107 * @returns Content of I2SSTATE register
user Daniel Worrall0:e62e06e11575 108 *
user Daniel Worrall0:e62e06e11575 109 * bit0: receive/transmit interrupt active
user Daniel Worrall0:e62e06e11575 110 * bit1: receive/transmit DMA request 1
user Daniel Worrall0:e62e06e11575 111 * bit2: receive/transmit DMA request 2
user Daniel Worrall0:e62e06e11575 112 * bit[11:8]: receive FIFO level
user Daniel Worrall0:e62e06e11575 113 * bit[19:16]: transmit FIFO level
user Daniel Worrall0:e62e06e11575 114 */
user Daniel Worrall0:e62e06e11575 115 int status(void);
user Daniel Worrall0:e62e06e11575 116
user Daniel Worrall0:e62e06e11575 117 //Receiver buffer
user Daniel Worrall0:e62e06e11575 118 int rxBuffer[4];
user Daniel Worrall0:e62e06e11575 119 //defines
user Daniel Worrall0:e62e06e11575 120 #define STEREO 0
user Daniel Worrall0:e62e06e11575 121 #define MONO 1
user Daniel Worrall0:e62e06e11575 122
user Daniel Worrall0:e62e06e11575 123 #define I2SFIFO_EMPTY 0
user Daniel Worrall0:e62e06e11575 124 #define I2SFIFO_FULL 8
user Daniel Worrall0:e62e06e11575 125
user Daniel Worrall0:e62e06e11575 126 #define RAM_LENGTH 1024
user Daniel Worrall0:e62e06e11575 127 #define RAM_LIMIT (RAM_LENGTH - 1)
user Daniel Worrall0:e62e06e11575 128 #define PTR_MAX ((RAM_LENGTH / 8) - 1)
user Daniel Worrall0:e62e06e11575 129
user Daniel Worrall0:e62e06e11575 130 #define NONE 0
user Daniel Worrall0:e62e06e11575 131 #define TRANSMIT 1
user Daniel Worrall0:e62e06e11575 132 #define RECEIVE 2
user Daniel Worrall0:e62e06e11575 133 #define BOTH 3
user Daniel Worrall0:e62e06e11575 134
user Daniel Worrall0:e62e06e11575 135 private:
user Daniel Worrall0:e62e06e11575 136 /** I2S intitalize function
user Daniel Worrall0:e62e06e11575 137 *
user Daniel Worrall0:e62e06e11575 138 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 139 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 140 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 141 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 142 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 143 * @return Returns 0 for successful initialisation, -1 for an error
user Daniel Worrall0:e62e06e11575 144 */
user Daniel Worrall0:e62e06e11575 145 int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 146 /** Set internal clock divide by rate
user Daniel Worrall0:e62e06e11575 147 *
user Daniel Worrall0:e62e06e11575 148 * @param divideBy Divide by 1, 2, 4 or 8
user Daniel Worrall0:e62e06e11575 149 */
user Daniel Worrall0:e62e06e11575 150 void setClocks_(int divideBy);
user Daniel Worrall0:e62e06e11575 151 /** Set up the pins on the processor itself
user Daniel Worrall0:e62e06e11575 152 *
user Daniel Worrall0:e62e06e11575 153 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 154 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 155 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 156 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 157 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 158 */
user Daniel Worrall0:e62e06e11575 159 void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 160 /** Set the data transmission format
user Daniel Worrall0:e62e06e11575 161 *
user Daniel Worrall0:e62e06e11575 162 * @param bit Set the number of bits per write
user Daniel Worrall0:e62e06e11575 163 * @param mode Set STEREO (0) or MONO (1) mode
user Daniel Worrall0:e62e06e11575 164 */
user Daniel Worrall0:e62e06e11575 165 void format_(int bit, bool mode);
user Daniel Worrall0:e62e06e11575 166 /** Set slave mode
user Daniel Worrall0:e62e06e11575 167 *
user Daniel Worrall0:e62e06e11575 168 */
user Daniel Worrall0:e62e06e11575 169 void modeConfig_(void);
user Daniel Worrall0:e62e06e11575 170 /** Store PinName values
user Daniel Worrall0:e62e06e11575 171 *
user Daniel Worrall0:e62e06e11575 172 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 173 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 174 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 175 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 176 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 177 */
user Daniel Worrall0:e62e06e11575 178 void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 179 //variables
user Daniel Worrall0:e62e06e11575 180 int bit_;
user Daniel Worrall0:e62e06e11575 181 bool mode_;
user Daniel Worrall0:e62e06e11575 182 PinName tx_sda_;
user Daniel Worrall0:e62e06e11575 183 PinName tx_ws_;
user Daniel Worrall0:e62e06e11575 184 PinName clk_;
user Daniel Worrall0:e62e06e11575 185 PinName rx_sda_;
user Daniel Worrall0:e62e06e11575 186 PinName rx_ws_;
user Daniel Worrall0:e62e06e11575 187};
user Daniel Worrall0:e62e06e11575 188
user Daniel Worrall0:e62e06e11575 189#endif /*__MBED_I2S_H__*/