https://forum.pjrc.com/threads/46443-Teensy-3-6-DAC-Output-Bugdds
SIM_SCGC2 |= SIM_SCGC2_DAC0; | SIM_SCGC2 |= SIM_SCGC2_DAC0; | ||||
DAC0_C0 = DAC_C0_DACEN; // 1.2V VDDA is DACREF_2 | DAC0_C0 = DAC_C0_DACEN; // 1.2V VDDA is DACREF_2 | ||||
// slowly ramp up to DC voltage, approx 1/4 second | // slowly ramp up to DC voltage, approx 1/4 second | ||||
for (int16_t i=0; i<2048; i+=8) { | |||||
for (int16_t i=0; i<=2048; i+=8) { | |||||
*(int16_t *)&(DAC0_DAT0L) = i; | *(int16_t *)&(DAC0_DAT0L) = i; | ||||
delay(1); | delay(1); | ||||
} | } | ||||
src = block->data; | src = block->data; | ||||
do { | do { | ||||
// TODO: this should probably dither | // TODO: this should probably dither | ||||
*dest++ = ((*src++) + 32767) >> 4; | |||||
*dest++ = ((*src++) + 32768) >> 4; | |||||
} while (dest < end); | } while (dest < end); | ||||
AudioStream::release(block); | AudioStream::release(block); | ||||
AudioOutputAnalog::block_left_1st = AudioOutputAnalog::block_left_2nd; | AudioOutputAnalog::block_left_1st = AudioOutputAnalog::block_left_2nd; | ||||
AudioOutputAnalog::block_left_2nd = NULL; | AudioOutputAnalog::block_left_2nd = NULL; | ||||
} else { | } else { | ||||
do { | do { | ||||
*dest++ = 2047; | |||||
*dest++ = 2048; | |||||
} while (dest < end); | } while (dest < end); | ||||
} | } | ||||
if (AudioOutputAnalog::update_responsibility) AudioStream::update_all(); | if (AudioOutputAnalog::update_responsibility) AudioStream::update_all(); |
memset(&block_silent, 0, sizeof(block_silent)); | memset(&block_silent, 0, sizeof(block_silent)); | ||||
// slowly ramp up to DC voltage, approx 1/4 second | // slowly ramp up to DC voltage, approx 1/4 second | ||||
for (int16_t i=0; i<2048; i+=8) { | |||||
for (int16_t i=0; i<=2048; i+=8) { | |||||
*(int16_t *)&(DAC0_DAT0L) = i; | *(int16_t *)&(DAC0_DAT0L) = i; | ||||
*(int16_t *)&(DAC1_DAT0L) = i; | *(int16_t *)&(DAC1_DAT0L) = i; | ||||
delay(1); | delay(1); | ||||
// TODO: can this be optimized? | // TODO: can this be optimized? | ||||
uint32_t left = *src_left++; | uint32_t left = *src_left++; | ||||
uint32_t right = *src_right++; | uint32_t right = *src_right++; | ||||
uint32_t out1 = ((left & 0xFFFF) + 32767) >> 4; | |||||
out1 |= (((right & 0xFFFF) + 32767) >> 4) << 16; | |||||
uint32_t out2 = ((left >> 16) + 32767) >> 4; | |||||
out2 |= (((right >> 16) + 32767) >> 4) << 16; | |||||
uint32_t out1 = ((left & 0xFFFF) + 32768) >> 4; | |||||
out1 |= (((right & 0xFFFF) + 32768) >> 4) << 16; | |||||
uint32_t out2 = ((left >> 16) + 32768) >> 4; | |||||
out2 |= (((right >> 16) + 32768) >> 4) << 16; | |||||
*dest++ = out1; | *dest++ = out1; | ||||
*dest++ = out2; | *dest++ = out2; | ||||
} while (dest < end); | } while (dest < end); |