00001
00075 #include <avr32/io.h>
00076 #include <stdio.h>
00077 #include <string.h>
00078 #include "compiler.h"
00079 #include "preprocessor.h"
00080 #include "print_funcs.h"
00081
00082 #include "flashc.h"
00083 #include "pm.h"
00084 #include "gpio.h"
00085 #include "intc.h"
00086
00087 #include "tpa6130.h"
00088 #include "abdac.h"
00089
00090 #include "conf_tpa6130.h"
00091 #include "board.h"
00092 #include "audio.h"
00093
00094 #include "sound.h"
00095
00096 #if __AVR32_UC3A3256__ || __AVR32_UC3A3128__ || __AVR32_UC3A364__ || \
00097 __AVR32_UC3A3256S__ || __AVR32_UC3A3128S__ || __AVR32_UC3A364S__ || \
00098 __AT32UC3A3256__ || __AT32UC3A3128__ || __AT32UC3A364__ || \
00099 __AT32UC3A3256S__ || __AT32UC3A3128S__ || __AT32UC3A364S__
00100 #include "twim.h"
00101 #else
00102 #include "twi.h"
00103 #endif
00104
00106 #define SOUND_SAMPLES 256
00107 #define FPBA_HZ 12000000
00108 #define TPA6130_TWI_MASTER_SPEED 100000
00109
00110 void dac_reload_callback(void);
00111 void dac_overrun_callback(void);
00112 void adc_underrun_callback(void);
00113 void adc_reload_callback(void);
00114
00115
00116
00117 S16 samples[SOUND_SAMPLES];
00118 U32 samples_count;
00119
00120
00121 #define SAMPLE_OFFSET 0x80
00122 #define SAMPLE_RATE 46875
00123 #define SAMPLE_COUNT (sizeof(sound_data))
00124
00125 static const S8 sound_data[] =
00126 {
00127 0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x17, 0x1B, 0x1F, 0x23,
00128 0x27, 0x2B, 0x2F, 0x32, 0x36, 0x3A, 0x3D, 0x41, 0x44, 0x47,
00129 0x4B, 0x4E, 0x51, 0x54, 0x57, 0x5A, 0x5D, 0x60, 0x62, 0x65,
00130 0x67, 0x69, 0x6C, 0x6E, 0x70, 0x72, 0x73, 0x75, 0x77, 0x78,
00131 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F,
00132 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A,
00133 0x79, 0x78, 0x77, 0x75, 0x73, 0x72, 0x70, 0x6E, 0x6C, 0x69,
00134 0x67, 0x65, 0x62, 0x60, 0x5D, 0x5A, 0x57, 0x54, 0x51, 0x4E,
00135 0x4B, 0x47, 0x44, 0x41, 0x3D, 0x3A, 0x36, 0x32, 0x2F, 0x2B,
00136 0x27, 0x23, 0x1F, 0x1B, 0x17, 0x14, 0x10, 0x0C, 0x08, 0x04,
00137 0x00, 0xFC, 0xF8, 0xF4, 0xF0, 0xEC, 0xE9, 0xE5, 0xE1, 0xDD,
00138 0xD9, 0xD5, 0xD1, 0xCE, 0xCA, 0xC6, 0xC3, 0xBF, 0xBC, 0xB9,
00139 0xB5, 0xB2, 0xAF, 0xAC, 0xA9, 0xA6, 0xA3, 0xA0, 0x9E, 0x9B,
00140 0x99, 0x97, 0x94, 0x92, 0x90, 0x8E, 0x8D, 0x8B, 0x89, 0x88,
00141 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81,
00142 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x84, 0x85, 0x86,
00143 0x87, 0x88, 0x89, 0x8B, 0x8D, 0x8E, 0x90, 0x92, 0x94, 0x97,
00144 0x99, 0x9B, 0x9E, 0xA0, 0xA3, 0xA6, 0xA9, 0xAC, 0xAF, 0xB2,
00145 0xB5, 0xB9, 0xBC, 0xBF, 0xC3, 0xC6, 0xCA, 0xCE, 0xD1, 0xD5,
00146 0xD9, 0xDD, 0xE1, 0xE5, 0xE9, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC
00147 };
00148
00150 #define MSG_WELCOME "\x1B[2J\x1B[H---------- Welcome to TPA6130 example ---------- \n"
00151
00152 void master_callback(U32 arg)
00153 {
00154 if( arg == AUDIO_DAC_OUT_OF_SAMPLE_CB )
00155 {
00156 dac_overrun_callback();
00157 }
00158
00159 else if( arg == AUDIO_DAC_RELOAD_CB )
00160 {
00161 dac_reload_callback();
00162 }
00163
00164 else if( arg == AUDIO_ADC_OUT_OF_SAMPLE_CB )
00165 {
00166 adc_underrun_callback();;
00167 }
00168
00169 else if( arg == AUDIO_ADC_RELOAD_CB )
00170 {
00171 adc_reload_callback();;
00172 }
00173 }
00174
00175 void dac_reload_callback(void)
00176 {
00177
00178 }
00179
00180 void dac_overrun_callback(void)
00181 {
00182
00183 }
00184
00185
00186 void adc_underrun_callback(void)
00187 {
00188
00189 }
00190
00191
00192 void adc_reload_callback(void)
00193 {
00194
00195 }
00196
00197 static void twi_init(void)
00198 {
00199 const gpio_map_t TPA6130_TWI_GPIO_MAP =
00200 {
00201 {TPA6130_TWI_SCL_PIN, TPA6130_TWI_SCL_FUNCTION},
00202 {TPA6130_TWI_SDA_PIN, TPA6130_TWI_SDA_FUNCTION}
00203 };
00204
00205 const twi_options_t TPA6130_TWI_OPTIONS =
00206 {
00207 .pba_hz = FPBA_HZ,
00208 .speed = TPA6130_TWI_MASTER_SPEED,
00209 .chip = TPA6130_TWI_ADDRESS
00210 };
00211
00212
00213 gpio_enable_module(TPA6130_TWI_GPIO_MAP,
00214 sizeof(TPA6130_TWI_GPIO_MAP) / sizeof(TPA6130_TWI_GPIO_MAP[0]));
00215
00216
00217 twi_master_init(TPA6130_TWI, &TPA6130_TWI_OPTIONS);
00218
00219 }
00220
00223 void init_sys_clocks(void)
00224 {
00225
00226 pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
00227
00228
00229 pm_enable_osc1_crystal(&AVR32_PM, FOSC1);
00230 pm_enable_clk1(&AVR32_PM, OSC1_STARTUP);
00231
00232
00233
00234
00235 pm_pll_setup(&AVR32_PM, 0,
00236 10,
00237 1,
00238 1,
00239 16);
00240
00241
00242
00243 pm_pll_set_option(&AVR32_PM, 0,
00244 1,
00245 1,
00246 0);
00247
00248
00249 pm_pll_enable(&AVR32_PM, 0);
00250 pm_wait_for_pll0_locked(&AVR32_PM);
00251
00252 pm_cksel(&AVR32_PM,
00253 0,
00254 0,
00255 0,
00256 0,
00257 0,
00258 0);
00259
00260
00261 flashc_set_wait_state(1);
00262
00263
00264 pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0);
00265
00266
00267 pm_pll_setup(&AVR32_PM, 1,
00268 7,
00269 1,
00270 0,
00271 16);
00272
00273 pm_pll_set_option(&AVR32_PM, 1,
00274 1,
00275 1,
00276 0);
00277
00278
00279 pm_pll_enable(&AVR32_PM, 1);
00280
00281
00282 pm_wait_for_pll1_locked(&AVR32_PM);
00283
00284 }
00285
00286 int main(void)
00287 {
00288
00289 init_sys_clocks();
00290
00291
00292 init_dbg_rs232(FOSC0);
00293
00294 print_dbg(MSG_WELCOME);
00295
00296
00297 gpio_enable_gpio_pin(LED0_GPIO);
00298 gpio_enable_gpio_pin(LED1_GPIO);
00299
00300
00301 twi_init();
00302
00303
00304 tpa6130_init();
00305
00306
00307 tpa6130_dac_start(DEFAULT_DAC_SAMPLE_RATE_HZ,
00308 DEFAULT_DAC_NUM_CHANNELS,
00309 DEFAULT_DAC_BITS_PER_SAMPLE,
00310 DEFAULT_DAC_SWAP_CHANNELS,
00311 master_callback,
00312 AUDIO_DAC_OUT_OF_SAMPLE_CB
00313 | AUDIO_DAC_RELOAD_CB,
00314 FOSC0);
00315
00316 tpa6130_set_volume(0x2F);
00317 tpa6130_get_volume();
00318
00319 int count = 0;
00320 int i=0;
00321
00322 while(TRUE)
00323 {
00324 count = 0;
00325
00326
00327 while(count < (SOUND_SAMPLES)){
00328 samples[count++] = ((U8)sound_table[i]+0x80) << 8;
00329 samples[count++] = ((U8)sound_table[i]+0x80) << 8;
00330 i++;
00331 if (i >= sizeof(sound_table)) i = 0;
00332 }
00333
00334 gpio_set_gpio_pin(LED0_GPIO);
00335 gpio_clr_gpio_pin(LED1_GPIO);
00336
00337 tpa6130_dac_output((void *) samples,SOUND_SAMPLES/2);
00338
00339 gpio_clr_gpio_pin(LED0_GPIO);
00340 gpio_set_gpio_pin(LED1_GPIO);
00341
00342
00343
00344
00345
00346
00347 while(!tpa6130_dac_output(NULL, 0));
00348
00349 }
00350 }