DAC ChibiOS 3.0 continuous mode changing samples buffer
Posted: Wed May 20, 2015 9:31 am
Dear Giovanni,
Is it possible to change the samples buffer on the fly? I mean, after starting with dacStartConversion. I would like to play a wav file and that is why I need to change the samples buffer continuously as I read the wav block by block.
I tried to do it in the buffer fill interrupt routine, (which seems to be called in half buffer fill as well), but it does not work. My code is based on your sample (with the same config):
Best regards,
Rajmund
Is it possible to change the samples buffer on the fly? I mean, after starting with dacStartConversion. I would like to play a wav file and that is why I need to change the samples buffer continuously as I read the wav block by block.
I tried to do it in the buffer fill interrupt routine, (which seems to be called in half buffer fill as well), but it does not work. My code is based on your sample (with the same config):
Code: Select all
/*
* DAC test buffer (sine wave).
*/
static const dacsample_t *dac_buffer;
static dacsample_t dac_buffer1[360] = {
2047, 2082, 2118, 2154, 2189, 2225, 2260, 2296, 2331, 2367, 2402, 2437, 2472, 2507, 2542, 2576, 2611, 2645, 2679, 2713, 2747, 2780, 2813, 2846,
2879, 2912, 2944, 2976, 3008, 3039, 3070, 3101, 3131, 3161, 3191, 3221, 3250, 3278, 3307, 3335, 3362, 3389, 3416, 3443, 3468, 3494, 3519, 3544,
3568, 3591, 3615, 3637, 3660, 3681, 3703, 3723, 3744, 3763, 3782, 3801, 3819, 3837, 3854, 3870, 3886, 3902, 3917, 3931, 3944, 3958, 3970, 3982,
3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4062, 4068, 4074, 4078, 4082, 4086, 4089, 4091, 4092, 4093, 4094, 4093, 4092, 4091, 4089, 4086,
4082, 4078, 4074, 4068, 4062, 4056, 4049, 4041, 4033, 4024, 4014, 4004, 3993, 3982, 3970, 3958, 3944, 3931, 3917, 3902, 3886, 3870, 3854, 3837,
3819, 3801, 3782, 3763, 3744, 3723, 3703, 3681, 3660, 3637, 3615, 3591, 3568, 3544, 3519, 3494, 3468, 3443, 3416, 3389, 3362, 3335, 3307, 3278,
3250, 3221, 3191, 3161, 3131, 3101, 3070, 3039, 3008, 2976, 2944, 2912, 2879, 2846, 2813, 2780, 2747, 2713, 2679, 2645, 2611, 2576, 2542, 2507,
2472, 2437, 2402, 2367, 2331, 2296, 2260, 2225, 2189, 2154, 2118, 2082, 2047, 2012, 1976, 1940, 1905, 1869, 1834, 1798, 1763, 1727, 1692, 1657,
1622, 1587, 1552, 1518, 1483, 1449, 1415, 1381, 1347, 1314, 1281, 1248, 1215, 1182, 1150, 1118, 1086, 1055, 1024, 993, 963, 933, 903, 873,
844, 816, 787, 759, 732, 705, 678, 651, 626, 600, 575, 550, 526, 503, 479, 457, 434, 413, 391, 371, 350, 331, 312, 293,
275, 257, 240, 224, 208, 192, 177, 163, 150, 136, 124, 112, 101, 90, 80, 70, 61, 53, 45, 38, 32, 26, 20, 16,
12, 8, 5, 3, 2, 1, 0, 1, 2, 3, 5, 8, 12, 16, 20, 26, 32, 38, 45, 53, 61, 70, 80, 90,
101, 112, 124, 136, 150, 163, 177, 192, 208, 224, 240, 257, 275, 293, 312, 331, 350, 371, 391, 413, 434, 457, 479, 503,
526, 550, 575, 600, 626, 651, 678, 705, 732, 759, 787, 816, 844, 873, 903, 933, 963, 993, 1024, 1055, 1086, 1118, 1150, 1182,
1215, 1248, 1281, 1314, 1347, 1381, 1415, 1449, 1483, 1518, 1552, 1587, 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012
};
static dacsample_t dac_buffer2[180] = {
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
500,500,500,500,500,500,500,500,500
};
/*
* DAC streaming callback.
*/
static void end_cb1(DACDriver dacp, const dacsample_t buffer, size_t n) {
palTogglePad(GPIOD, GPIOD_CAN1_TX); //just for debug with oscilloscope
buffer = dac_buffer2;
(void)dacp;
}
...
//before starting the conversion
dac_buffer = dac_buffer1;
palTogglePad(GPIOD, GPIOD_CAN1_TX); //just for debug with oscilloscope
dacStartConversion(&DACD1, &dacgrpcfg1, dac_buffer, DAC_BUFFER_SIZE);
Best regards,
Rajmund