Daniel Worrall / I2SSlave
Committer:
user Daniel Worrall
Date:
Thu Aug 04 14:58:11 2011 +0000
Revision:
2:f25201f154d0
Parent:
1:1c6ab181537f
Child:
3:5a09a8df83b1
version 2.32

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 Worrall1:1c6ab181537f 37extern FunctionPointer akjnh3489v8ncv;
user Daniel Worrall1:1c6ab181537f 38
user Daniel Worrall0:e62e06e11575 39/** I2S class defined on the LPC1768 port
user Daniel Worrall0:e62e06e11575 40 *
user Daniel Worrall0:e62e06e11575 41 */
user Daniel Worrall0:e62e06e11575 42class I2SSlave{
user Daniel Worrall0:e62e06e11575 43
user Daniel Worrall0:e62e06e11575 44 public:
user Daniel Worrall0:e62e06e11575 45 //Constructor
user Daniel Worrall0:e62e06e11575 46 /** Create an I2S object
user Daniel Worrall0:e62e06e11575 47 *
user Daniel Worrall0:e62e06e11575 48 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 49 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 50 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 51 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 52 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 53 */
user Daniel Worrall0:e62e06e11575 54 I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 55 /** Set the data transmission format
user Daniel Worrall0:e62e06e11575 56 *
user Daniel Worrall0:e62e06e11575 57 * @param bit Set the number of bits per write
user Daniel Worrall0:e62e06e11575 58 * @param mode Set STEREO (0) or MONO (1) mode
user Daniel Worrall0:e62e06e11575 59 */
user Daniel Worrall0:e62e06e11575 60 void format(int bit, bool mode);
user Daniel Worrall0:e62e06e11575 61 /** Write a buffer to the I2S port
user Daniel Worrall0:e62e06e11575 62 *
user Daniel Worrall0:e62e06e11575 63 * @param buffer Address of buffer to pass to I2S port
user Daniel Worrall0:e62e06e11575 64 * @param from Start position in buffer to read from
user Daniel Worrall0:e62e06e11575 65 * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long)
user Daniel Worrall0:e62e06e11575 66 *
user Daniel Worrall0:e62e06e11575 67 * Note: sending 8 words to the TXFIFO will trigger an interrupt!
user Daniel Worrall0:e62e06e11575 68 */
user Daniel Worrall0:e62e06e11575 69 void write(int* buffer, int from, int length);
user Daniel Worrall0:e62e06e11575 70 /** Activate I2S port for data streaming
user Daniel Worrall0:e62e06e11575 71 *
user Daniel Worrall0:e62e06e11575 72 * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH
user Daniel Worrall0:e62e06e11575 73 * Enables tx/rx interrupts
user Daniel Worrall0:e62e06e11575 74 */
user Daniel Worrall0:e62e06e11575 75 void start(int mode);
user Daniel Worrall0:e62e06e11575 76 /** Deactivate I2S port from data streaming
user Daniel Worrall0:e62e06e11575 77 *
user Daniel Worrall0:e62e06e11575 78 * Disable all interrupts
user Daniel Worrall0:e62e06e11575 79 */
user Daniel Worrall0:e62e06e11575 80 void stop(void);
user Daniel Worrall0:e62e06e11575 81 /** Load receive FIFO data into receiver buffer
user Daniel Worrall0:e62e06e11575 82 *
user Daniel Worrall0:e62e06e11575 83 */
user Daniel Worrall0:e62e06e11575 84 void read(void);
user Daniel Worrall0:e62e06e11575 85 /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs
user Daniel Worrall0:e62e06e11575 86 *
user Daniel Worrall0:e62e06e11575 87 * @param function Function to attach
user Daniel Worrall0:e62e06e11575 88 *
user Daniel Worrall2:f25201f154d0 89 * <<code>> myI2sObject.attach(&myfunction); <</code>>
user Daniel Worrall2:f25201f154d0 90 * OR <<code>> myI2sObject.attach(&myClass::myStaticMemberFunction); <</code>>
user Daniel Worrall0:e62e06e11575 91 */
user Daniel Worrall0:e62e06e11575 92 void attach(void(*fptr)(void)){
user Daniel Worrall0:e62e06e11575 93 akjnh3489v8ncv.attach(fptr);
user Daniel Worrall0:e62e06e11575 94 }
user Daniel Worrall0:e62e06e11575 95 /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
user Daniel Worrall0:e62e06e11575 96 *
user Daniel Worrall0:e62e06e11575 97 * @param tptr Object pointer
user Daniel Worrall0:e62e06e11575 98 * @param mptr Member function pointer
user Daniel Worrall0:e62e06e11575 99 *
user Daniel Worrall0:e62e06e11575 100 * e.g. myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass
user Daniel Worrall0:e62e06e11575 101 */
user Daniel Worrall0:e62e06e11575 102 template<typename T>
user Daniel Worrall0:e62e06e11575 103 void attach(T *tptr, void(T::*mptr)(void)){
user Daniel Worrall0:e62e06e11575 104 akjnh3489v8ncv.attach(tptr, mptr);
user Daniel Worrall0:e62e06e11575 105 }
user Daniel Worrall0:e62e06e11575 106 /** Return contents of I2S status register
user Daniel Worrall0:e62e06e11575 107 *
user Daniel Worrall0:e62e06e11575 108 * @returns Content of I2SSTATE register
user Daniel Worrall0:e62e06e11575 109 *
user Daniel Worrall0:e62e06e11575 110 * bit0: receive/transmit interrupt active
user Daniel Worrall0:e62e06e11575 111 * bit1: receive/transmit DMA request 1
user Daniel Worrall0:e62e06e11575 112 * bit2: receive/transmit DMA request 2
user Daniel Worrall0:e62e06e11575 113 * bit[11:8]: receive FIFO level
user Daniel Worrall0:e62e06e11575 114 * bit[19:16]: transmit FIFO level
user Daniel Worrall0:e62e06e11575 115 */
user Daniel Worrall0:e62e06e11575 116 int status(void);
user Daniel Worrall0:e62e06e11575 117
user Daniel Worrall0:e62e06e11575 118 //Receiver buffer
user Daniel Worrall0:e62e06e11575 119 int rxBuffer[4];
user Daniel Worrall0:e62e06e11575 120 //defines
user Daniel Worrall0:e62e06e11575 121 #define STEREO 0
user Daniel Worrall0:e62e06e11575 122 #define MONO 1
user Daniel Worrall0:e62e06e11575 123
user Daniel Worrall0:e62e06e11575 124 #define I2SFIFO_EMPTY 0
user Daniel Worrall0:e62e06e11575 125 #define I2SFIFO_FULL 8
user Daniel Worrall0:e62e06e11575 126
user Daniel Worrall0:e62e06e11575 127 #define RAM_LENGTH 1024
user Daniel Worrall0:e62e06e11575 128 #define RAM_LIMIT (RAM_LENGTH - 1)
user Daniel Worrall0:e62e06e11575 129 #define PTR_MAX ((RAM_LENGTH / 8) - 1)
user Daniel Worrall0:e62e06e11575 130
user Daniel Worrall0:e62e06e11575 131 #define NONE 0
user Daniel Worrall0:e62e06e11575 132 #define TRANSMIT 1
user Daniel Worrall0:e62e06e11575 133 #define RECEIVE 2
user Daniel Worrall0:e62e06e11575 134 #define BOTH 3
user Daniel Worrall0:e62e06e11575 135
user Daniel Worrall0:e62e06e11575 136 private:
user Daniel Worrall0:e62e06e11575 137 /** I2S intitalize function
user Daniel Worrall0:e62e06e11575 138 *
user Daniel Worrall0:e62e06e11575 139 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 140 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 141 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 142 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 143 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 144 * @return Returns 0 for successful initialisation, -1 for an error
user Daniel Worrall0:e62e06e11575 145 */
user Daniel Worrall0:e62e06e11575 146 int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 147 /** Set internal clock divide by rate
user Daniel Worrall0:e62e06e11575 148 *
user Daniel Worrall0:e62e06e11575 149 * @param divideBy Divide by 1, 2, 4 or 8
user Daniel Worrall0:e62e06e11575 150 */
user Daniel Worrall0:e62e06e11575 151 void setClocks_(int divideBy);
user Daniel Worrall0:e62e06e11575 152 /** Set up the pins on the processor itself
user Daniel Worrall0:e62e06e11575 153 *
user Daniel Worrall0:e62e06e11575 154 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 155 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 156 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 157 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 158 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 159 */
user Daniel Worrall0:e62e06e11575 160 void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 161 /** Set the data transmission format
user Daniel Worrall0:e62e06e11575 162 *
user Daniel Worrall0:e62e06e11575 163 * @param bit Set the number of bits per write
user Daniel Worrall0:e62e06e11575 164 * @param mode Set STEREO (0) or MONO (1) mode
user Daniel Worrall0:e62e06e11575 165 */
user Daniel Worrall0:e62e06e11575 166 void format_(int bit, bool mode);
user Daniel Worrall0:e62e06e11575 167 /** Set slave mode
user Daniel Worrall0:e62e06e11575 168 *
user Daniel Worrall0:e62e06e11575 169 */
user Daniel Worrall0:e62e06e11575 170 void modeConfig_(void);
user Daniel Worrall0:e62e06e11575 171 /** Store PinName values
user Daniel Worrall0:e62e06e11575 172 *
user Daniel Worrall0:e62e06e11575 173 * @param tx_sda Transmitter serial data line
user Daniel Worrall0:e62e06e11575 174 * @param tx_ws Transmitter word select line
user Daniel Worrall0:e62e06e11575 175 * @param clk Shared transmitter/receiver clock line
user Daniel Worrall0:e62e06e11575 176 * @param rx_sda Receiver serial data line
user Daniel Worrall0:e62e06e11575 177 * @param rx_ws Receiver word select line
user Daniel Worrall0:e62e06e11575 178 */
user Daniel Worrall0:e62e06e11575 179 void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
user Daniel Worrall0:e62e06e11575 180 //variables
user Daniel Worrall0:e62e06e11575 181 int bit_;
user Daniel Worrall0:e62e06e11575 182 bool mode_;
user Daniel Worrall0:e62e06e11575 183 PinName tx_sda_;
user Daniel Worrall0:e62e06e11575 184 PinName tx_ws_;
user Daniel Worrall0:e62e06e11575 185 PinName clk_;
user Daniel Worrall0:e62e06e11575 186 PinName rx_sda_;
user Daniel Worrall0:e62e06e11575 187 PinName rx_ws_;
user Daniel Worrall0:e62e06e11575 188};
user Daniel Worrall0:e62e06e11575 189
user Daniel Worrall0:e62e06e11575 190#endif /*__MBED_I2S_H__*/