Use the TLV320 with in-built I2S object to stream audio data from an SD Card and send it to the TLV320 CODEC for audio playback
Dependencies: I2SSlave mbed TLV320
TLV320/TLV320.cpp@0:3d6892f6384f, 2011-08-05 (annotated)
- Committer:
- d_worrall
- Date:
- Fri Aug 05 10:07:47 2011 +0000
- Revision:
- 0:3d6892f6384f
version 2.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
d_worrall | 0:3d6892f6384f | 1 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 2 | * TLV320.cpp: Texas instruments TLV320AIC23B library NXP LPC1768 |
d_worrall | 0:3d6892f6384f | 3 | * |
d_worrall | 0:3d6892f6384f | 4 | * Written by: |
d_worrall | 0:3d6892f6384f | 5 | * mbed Team |
d_worrall | 0:3d6892f6384f | 6 | * Ioannis Kedros - 10th January 2011 |
d_worrall | 0:3d6892f6384f | 7 | * (basic functionality incurred) |
d_worrall | 0:3d6892f6384f | 8 | * Daniel Worrall - 15th July 2011 |
d_worrall | 0:3d6892f6384f | 9 | * (I2SSlave implementation and API restructuring) |
d_worrall | 0:3d6892f6384f | 10 | * |
d_worrall | 0:3d6892f6384f | 11 | * History |
d_worrall | 0:3d6892f6384f | 12 | * version 2.29 |
d_worrall | 0:3d6892f6384f | 13 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 14 | #include "mbed.h" |
d_worrall | 0:3d6892f6384f | 15 | #include "TLV320.h" |
d_worrall | 0:3d6892f6384f | 16 | |
d_worrall | 0:3d6892f6384f | 17 | TLV320::TLV320(PinName sda, PinName scl, int addr, PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) |
d_worrall | 0:3d6892f6384f | 18 | : mAddr(addr), mI2c_(sda, scl), mI2s_(tx_sda, tx_ws, clk, rx_sda, rx_ws){ |
d_worrall | 0:3d6892f6384f | 19 | mI2c_.frequency(150000); |
d_worrall | 0:3d6892f6384f | 20 | reset(); //TLV resets |
d_worrall | 0:3d6892f6384f | 21 | power(0x07); //Power Up the TLV320, but not the MIC, ADC and LINE |
d_worrall | 0:3d6892f6384f | 22 | format(16, STEREO); //16Bit I2S protocol format, STEREO |
d_worrall | 0:3d6892f6384f | 23 | frequency(44100); //Default sample frequency is 44.1kHz |
d_worrall | 0:3d6892f6384f | 24 | bypass(false); //Do not bypass device |
d_worrall | 0:3d6892f6384f | 25 | mute(false); //Not muted |
d_worrall | 0:3d6892f6384f | 26 | activateDigitalInterface_(); //The digital part of the chip is active |
d_worrall | 0:3d6892f6384f | 27 | outputVolume(0.6, 0.6); //Headphone volume to the default state |
d_worrall | 0:3d6892f6384f | 28 | rxBuffer = &mI2s_.rxBuffer[0]; |
d_worrall | 0:3d6892f6384f | 29 | } |
d_worrall | 0:3d6892f6384f | 30 | //Public Functions |
d_worrall | 0:3d6892f6384f | 31 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 32 | * Function name: inputVolume() |
d_worrall | 0:3d6892f6384f | 33 | * |
d_worrall | 0:3d6892f6384f | 34 | * Description: set line in volume for left and right channels |
d_worrall | 0:3d6892f6384f | 35 | * |
d_worrall | 0:3d6892f6384f | 36 | * Parameters: float leftVolumeIn, float rightVolumeIn |
d_worrall | 0:3d6892f6384f | 37 | * Returns: int 0 (success), -1 (value out of range) |
d_worrall | 0:3d6892f6384f | 38 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 39 | int TLV320::inputVolume(float leftVolumeIn, float rightVolumeIn){ |
d_worrall | 0:3d6892f6384f | 40 | //check values are in range |
d_worrall | 0:3d6892f6384f | 41 | if((leftVolumeIn < 0.0)||leftVolumeIn > 1.0) return -1; |
d_worrall | 0:3d6892f6384f | 42 | if((rightVolumeIn < 0.0)||rightVolumeIn > 1.0) return -1; |
d_worrall | 0:3d6892f6384f | 43 | //convert float to encoded char |
d_worrall | 0:3d6892f6384f | 44 | char left = (char)31*leftVolumeIn; |
d_worrall | 0:3d6892f6384f | 45 | char right = (char)31*rightVolumeIn; |
d_worrall | 0:3d6892f6384f | 46 | //Left Channel |
d_worrall | 0:3d6892f6384f | 47 | cmd[1] = left | (0 << 7); //set volume |
d_worrall | 0:3d6892f6384f | 48 | cmd[0] = LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 49 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 50 | //Right Channel |
d_worrall | 0:3d6892f6384f | 51 | cmd[1] = right | (0 << 7); //set volume |
d_worrall | 0:3d6892f6384f | 52 | cmd[0] = RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 53 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 54 | return 0; |
d_worrall | 0:3d6892f6384f | 55 | } |
d_worrall | 0:3d6892f6384f | 56 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 57 | * Function name: outputVolume() |
d_worrall | 0:3d6892f6384f | 58 | * |
d_worrall | 0:3d6892f6384f | 59 | * Description: Set headphone (line out) volume for left an right channels |
d_worrall | 0:3d6892f6384f | 60 | * |
d_worrall | 0:3d6892f6384f | 61 | * Parameters: float leftVolumeOut, float rightVolumeOut |
d_worrall | 0:3d6892f6384f | 62 | * Returns: int 0 (success), -1 (value out of range) |
d_worrall | 0:3d6892f6384f | 63 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 64 | int TLV320::outputVolume(float leftVolumeOut, float rightVolumeOut){ |
d_worrall | 0:3d6892f6384f | 65 | //check values are in range |
d_worrall | 0:3d6892f6384f | 66 | if((leftVolumeOut < 0.0)||leftVolumeOut > 1.0) return -1; |
d_worrall | 0:3d6892f6384f | 67 | if((rightVolumeOut < 0.0)||rightVolumeOut > 1.0) return -1; |
d_worrall | 0:3d6892f6384f | 68 | //convert float to encoded char |
d_worrall | 0:3d6892f6384f | 69 | char left = (char)(79*leftVolumeOut)+0x30; |
d_worrall | 0:3d6892f6384f | 70 | char right = (char)(79*rightVolumeOut)+0x30; |
d_worrall | 0:3d6892f6384f | 71 | //Left Channel |
d_worrall | 0:3d6892f6384f | 72 | cmd[1] = left | (1 << 7); //set volume |
d_worrall | 0:3d6892f6384f | 73 | cmd[0] = LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 74 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 75 | //Right Channel |
d_worrall | 0:3d6892f6384f | 76 | cmd[1] = right | (1 << 7); //set volume |
d_worrall | 0:3d6892f6384f | 77 | cmd[0] = RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 78 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 79 | return 0; |
d_worrall | 0:3d6892f6384f | 80 | } |
d_worrall | 0:3d6892f6384f | 81 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 82 | * Function name: bypass() |
d_worrall | 0:3d6892f6384f | 83 | * |
d_worrall | 0:3d6892f6384f | 84 | * Description: Send TLV320 into bypass mode, i.e. connect input to output |
d_worrall | 0:3d6892f6384f | 85 | * |
d_worrall | 0:3d6892f6384f | 86 | * Parameters: bool bypassVar |
d_worrall | 0:3d6892f6384f | 87 | * Returns: none |
d_worrall | 0:3d6892f6384f | 88 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 89 | void TLV320::bypass(bool bypassVar){ |
d_worrall | 0:3d6892f6384f | 90 | if(bypassVar == true) |
d_worrall | 0:3d6892f6384f | 91 | cmd[1] = (1 << 3) | (0 << 4) | (0 << 5);//bypass enabled, DAC disabled, sidetone insertion disabled |
d_worrall | 0:3d6892f6384f | 92 | else |
d_worrall | 0:3d6892f6384f | 93 | cmd[1] = (0 << 3) | (1 << 4); //bypass disabled, DAC enabled |
d_worrall | 0:3d6892f6384f | 94 | cmd[1] |= (0 << 2); |
d_worrall | 0:3d6892f6384f | 95 | cmd[0] = ANALOG_AUDIO_PATH_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 96 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 97 | } |
d_worrall | 0:3d6892f6384f | 98 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 99 | * Function name: mute() |
d_worrall | 0:3d6892f6384f | 100 | * |
d_worrall | 0:3d6892f6384f | 101 | * Description: Send TLV320 into mute mode |
d_worrall | 0:3d6892f6384f | 102 | * |
d_worrall | 0:3d6892f6384f | 103 | * Parameters: bool softMute |
d_worrall | 0:3d6892f6384f | 104 | * Returns: none |
d_worrall | 0:3d6892f6384f | 105 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 106 | void TLV320::mute(bool softMute){ |
d_worrall | 0:3d6892f6384f | 107 | if(softMute == true) cmd[1] = 0x08; //set instruction to mute |
d_worrall | 0:3d6892f6384f | 108 | else cmd[1] = 0x00; //set instruction to NOT mute |
d_worrall | 0:3d6892f6384f | 109 | |
d_worrall | 0:3d6892f6384f | 110 | cmd[0] = DIGITAL_AUDIO_PATH_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 111 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 112 | } |
d_worrall | 0:3d6892f6384f | 113 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 114 | * Function name: power() |
d_worrall | 0:3d6892f6384f | 115 | * |
d_worrall | 0:3d6892f6384f | 116 | * Description: Switch TLV320 on/off |
d_worrall | 0:3d6892f6384f | 117 | * |
d_worrall | 0:3d6892f6384f | 118 | * Parameters: bool powerUp |
d_worrall | 0:3d6892f6384f | 119 | * Returns: none |
d_worrall | 0:3d6892f6384f | 120 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 121 | void TLV320::power(bool powerUp){ |
d_worrall | 0:3d6892f6384f | 122 | if(powerUp == true) cmd[1] = 0x00; //everything on |
d_worrall | 0:3d6892f6384f | 123 | else cmd[1] = 0xFF; //everything off |
d_worrall | 0:3d6892f6384f | 124 | |
d_worrall | 0:3d6892f6384f | 125 | cmd[0] = POWER_DOWN_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 126 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 127 | } |
d_worrall | 0:3d6892f6384f | 128 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 129 | * Function name: power() |
d_worrall | 0:3d6892f6384f | 130 | * |
d_worrall | 0:3d6892f6384f | 131 | * Description: Switch on individual devices on TLV320 |
d_worrall | 0:3d6892f6384f | 132 | * |
d_worrall | 0:3d6892f6384f | 133 | * Parameters: int device |
d_worrall | 0:3d6892f6384f | 134 | * Returns: none |
d_worrall | 0:3d6892f6384f | 135 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 136 | void TLV320::power(int device){ |
d_worrall | 0:3d6892f6384f | 137 | cmd[1] = (char)device; //set user defined commands |
d_worrall | 0:3d6892f6384f | 138 | cmd[0] = POWER_DOWN_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 139 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 140 | } |
d_worrall | 0:3d6892f6384f | 141 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 142 | * Function name: format() |
d_worrall | 0:3d6892f6384f | 143 | * |
d_worrall | 0:3d6892f6384f | 144 | * Description: Set interface format |
d_worrall | 0:3d6892f6384f | 145 | * |
d_worrall | 0:3d6892f6384f | 146 | * Parameters: char length, bool mode |
d_worrall | 0:3d6892f6384f | 147 | * Returns: none |
d_worrall | 0:3d6892f6384f | 148 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 149 | void TLV320::format(char length, bool mode){ |
d_worrall | 0:3d6892f6384f | 150 | char modeSet = (1 << 6); |
d_worrall | 0:3d6892f6384f | 151 | modeSet |= (1 << 5); //swap left and right channels |
d_worrall | 0:3d6892f6384f | 152 | |
d_worrall | 0:3d6892f6384f | 153 | switch (length) //input data into instruction byte |
d_worrall | 0:3d6892f6384f | 154 | { |
d_worrall | 0:3d6892f6384f | 155 | case 16: |
d_worrall | 0:3d6892f6384f | 156 | cmd[1] = modeSet | 0x02; |
d_worrall | 0:3d6892f6384f | 157 | break; |
d_worrall | 0:3d6892f6384f | 158 | case 20: |
d_worrall | 0:3d6892f6384f | 159 | cmd[1] = modeSet | 0x06; |
d_worrall | 0:3d6892f6384f | 160 | break; |
d_worrall | 0:3d6892f6384f | 161 | case 24: |
d_worrall | 0:3d6892f6384f | 162 | cmd[1] = modeSet | 0x0A; |
d_worrall | 0:3d6892f6384f | 163 | break; |
d_worrall | 0:3d6892f6384f | 164 | case 32: |
d_worrall | 0:3d6892f6384f | 165 | cmd[1] = modeSet | 0x0E; |
d_worrall | 0:3d6892f6384f | 166 | break; |
d_worrall | 0:3d6892f6384f | 167 | default: |
d_worrall | 0:3d6892f6384f | 168 | break; |
d_worrall | 0:3d6892f6384f | 169 | } |
d_worrall | 0:3d6892f6384f | 170 | mI2s_.format(length, mode); |
d_worrall | 0:3d6892f6384f | 171 | cmd[0] = DIGITAL_AUDIO_INTERFACE_FORMAT; //set address |
d_worrall | 0:3d6892f6384f | 172 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 173 | } |
d_worrall | 0:3d6892f6384f | 174 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 175 | * Function name: frequency() |
d_worrall | 0:3d6892f6384f | 176 | * |
d_worrall | 0:3d6892f6384f | 177 | * Description: Set sample frequency |
d_worrall | 0:3d6892f6384f | 178 | * |
d_worrall | 0:3d6892f6384f | 179 | * Parameters: int hz |
d_worrall | 0:3d6892f6384f | 180 | * Returns: int 0 (success), -1 (value not recognised) |
d_worrall | 0:3d6892f6384f | 181 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 182 | int TLV320::frequency(int hz){ |
d_worrall | 0:3d6892f6384f | 183 | char rate; |
d_worrall | 0:3d6892f6384f | 184 | switch(hz){ |
d_worrall | 0:3d6892f6384f | 185 | case 8000: |
d_worrall | 0:3d6892f6384f | 186 | rate = 0x03; |
d_worrall | 0:3d6892f6384f | 187 | break; |
d_worrall | 0:3d6892f6384f | 188 | case 8021: |
d_worrall | 0:3d6892f6384f | 189 | rate = 0x0B; |
d_worrall | 0:3d6892f6384f | 190 | break; |
d_worrall | 0:3d6892f6384f | 191 | case 32000: |
d_worrall | 0:3d6892f6384f | 192 | rate = 0x06; |
d_worrall | 0:3d6892f6384f | 193 | break; |
d_worrall | 0:3d6892f6384f | 194 | case 44100: |
d_worrall | 0:3d6892f6384f | 195 | rate = 0x08; |
d_worrall | 0:3d6892f6384f | 196 | break; |
d_worrall | 0:3d6892f6384f | 197 | case 48000: |
d_worrall | 0:3d6892f6384f | 198 | rate = 0x00; |
d_worrall | 0:3d6892f6384f | 199 | break; |
d_worrall | 0:3d6892f6384f | 200 | case 88200: |
d_worrall | 0:3d6892f6384f | 201 | rate = 0x0F; |
d_worrall | 0:3d6892f6384f | 202 | break; |
d_worrall | 0:3d6892f6384f | 203 | case 96000: |
d_worrall | 0:3d6892f6384f | 204 | rate = 0x07; |
d_worrall | 0:3d6892f6384f | 205 | break; |
d_worrall | 0:3d6892f6384f | 206 | default: |
d_worrall | 0:3d6892f6384f | 207 | return -1; |
d_worrall | 0:3d6892f6384f | 208 | } |
d_worrall | 0:3d6892f6384f | 209 | char clockInChar = (0 << 6); |
d_worrall | 0:3d6892f6384f | 210 | char clockModeChar = (1 << 0); |
d_worrall | 0:3d6892f6384f | 211 | |
d_worrall | 0:3d6892f6384f | 212 | cmd[1] = (rate << 2) | clockInChar | clockModeChar; //input data into instruciton byte |
d_worrall | 0:3d6892f6384f | 213 | cmd[0] = SAMPLE_RATE_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 214 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 215 | return 0; |
d_worrall | 0:3d6892f6384f | 216 | } |
d_worrall | 0:3d6892f6384f | 217 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 218 | * Function name: reset() |
d_worrall | 0:3d6892f6384f | 219 | * |
d_worrall | 0:3d6892f6384f | 220 | * Description: Reset TLV320 |
d_worrall | 0:3d6892f6384f | 221 | * |
d_worrall | 0:3d6892f6384f | 222 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 223 | * Returns: none |
d_worrall | 0:3d6892f6384f | 224 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 225 | void TLV320::reset(void){ |
d_worrall | 0:3d6892f6384f | 226 | cmd[0] = RESET_REGISTER; //set address |
d_worrall | 0:3d6892f6384f | 227 | cmd[1] = 0x00; //this resets the entire device |
d_worrall | 0:3d6892f6384f | 228 | mI2c_.write(mAddr, cmd, 2); |
d_worrall | 0:3d6892f6384f | 229 | } |
d_worrall | 0:3d6892f6384f | 230 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 231 | * Function name: start() |
d_worrall | 0:3d6892f6384f | 232 | * |
d_worrall | 0:3d6892f6384f | 233 | * Description: Enable interrupts on the I2S port |
d_worrall | 0:3d6892f6384f | 234 | * |
d_worrall | 0:3d6892f6384f | 235 | * Parameters: int mode |
d_worrall | 0:3d6892f6384f | 236 | * Returns: none |
d_worrall | 0:3d6892f6384f | 237 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 238 | void TLV320::start(int mode){ |
d_worrall | 0:3d6892f6384f | 239 | mI2s_.start(mode); |
d_worrall | 0:3d6892f6384f | 240 | } |
d_worrall | 0:3d6892f6384f | 241 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 242 | * Function name: stop() |
d_worrall | 0:3d6892f6384f | 243 | * |
d_worrall | 0:3d6892f6384f | 244 | * Description: Disable interrupts on the I2S port |
d_worrall | 0:3d6892f6384f | 245 | * |
d_worrall | 0:3d6892f6384f | 246 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 247 | * Returns: none |
d_worrall | 0:3d6892f6384f | 248 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 249 | void TLV320::stop(void){ |
d_worrall | 0:3d6892f6384f | 250 | mI2s_.stop(); |
d_worrall | 0:3d6892f6384f | 251 | } |
d_worrall | 0:3d6892f6384f | 252 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 253 | * Function name: write() |
d_worrall | 0:3d6892f6384f | 254 | * |
d_worrall | 0:3d6892f6384f | 255 | * Description: Write (part of) a buffer to the I2S port |
d_worrall | 0:3d6892f6384f | 256 | * |
d_worrall | 0:3d6892f6384f | 257 | * Parameters: int *buffer, int from, int length |
d_worrall | 0:3d6892f6384f | 258 | * Returns: none |
d_worrall | 0:3d6892f6384f | 259 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 260 | void TLV320::write(int *buffer, int from, int length){ |
d_worrall | 0:3d6892f6384f | 261 | mI2s_.write(buffer, from, length); |
d_worrall | 0:3d6892f6384f | 262 | } |
d_worrall | 0:3d6892f6384f | 263 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 264 | * Function name: read() |
d_worrall | 0:3d6892f6384f | 265 | * |
d_worrall | 0:3d6892f6384f | 266 | * Description: Place I2SRXFIFO in rxBuffer |
d_worrall | 0:3d6892f6384f | 267 | * |
d_worrall | 0:3d6892f6384f | 268 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 269 | * Returns: none |
d_worrall | 0:3d6892f6384f | 270 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 271 | void TLV320::read(void){ |
d_worrall | 0:3d6892f6384f | 272 | mI2s_.read(); |
d_worrall | 0:3d6892f6384f | 273 | } |
d_worrall | 0:3d6892f6384f | 274 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 275 | * Function name: attach() |
d_worrall | 0:3d6892f6384f | 276 | * |
d_worrall | 0:3d6892f6384f | 277 | * Description: Attach a void/void function or void/void static member function to IRQHandler |
d_worrall | 0:3d6892f6384f | 278 | * |
d_worrall | 0:3d6892f6384f | 279 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 280 | * Returns: none |
d_worrall | 0:3d6892f6384f | 281 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 282 | void TLV320::attach(void(*fptr)(void)){ |
d_worrall | 0:3d6892f6384f | 283 | mI2s_.attach(fptr); |
d_worrall | 0:3d6892f6384f | 284 | } |
d_worrall | 0:3d6892f6384f | 285 | //Private Functions |
d_worrall | 0:3d6892f6384f | 286 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 287 | * Function name: setSampleRate_() |
d_worrall | 0:3d6892f6384f | 288 | * |
d_worrall | 0:3d6892f6384f | 289 | * Description: Clocking control |
d_worrall | 0:3d6892f6384f | 290 | * |
d_worrall | 0:3d6892f6384f | 291 | * Parameters: char rate, bool clockIn, bool clockMode, bool bOSR |
d_worrall | 0:3d6892f6384f | 292 | * Returns: none |
d_worrall | 0:3d6892f6384f | 293 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 294 | void TLV320::setSampleRate_(char rate, bool clockIn, bool clockMode, bool bOSR){ |
d_worrall | 0:3d6892f6384f | 295 | char clockInChar; |
d_worrall | 0:3d6892f6384f | 296 | char clockModeChar; |
d_worrall | 0:3d6892f6384f | 297 | char baseOverSamplingRate; |
d_worrall | 0:3d6892f6384f | 298 | if(bOSR){ |
d_worrall | 0:3d6892f6384f | 299 | baseOverSamplingRate = (1 << 0); |
d_worrall | 0:3d6892f6384f | 300 | } else { |
d_worrall | 0:3d6892f6384f | 301 | baseOverSamplingRate = (0 << 0); |
d_worrall | 0:3d6892f6384f | 302 | } |
d_worrall | 0:3d6892f6384f | 303 | if(clockIn){ |
d_worrall | 0:3d6892f6384f | 304 | clockInChar = (1 << 6); |
d_worrall | 0:3d6892f6384f | 305 | } else { |
d_worrall | 0:3d6892f6384f | 306 | clockInChar = (0 << 6); |
d_worrall | 0:3d6892f6384f | 307 | } |
d_worrall | 0:3d6892f6384f | 308 | if(clockMode){ |
d_worrall | 0:3d6892f6384f | 309 | clockModeChar = 0x01; |
d_worrall | 0:3d6892f6384f | 310 | } else { |
d_worrall | 0:3d6892f6384f | 311 | clockModeChar = 0x00; |
d_worrall | 0:3d6892f6384f | 312 | } |
d_worrall | 0:3d6892f6384f | 313 | cmd[1] = (rate << 2) | clockInChar | clockModeChar | baseOverSamplingRate; //input data into instruciton byte |
d_worrall | 0:3d6892f6384f | 314 | cmd[0] = SAMPLE_RATE_CONTROL; //set address |
d_worrall | 0:3d6892f6384f | 315 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 316 | } |
d_worrall | 0:3d6892f6384f | 317 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 318 | * Function name: activateDigitalInterface_() |
d_worrall | 0:3d6892f6384f | 319 | * |
d_worrall | 0:3d6892f6384f | 320 | * Description: Activate digital part of chip |
d_worrall | 0:3d6892f6384f | 321 | * |
d_worrall | 0:3d6892f6384f | 322 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 323 | * Returns: none |
d_worrall | 0:3d6892f6384f | 324 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 325 | void TLV320::activateDigitalInterface_(void){ |
d_worrall | 0:3d6892f6384f | 326 | cmd[1] = 0x01; //Activate |
d_worrall | 0:3d6892f6384f | 327 | cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address |
d_worrall | 0:3d6892f6384f | 328 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 329 | } |
d_worrall | 0:3d6892f6384f | 330 | /****************************************************** |
d_worrall | 0:3d6892f6384f | 331 | * Function name: deactivateDigitalInterface_ |
d_worrall | 0:3d6892f6384f | 332 | * |
d_worrall | 0:3d6892f6384f | 333 | * Description: Deactivate digital part of chip |
d_worrall | 0:3d6892f6384f | 334 | * |
d_worrall | 0:3d6892f6384f | 335 | * Parameters: none |
d_worrall | 0:3d6892f6384f | 336 | * Returns: none |
d_worrall | 0:3d6892f6384f | 337 | ******************************************************/ |
d_worrall | 0:3d6892f6384f | 338 | //Digital interface deactivation |
d_worrall | 0:3d6892f6384f | 339 | void TLV320::deactivateDigitalInterface_(void){ |
d_worrall | 0:3d6892f6384f | 340 | cmd[1] = 0x00; //Deactivate |
d_worrall | 0:3d6892f6384f | 341 | cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address |
d_worrall | 0:3d6892f6384f | 342 | mI2c_.write(mAddr, cmd, 2); //send |
d_worrall | 0:3d6892f6384f | 343 | } |
d_worrall | 0:3d6892f6384f | 344 |