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 "pdca.h"
00093 #include "sinus.h"
00094
00097
00098 #if BOARD == UC3C_EK
00099
00100 # define EXAMPLE_DAC_AUDIO_INSTANCE 1
00101 # define EXAMPLE_DAC_AUDIO_CHANNEL DACIFB_CHANNEL_SELECTION_B
00102 # define EXAMPLE_DAC_AUDIO_PIN AVR32_DAC1B_PIN
00103 # define EXAMPLE_DAC_AUDIO_FUNCTION AVR32_DAC1B_PIN
00104 # define EXAMPLE_PDCA_CHANNEL_DAC 0
00105 # define AVR32_PDCA_PID_DAC_TX AVR32_PDCA_PID_DACIFB1_CHB_TX
00106 # define EXAMPLE_DAC_PRESCALER_CLOCK FOSC0/2
00107 #endif
00109
00110 volatile avr32_dacifb_t *dacifb = &AVR32_DACIFB1;
00111 #if BOARD == UC3C_EK
00112 S16 dac_value_audio = -1;
00113 #endif
00114
00115
00116 #if BOARD == UC3C_EK
00117 U8 dac_channel_audio = EXAMPLE_DAC_AUDIO_CHANNEL;
00118 #endif
00119
00120 extern U16 sin_table[SINUS_SAMPLES];
00121
00122 dacifb_opt_t dacifb_opt = {
00123 .reference = DACIFB_REFERENCE_VDDANA,
00124 .channel_selection = DACIFB_CHANNEL_SELECTION_B,
00125 .low_power = FALSE,
00126 .dual = FALSE,
00127 .prescaler_clock_hz = EXAMPLE_DAC_PRESCALER_CLOCK
00128 };
00129
00130
00131 dacifb_channel_opt_t dacifb_channel_opt = {
00132 .auto_refresh_mode = FALSE,
00133 .trigger_mode = DACIFB_TRIGGER_MODE_TIMER,
00134 .left_adjustment = FALSE,
00135 .data_shift = 0,
00136 .data_round_enable = FALSE
00137 };
00138
00145 #if defined (__GNUC__)
00146 __attribute__((__interrupt__))
00147 #elif defined (__ICCAVR32__)
00148 #if ((__AT32UC3C0512C__ || __AT32UC3C1512C__ ))
00149 #pragma handler = AVR32_PDCA_IRQ_GROUP0, 0
00150 #else
00151 #pragma handler = AVR32_PDCA_IRQ_GROUP, 0
00152 #endif
00153 __interrupt
00154 #endif
00155 static void pdca_int_handler(void)
00156 {
00157
00158 pdca_reload_channel(EXAMPLE_PDCA_CHANNEL_DAC, (void *)sin_table, SINUS_SAMPLES);
00159 }
00160
00163 void pdca_set_irq(void)
00164 {
00165 #if defined (__GNUC__)
00166
00167 Disable_global_interrupt();
00168
00169 INTC_init_interrupts();
00170
00171
00172
00173
00174
00175
00176
00177 INTC_register_interrupt( (__int_handler) &pdca_int_handler, AVR32_PDCA_IRQ_0, AVR32_INTC_INT0);
00178 #endif
00179
00180
00181 Enable_global_interrupt();
00182 }
00183
00187 int main( void )
00188 {
00189
00190 static const gpio_map_t DACIFB_GPIO_MAP =
00191 {
00192 {AVR32_DACREF_PIN,AVR32_DACREF_FUNCTION},
00193 {AVR32_ADCREFP_PIN,AVR32_ADCREFP_FUNCTION},
00194 {AVR32_ADCREFN_PIN,AVR32_ADCREFN_FUNCTION},
00195 #if BOARD == UC3C_EK
00196 {EXAMPLE_DAC_AUDIO_PIN, EXAMPLE_DAC_AUDIO_FUNCTION}
00197 #endif
00198 };
00199
00200
00201 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00202
00203
00204 init_dbg_rs232(FOSC0);
00205
00206
00207 gpio_enable_module(DACIFB_GPIO_MAP, sizeof(DACIFB_GPIO_MAP) / sizeof(DACIFB_GPIO_MAP[0]));
00208
00209
00210 dacifb_get_calibration_data(dacifb,
00211 &dacifb_opt,
00212 EXAMPLE_DAC_AUDIO_INSTANCE);
00213
00214
00215 dacifb_configure(dacifb,
00216 &dacifb_opt,
00217 FOSC0);
00218
00219
00220 #if BOARD == UC3C_EK
00221
00222 dacifb_configure_channel(dacifb,
00223 dac_channel_audio,
00224 &dacifb_channel_opt,
00225 EXAMPLE_DAC_PRESCALER_CLOCK);
00226
00227 dacifb_start_channel(dacifb,
00228 dac_channel_audio,
00229 FOSC0);
00230
00231 #endif
00232
00233 dacifb_reload_timer(dacifb,
00234 dac_channel_audio,
00235 8,
00236 EXAMPLE_DAC_PRESCALER_CLOCK);
00237
00238
00239 static const pdca_channel_options_t PDCA_OPTIONS =
00240 {
00241 .addr = (void *)sin_table,
00242 .pid = AVR32_PDCA_PID_DAC_TX,
00243 .size = SINUS_SAMPLES,
00244 .r_addr = NULL,
00245 .r_size = 0,
00246 .transfer_size = PDCA_TRANSFER_SIZE_HALF_WORD
00247 };
00248
00249
00250 pdca_init_channel(EXAMPLE_PDCA_CHANNEL_DAC, &PDCA_OPTIONS);
00251
00252
00253 pdca_set_irq();
00254
00255
00256 pdca_enable_interrupt_reload_counter_zero(EXAMPLE_PDCA_CHANNEL_DAC);
00257
00258
00259 pdca_enable(EXAMPLE_PDCA_CHANNEL_DAC);
00260
00261
00262 for (;;)
00263 {
00264 }
00265 }