Полная версия этой страницы:
Синхронный порт SSC
DpInRock
Apr 10 2009, 14:26
Имею кодек и порт SSC1 at....9261.
Кодек работает мастером.
SSC настраиваю, PDC настраиваю. Активизирую кодек.
Начинает бегать счетчик PDC, вхожу в прерывания по ENDTX и ENDRX, обновляю next указатели и счетчики.
Все просто замечательно. Мистика в одном.
Никаких данных реально никуда не передается. Хуже того. Прямой доступ приемника НЕ ИЗМЕНЯЕТ память.
Указатели проверял вживую. Прямо из регистров PDC. Совпадают с нужными. Счетчики тикают с нужной скоростью.
Т.е. полная имитация работы.
В любом случае, даже если порт работает неправильно и все сгорело, то прямой доступ ДОЛЖЕН портить память хоть как-то.
Размещал буферы во всех типах памяти. Результат одинаковый.
Кроме прерываний ENDTX и ENDRX вздымаются еще два бита в регистре статуса SSC - это SYNTX и SYNRX. Они торчат всегда. Изчезают только тогда, когда я останавливаю мастер-кодек.
Почему прямой доступ тикает, но память по указателям прямого доступа не изменяется? Регистры matrix не трогал. Арбитраж стоит по умолчанию.
aaarrr
Apr 10 2009, 14:31
Наверное, в кэшируемую область гоните через PDC
DpInRock
Apr 10 2009, 14:57
Я в фоновой программе через комп меняю эту память руками. Все изменения отображаются.
Но параллельно - выход передатчика также не работает. Симметрично.
Попробую ММУ не включать, конечно..
aaarrr
Apr 10 2009, 15:00
Цитата(DpInRock @ Apr 10 2009, 18:57)

Я в фоновой программе через комп меняю эту память руками. Все изменения отображаются.
И что? Точно так же кэш меняете, если он включен.
Для приема/передачи данных извне нужно или отключить кэш для используемой области, или делать invalidate/flush.
DpInRock
Apr 10 2009, 15:19
Да.
Вот, блин, зараза. Думал по-легкому кодек срубить.
А сделаю-ка последний мегабайт некэшируемым и буду туда всякую дрянь пихать. Все равно там таблица ММУ чистоту крови портит.
DpInRock
Apr 10 2009, 18:43
Кэш оказался не причем. После выключения ММУ долго искал опчему программа не работает. Оказалось сильное замедление (из-за выключения кэша) убило несколько таймаутов.
Картина та же. Всё тикает, а реальных данных нет. Попробую без прямого доступа.
DpInRock
Apr 10 2009, 19:49
Кэш. Гад.
Но вроде уладилось. Узнал, что я намного чище играю на гитаре, чем Ричи Блэкмор через мой кодек.
aaarrr
Apr 10 2009, 19:51
Что-то мне это сильно напоминает, только вот никак не могу вспомнить, что именно

Как будто наблюдал уже такую картину.
А что за кодек, и какие настройки у SSC?
UPD: А, все-таки кэш.
DpInRock
Apr 10 2009, 21:19
Кодек SSM2602. Настройки простые. Так как он slave, то указаны внешние источники TF, RF и clock T. Clock К указан равным клоку T.
Кодек стерео, но работает в режиме DSP. Т.е. короткий Sync и дальше 2X16 бита для обоих каналов.
Код
AT91C_BASE_SSC1->SSC_CR=0x8000;//software reset
AT91C_BASE_SSC1->SSC_CMR=BOARD_MCK/(32*16000/2); for any case
//Slave Mode
//Rx
AT91C_BASE_SSC1->SSC_RCMR=0x521;
AT91C_BASE_SSC1->SSC_RFMR=0x1F;
//Tx
AT91C_BASE_SSC1->SSC_TCMR=0x502;
AT91C_BASE_SSC1->SSC_TFMR=0x3F;
//interrupt
AT91C_BASE_SSC1->SSC_IER=0x44;
//PDC
AT91C_BASE_SSC1->SSC_RCR=I2S_LEN/2;//receive counter
AT91C_BASE_SSC1->SSC_RNCR=I2S_LEN/2;//receive next counter
AT91C_BASE_SSC1->SSC_TCR=I2S_LEN/2;//tx counter
AT91C_BASE_SSC1->SSC_TNCR=I2S_LEN/2;//next tx counter;
AT91C_BASE_SSC1->SSC_RPR=(unsigned int )0x21e00000;//&rx_i2s[0];//receive buffer
AT91C_BASE_SSC1->SSC_RNPR=(unsigned int )0x21e10000;//&rx_i2s[I2S_LEN/2];//next receive buffer
AT91C_BASE_SSC1->SSC_TPR=(unsigned int )0x21e20000;//&tx_i2s[0];//tx buffer
AT91C_BASE_SSC1->SSC_TNPR=(unsigned int )0x21e30000;//&tx_i2s[I2S_LEN/2];//next tx buffer
AT91C_BASE_SSC1->SSC_PTCR=0x101;//Enable Rx Tx
AT91C_BASE_SSC1->SSC_CR=0x101;
Кэш. Но очень все странно. У меня на TMS тоже было полно кэша. И прямой доступ тоже был. Но он как-то не приносил такого опыта. ОН не переносил только самомодифициующийся код. Что было понятно сразу и не вызывало вопросов.
aaarrr
Apr 10 2009, 21:29
Цитата(DpInRock @ Apr 11 2009, 01:19)

У меня на TMS тоже было полно кэша. И прямой доступ тоже был. Но он как-то не приносил такого опыта.
Что на TMS (как я понимаю, какой-то из 6000), что на ARM когерентность кэша - забота программиста.
DpInRock
Apr 10 2009, 22:19
Да 6414. Там как раз было два таких порта и кучка потоков Е1. Со своими собственными проблемами.
Ну да ладно. Это последняя мелкосхема на этой плате. Теперь остается чистое и скучное программирование.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.