Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AD73311 и SAM7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
beer_warrior
Прицепил кодек на SSC, написал софт, запускаю - не пашет.
Проверяю осциллом - нет сигнала на TD/TF. Переключаю на внутренний клок - все ОК.
Пробую брать клок и с TK, и с RK - ноль.Сигнал SCLK вида препаскуднейшего - больше похож на пилу,
охотно верю, что SAM отказыватся его принимать.
Кто имеет опыт - подскажите, где копать(слабо верится, что такой SCLK штатный).
MCLK береться с генератора на 74HC00 16.384MHz, питание всей схемы 3.3В.
KRS
У меня пила на выходах была, когда ограничение по току срабатывало, правда это было на LPC и на выходах I2C
beer_warrior
Спасибо, поборол - обвешал все конденсаторами, и клок не то что бы исправился, но приобрел более приемлемую форму.
Теперь еще один вопрос - какой режим обмена более приемлемый? Когда все синхронизируеться по SDOFS или FSы работают раэдельно?
В первом случае не совсем понятно, как инициализировать.
Я так понял - сначала сбросить в буфер последовательность команд, дернуть reset - придет SDOFS и PDC их отправит. А как потом сбрасывать данные, если они еще не готовы?
Во втором, вроде все тип-топ можно отправить инит-последовательность побайтно, без всякого PDC и включать/выключать передачу по желанию. Но при этом усложняется разруливание данных уже в самом SAMе.
aaarrr
Цитата(beer_warrior @ Jul 18 2006, 12:19) *
Теперь еще один вопрос - какой режим обмена более приемлемый? Когда все синхронизируеться по SDOFS или FSы работают раэдельно?

По-моему, первый вариант предпочтительнее.

Цитата(beer_warrior @ Jul 18 2006, 12:19) *
В первом случае не совсем понятно, как инициализировать.
Я так понял - сначала сбросить в буфер последовательность команд, дернуть reset - придет SDOFS и PDC их отправит. А как потом сбрасывать данные, если они еще не готовы?

Я бы сделал отдельный автомат на передачу, единственная задача которого - переключать буферы и перегружать регистры PDC, а о наличии в буферах правильных данных пусть заботится остальной софт.
elantra
А разьве там клок не нужен непрерывный? Там же сигма-дельта ацп. Если так - то нужно устраивать рплкладку между синхронным каналом ацп и синхронным каналом контроллера.
beer_warrior
Цитата
А разьве там клок не нужен непрерывный? Там же сигма-дельта ацп. Если так - то нужно устраивать рплкладку между синхронным каналом ацп и синхронным каналом контроллера.

Мастер клок идет с генератора и тактирует АЦП и ЦАП. Он же деленный на 8 дает задает клок для обмена.Контроллер по этому клоку обязан скармливать кодеку данные.

Тут кстати еще веселуха начинается. Не срабатывает прерывание PDC ENDTX. Какого черта?

Код
void InitSSC(DWORD imode, DWORD baudrate)
{
//--------------------------------------------------------------------------
//disable all
AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTDIS;
AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_TXTDIS;
AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST|AT91C_SSC_RXDIS|AT91C_SSC_TXDIS;
AT91C_BASE_SSC->SSC_IDR = (DWORD)(-1);
//--------------------------------------------------------------------------
//enable hardware
//--------------------------------------------------------------------------
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1 << AT91C_ID_SSC));
//--------------------------------------------------------------------------
//configure interrupt
//--------------------------------------------------------------------------
AT91F_AIC_ConfigureIt    (AT91C_BASE_AIC,             //base adr
                 AT91C_ID_SSC,                //int number
                AT91C_AIC_PRIOR_HIGHEST - 2,      //priority
                3,                        //int source type
                SSCInterrupt                //handler
                );            
AT91C_BASE_SSC->SSC_IER = imode;                        
//--------------------------------------------------------------------------                        
AT91F_SSC_SetBaudrate(AT91C_BASE_SSC,48054857, baudrate);

.......

AT91C_BASE_SSC->SSC_RPR = (DWORD)SSCCB.prx_buf;
AT91C_BASE_SSC->SSC_RCR = SSCCB.rx_len;

AT91C_BASE_SSC->SSC_TPR = (DWORD)SSCCB.ptx_buf;
AT91C_BASE_SSC->SSC_TCR = SSCCB.tx_len;

// enable the RX and TX PDC transfer requests
AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTEN;
AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_TXTEN;
//--------------------------------------------------------------------------
//enable device
//--------------------------------------------------------------------------
AT91C_BASE_SSC->SSC_CR = AT91C_SSC_RXEN | AT91C_SSC_TXEN;
//--------------------------------------------------------------------------
//enable interrupt
//--------------------------------------------------------------------------
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SSC);
aaarrr
А значение imode чему равно?
beer_warrior
Код
InitSSC(AT91C_SSC_ENDTX,64000);

Это типовой инит, такой же работает с USART.Маска прерваний вынесена в аргументы, чтобы на лету можно было переконфигурить прием/передачу/синхронизацию.
Unomano
Народ, поделитесь сурсами для TMS320 + AD73311. А то никак не пойму зачем по два раза слать каждую комманду и данные на кодек.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.