[an error occurred while processing this directive]
|
Я из-за этого SPI потерял почти месяц времени. Задача была такая - обмен с "внешним миром", переменная длина от 2 до 160 слов. Так вот, "натрахавшись" вдоволь с ДМА, после 3 недель - переписал код на прерывания за 1 день и никакх геммороев с тех пор не осчущаю :)) И вам настоятельно рекомендую отложить использование SPI в ДМА до "прояснения" вопроса. Кстати, там есче много чего работает не так, как в спортах или уарте. Например - после старта, путем записи 1 в регистр конф-ции ДМА контроллера io(SPI0D_CFG), все "нормальные" каналы сбрасывают 15 бит в io(), этот - "возвращает" 1. Другими словами - просто не стартует. Тока со второй попытки это удается сделать ... И есче эта тема "поднималась" на конфе пару страниц назад. В обсуждении принимал участие Димыч, кстати не в курсе появится еще или нет ?
Короче - образец кода:
Этот код - результат кропотливых, многочасовых попыток запустить SPI
Удачи на "дорогах" :))
IOPG = SPI0_Controller_Page; // == 0x4
ar = 0x0000;
io(SPICTL0) = ar; // Сбосить порт
io(SPI0D_CFG) = ar; // Сбросить настройки DMA
ar = 0x00ff;
io(SPI0D_IRQ) = ar; // Сбросить флаг прерывания
io(SPIST0) = ar; // Сбросить статус
ar= 6; io(SPIBAUD0)= ar; // SPI0 Baud rate Register
ar = 0x8005; dm(SPI_HEAD) = ar; // Конфигурация DMA
ar = 0xFC02; io(SPIFLG0) = ar; // SPI0 Flag register
ar = 0x0080; io(SPI0D_CFG) = ar; // SPI DMA Configuration Register Wait until start
ar = SPI_HEAD; io(SPI0D_CP) = ar; // точка след дескриптора
ar = 0x0001; io(SPI0D_CPR) = ar; !!!! Эта команда НАХ... не нужна, поскоку не влияет ни на что ... :))))))
ar = 0x511E; io(SPICTL0) = ar; // SPI0 Control Register in DMA MODE wait until start
ar = 0x8005; io(SPI0D_CFG) = ar; // Старт !!!
E-mail: info@telesys.ru