00001
00086 #include "board.h"
00087 #include "print_funcs.h"
00088 #include "gpio.h"
00089 #include "power_clocks_lib.h"
00090 #include "dacifb.h"
00091 #include "intc.h"
00092 #include "pevc.h"
00093 #include "pdca.h"
00094 #include "sinus.h"
00095
00098
00099 #if BOARD == UC3C_EK
00100
00101 # define EXAMPLE_DAC_AUDIO_INSTANCE 1
00102 # define EXAMPLE_DAC_AUDIO_CHANNEL DACIFB_CHANNEL_SELECTION_B
00103 # define EXAMPLE_DAC_AUDIO_PIN AVR32_DAC1B_PIN
00104 # define EXAMPLE_DAC_AUDIO_FUNCTION AVR32_DAC1B_PIN
00105 # define EXAMPLE_PDCA_CHANNEL_DAC 0
00106 # define AVR32_PDCA_PID_DAC_TX AVR32_PDCA_PID_DACIFB1_CHB_TX
00107 # define EXAMPLE_DAC_PRESCALER_CLOCK FOSC0/2
00108 #endif
00110
00111 volatile avr32_dacifb_t *dacifb = &AVR32_DACIFB1;
00112 #if BOARD == UC3C_EK
00113 S16 dac_value_audio = -1;
00114 #endif
00115
00116
00117 #if BOARD == UC3C_EK
00118 U8 dac_channel_audio = EXAMPLE_DAC_AUDIO_CHANNEL;
00119 #endif
00120
00121 extern U16 sin_table[SINUS_SAMPLES];
00122
00123 volatile avr32_pevc_t *ppevc = &AVR32_PEVC;
00124
00125
00126 dacifb_opt_t dacifb_opt = {
00127 .reference = DACIFB_REFERENCE_VDDANA,
00128 .channel_selection = DACIFB_CHANNEL_SELECTION_B,
00129 .low_power = FALSE,
00130 .dual = FALSE,
00131 .prescaler_clock_hz = EXAMPLE_DAC_PRESCALER_CLOCK
00132 };
00133
00134
00135 dacifb_channel_opt_t dacifb_channel_opt = {
00136 .auto_refresh_mode = FALSE,
00137 .trigger_mode = DACIFB_TRIGGER_MODE_EVENT,
00138 .left_adjustment = FALSE,
00139 .data_shift = 0,
00140 .data_round_enable = FALSE
00141 };
00142
00149 #if defined (__GNUC__)
00150 __attribute__((__interrupt__))
00151 #elif defined (__ICCAVR32__)
00152 #if ((__AT32UC3C0512C__ || __AT32UC3C1512C__ ))
00153 #pragma handler = AVR32_PDCA_IRQ_GROUP0, 0
00154 #else
00155 #pragma handler = AVR32_PDCA_IRQ_GROUP, 0
00156 #endif
00157 __interrupt
00158 #endif
00159 static void pdca_int_handler(void)
00160 {
00161
00162 pdca_reload_channel(EXAMPLE_PDCA_CHANNEL_DAC, (void *)sin_table, SINUS_SAMPLES);
00163 }
00164
00167 void pdca_set_irq(void)
00168 {
00169 #if defined (__GNUC__)
00170
00171 Disable_global_interrupt();
00172
00173 INTC_init_interrupts();
00174
00175
00176
00177
00178
00179
00180
00181 INTC_register_interrupt( (__int_handler) &pdca_int_handler, AVR32_PDCA_IRQ_0, AVR32_INTC_INT0);
00182 #endif
00183
00184
00185 Enable_global_interrupt();
00186 }
00187
00188 void init_pevc(void)
00189 {
00190
00191
00192 static const pevc_evs_opt_t PEVC_EVS_OPTIONS =
00193 {
00194 .igfdr = 0x0A,
00195 .igf = PEVC_EVS_IGF_OFF,
00196 .evf = PEVC_EVS_EVF_OFF,
00197 .evr = PEVC_EVS_EVR_ON
00198 };
00199
00200
00201
00202
00203 if(FAIL == pevc_channel_configure(ppevc,
00204 AVR32_PEVC_ID_USER_DACIFB1_CHB,
00205 AVR32_PEVC_ID_GEN_GCLK_0,
00206 &PEVC_EVS_OPTIONS))
00207 {
00208 while(1);
00209 }
00210
00211
00212 pevc_channels_enable(ppevc, 1<<AVR32_PEVC_ID_USER_DACIFB1_CHB);
00213
00214 }
00215
00216 void init_gclk(void)
00217 {
00218
00219
00220
00221 scif_gc_setup(AVR32_SCIF_GCLK_GCLK2_EVENT,
00222 SCIF_GCCTRL_SLOWCLOCK,
00223 AVR32_SCIF_GC_DIV_CLOCK,
00224 100);
00225
00226 scif_gc_enable(AVR32_SCIF_GCLK_GCLK2_EVENT);
00227 }
00228
00232 int main( void )
00233 {
00234
00235 static const gpio_map_t DACIFB_GPIO_MAP =
00236 {
00237 {AVR32_DACREF_PIN,AVR32_DACREF_FUNCTION},
00238 {AVR32_ADCREFP_PIN,AVR32_ADCREFP_FUNCTION},
00239 {AVR32_ADCREFN_PIN,AVR32_ADCREFN_FUNCTION},
00240 #if BOARD == UC3C_EK
00241 {EXAMPLE_DAC_AUDIO_PIN, EXAMPLE_DAC_AUDIO_FUNCTION}
00242 #endif
00243 };
00244
00245
00246 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00247
00248
00249 init_dbg_rs232(FOSC0);
00250
00251
00252 gpio_enable_module(DACIFB_GPIO_MAP, sizeof(DACIFB_GPIO_MAP) / sizeof(DACIFB_GPIO_MAP[0]));
00253
00254
00255 dacifb_get_calibration_data(dacifb,
00256 &dacifb_opt,
00257 EXAMPLE_DAC_AUDIO_INSTANCE);
00258
00259
00260 dacifb_configure(dacifb,
00261 &dacifb_opt,
00262 FOSC0);
00263
00264
00265 #if BOARD == UC3C_EK
00266
00267 dacifb_configure_channel(dacifb,
00268 dac_channel_audio,
00269 &dacifb_channel_opt,
00270 EXAMPLE_DAC_PRESCALER_CLOCK);
00271
00272 dacifb_start_channel(dacifb,
00273 dac_channel_audio,
00274 FOSC0);
00275
00276 #endif
00277
00278
00279 init_pevc();
00280
00281
00282 static const pdca_channel_options_t PDCA_OPTIONS =
00283 {
00284 .addr = (void *)sin_table,
00285 .pid = AVR32_PDCA_PID_DAC_TX,
00286 .size = SINUS_SAMPLES,
00287 .r_addr = NULL,
00288 .r_size = 0,
00289 .transfer_size = PDCA_TRANSFER_SIZE_HALF_WORD
00290 };
00291
00292
00293 pdca_init_channel(EXAMPLE_PDCA_CHANNEL_DAC, &PDCA_OPTIONS);
00294
00295
00296 pdca_set_irq();
00297
00298
00299 pdca_enable_interrupt_reload_counter_zero(EXAMPLE_PDCA_CHANNEL_DAC);
00300
00301
00302 pdca_enable(EXAMPLE_PDCA_CHANNEL_DAC);
00303
00304
00305 init_gclk();
00306
00307
00308 for (;;)
00309 {
00310 }
00311
00312 }