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