Page 1 of 1

DAC ChibiOS 3.0 continuous mode changing samples buffer

Posted: Wed May 20, 2015 9:31 am
by drajmund
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):

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

Re: DAC ChibiOS 3.0 continuous mode changing samples buffer

Posted: Wed May 20, 2015 10:06 am
by Giovanni
Of course you can, you just need to remove the "const" keyword else the buffer is placed in flash.

Giovanni

Re: DAC ChibiOS 3.0 continuous mode changing samples buffer

Posted: Wed May 20, 2015 10:24 am
by drajmund
Dear Giovanni,

Thank you for your quick reply. I tried to remove const in the program code and in all occurances (HAL and low level driver: dacStartConversion and callback fn.), but it still does not work.

Do wou have any idea?

Regards,
Rajmund

Re: DAC ChibiOS 3.0 continuous mode changing samples buffer

Posted: Wed May 20, 2015 10:53 am
by Giovanni
The problem is that the driver continues to use the buffer you passed to dacStartConversion(), even if you change your pointer the driver ignores it.

You need to WRITE into the conversion buffer from the callback.

Giovanni

Re: DAC ChibiOS 3.0 continuous mode changing samples buffer

Posted: Wed May 20, 2015 11:21 am
by drajmund
Oh yes, you are right :-)
It is working as you wrote, thank you.

Rajmund