AU08 (05.09.2016 18:02 - 18:09, просмотров: 6185)
Что такого можно сделать с DMA в Xmega, что он перестаёт выводить в ЦАП напрочь, будто "клинит" его? После выключения и повторного включения питания работает. DMA используется для вывода звука через ЦАП. При изменении частоты звука используется один из трёх массивов с отсчётами (на 8,16 и 32) в зависимости от частоты.
const u8 snd_array_size[3] = {32, 16, 8}; // размеры таблиц отсчетов
u16 table32[32] = {
2048, 2427, 2792, 3128, 3423, 3665, 3845, 3955,
3993, 3955, 3845, 3665, 3423, 3128, 2792, 2427,
2048, 1669, 1304, 968, 673, 431, 251, 141,
103, 141, 251, 431, 673, 968, 1304, 1669 };
u16 table16[16] = {
2048, 2792, 3423, 3845,
3993, 3845, 3423, 2792,
2048, 1304, 673, 251,
103, 251, 673, 1304 };
u16 table8[8] = { 2048, 3423, 3993, 3423, 2048, 673, 103, 673};
const u16* table[3]={table32,table16,table8};
const u8 snd_array_size[3] = {32, 16, 8}; // размеры таблиц отсчетов
Инициализация DMA выполняется несколько раз в секунду. Перед этим проверяется на состояние "занят"
// перенастройка DMA - только НЕ во время транзакции, иначе вызовет ошибку!
while(DMA.STATUS & DMA_CH0BUSY_bm);
DMA.CH0.CTRLA &= ~DMA_CH_ENABLE_bm;
DMA.CH0.SRCADDR0 = (u32) table[fdiap];
DMA.CH0.SRCADDR1 = ((u32) table[fdiap]) >> 8;
DMA.CH0.TRFCNT = snd_array_size[fdiap]*2;
DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm;
Что такое асимметричный ответ?
Это когда о тебе негативно отзываются в комментарии, а ты об авторе этого комментария пишешь хорошо и по-доброму: в некрологе!