00001
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "dac.h"
00049
00056 void abdac_enable(volatile avr32_abdac_t *abdac)
00057 {
00058 volatile avr32_pm_t *pm = &AVR32_PM;
00059 pm->gcctrl[ABDAC_GCLK] |= GCLK_BIT(CEN);
00060 abdac->cr |= ABDAC_BIT(CR_EN);
00061 }
00062
00069 void abdac_disable(volatile avr32_abdac_t *abdac)
00070 {
00071 volatile avr32_pm_t *pm = &AVR32_PM;
00072 abdac->cr &= ~ABDAC_BIT(CR_EN);
00073 pm->gcctrl[ABDAC_GCLK] &= ~GCLK_BIT(CEN);
00074 }
00075
00087 unsigned long abdac_set_dac_hz(volatile avr32_abdac_t *abdac,
00088 const unsigned long bus_hz, const unsigned long dac_hz)
00089 {
00090 volatile avr32_pm_t *pm = &AVR32_PM;
00091 unsigned short div;
00092
00093 if (bus_hz < (256 * dac_hz)) {
00094 return -EINVAL;
00095 }
00096
00097 div = bus_hz / (256 * dac_hz);
00098
00099
00100 div = (div + 1) & ~1UL;
00101
00102 if (div > 2) {
00103 pm->gcctrl[ABDAC_GCLK] = GCLK_BIT(DIVEN) | GCLK_BF(DIV, ((div / 2) - 1));
00104 } else {
00105 pm->gcctrl[ABDAC_GCLK] = GCLK_BIT(DIVEN);
00106 }
00107
00108 return (bus_hz / (256 * div));
00109 }
00110
00121 unsigned long abdac_get_dac_hz(volatile avr32_abdac_t *abdac,
00122 const unsigned long bus_hz)
00123 {
00124 volatile avr32_pm_t *pm = &AVR32_PM;
00125 unsigned short div = 0;
00126
00127 if (pm->gcctrl[ABDAC_GCLK] & GCLK_BIT(DIVEN)) {
00128 div = 2 * (GCLK_BFEXT(DIV, pm->gcctrl[ABDAC_GCLK]) + 1);
00129 }
00130
00131 return (bus_hz / div);
00132 }
00133
00145 int abdac_sink(volatile avr32_abdac_t *abdac,
00146 const unsigned short ch0, const unsigned short ch1)
00147 {
00148 volatile unsigned long timeout = ABDAC_TIMEOUT;
00149
00150 do {
00151 } while (!(abdac->isr & ABDAC_BIT(ISR_TX_READY)) && timeout--);
00152
00153 if (0 == timeout) {
00154 return -ETIMEOUT;
00155 }
00156
00157 abdac->sdr = ABDAC_BF(SDR_CHANNEL0, ch0) | ABDAC_BF(SDR_CHANNEL1, ch1);
00158
00159 return 0;
00160 }