Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SSC на AT91RM9200
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
S.E.V.
Добрый вечер,
есть AT91RM9200 который через SSP связан с DSP-шником. Три линии в одну сторону, три в другую, т.е. тот кто передает данные, формирует Frame Sync и Clock. Существует ли возможность корректно остановить передатчик SSC на ARM-е, таким образом, чтобы премник DSP принял все предназначеные ему фреймы ?
SpiritDance
Цитата(S.E.V. @ Nov 12 2006, 23:13) *
Добрый вечер,
есть AT91RM9200 который через SSP связан с DSP-шником. Три линии в одну сторону, три в другую, т.е. тот кто передает данные, формирует Frame Sync и Clock. Существует ли возможность корректно остановить передатчик SSC на ARM-е, таким образом, чтобы премник DSP принял все предназначеные ему фреймы ?

Вроде как после установки бита TXDIS в регистре статуса передатчик выключается именно после завершения передачи. Только вот такты продолжает генерить собака.
S.E.V.
Цитата(SpiritDance @ Nov 13 2006, 10:50) *
Вроде как после установки бита TXDIS в регистре статуса передатчик выключается именно после завершения передачи. Только вот такты продолжает генерить собака.


В том то и дело. SSC продолжает генерировать тактовые импульсы, и сигналы фреймовой синхронизации. При этом, естественно, DSP принимает пустые фреймы.
SpiritDance
blink.gif Странно... фреймсинки он должен прекратить генерить, у меня на схеме ставит выходы в z-состояние правда с каким-то ненормальным уровнем сигнала - возможно виновато питание. (правда у меня sam7s). Чтобы прекратить подачу тактов можно потом его еще и в PMC отрубить.
Какой-то все таки странный у атмела ssc.
aaarrr
В описании бита TXDIS есть даже специальное примечание: "Only the data management is affected", т.е. на формировании синхронизации его установка сказываться не должна.

Что касается основного вопроса, то, по-моему, передача должна идти постоянно, а разделять фреймы на пустые и содержащие данные должен протокол верхнего уровня. Например, можно сделать разделение по MSB, как это делается у некоторых кодеков.
vmp
А если попробовать установить поле CKO регистра SSC_TCMR в значение 2 (transmit clock only during data transfer)?
Аналогично в регистре SSC_RCMR.
Пишу по опыту работы с SSC в SAM7S.
SpiritDance
Цитата(vmp @ Nov 14 2006, 17:35) *
А если попробовать установить поле CKO регистра SSC_TCMR в значение 2 (transmit clock only during data transfer)?
Аналогично в регистре SSC_RCMR.
Пишу по опыту работы с SSC в SAM7S.

В таком случае на передатчике такты генерится перестают, но framesync продолжает работать. smile.gif по идее в данном случае должно помочь.

aaarrr
уж не знаю чего имел ввиду атмел под словами data management но при таком коде TF RF после выключения преходят в третье состояние.
Код
    AT91C_BASE_SSC->SSC_CMR = 2;
        
    
    AT91C_BASE_SSC->SSC_TFMR =   (17 & AT91C_SSC_DATLEN)
                              | AT91C_SSC_MSBF
                              | ((0 << 8) & AT91C_SSC_DATNB)    //колво блоков во фрейме 0 + 1
                              | ((15 << 16) & AT91C_SSC_FSLEN)  //16-1  
                              | AT91C_SSC_FSOS_NEGATIVE;

    AT91C_BASE_SSC->SSC_TCMR =  AT91C_SSC_CKS_DIV
                              | AT91C_SSC_CKO_CONTINOUS
                              | AT91C_SSC_START_CONTINOUS
                              | ((8 << 24) & AT91C_SSC_PERIOD);
    
    AT91C_BASE_SSC->SSC_RFMR =  (17 & AT91C_SSC_DATLEN)         //17+1 бит
                              | AT91C_SSC_FSOS_NEGATIVE         //фронт из 0 в 1
                              | AT91C_SSC_MSBF                  //сатршим битом вперед
                              | ((0 << 8) & AT91C_SSC_DATNB)    //колво блоков во фрейме 0 + 1
                              | ((15 << 16) & AT91C_SSC_FSLEN); //16-1  

    AT91C_BASE_SSC->SSC_RCMR =  AT91C_SSC_CKS_DIV
                              | AT91C_SSC_CKO_CONTINOUS
                              | AT91C_SSC_START_CONTINOUS
                              | ((8 << 24) & AT91C_SSC_PERIOD);

    AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN | AT91C_SSC_RXEN;

....
    AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXDIS | AT91C_SSC_RXDIS;
    AT91F_PMC_DisablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_SSC);    ///breakpoint

(я тут выкинул конфигурирование PIO и PMC но оно есть) Так вот в строке брейкпоинта наблюдаю z-состояние на tf rf и генерацию тактов на tk и rk. Я совершил чудо на SAM7S256?. smile.gif
S.E.V.
Спасибо огромное.
Передатчик действительно останавливается и снимает клоки при установке бита TXDIS в SSC_CMR. Клоки снимаются при условии что поле CKO имеет значение 2. Остается только фреймовая синхронизация.
SpiritDance
А попробуйте просто через PMC фреймсинки выключить вместе с SSC. smile.gif
S.E.V.
Через PMC FrameSync выключать нельзя, поскольку отключится и приемник, при этом DSP не сможет передавать данные на ARM. Но зато можно переключить ногу контроллера на PIO.
SpiritDance
И что получилось преключить? У меня помнится такой номер не прошел, хотя я возможно ошибся.
boryx
Столкнулся с проблемой
Немогу ничего принаять с SSC шины.

Уже выкинуто все лишнее,
теперь только конфигурю PIO
(в PDR ставлю 1 и в ASR тоже)
в PCM в нужное место 1.

устонавливаю SSC_RFMR и RCMR как в примере.
энаблю AT91C_SSC_RXEN в SSC_CR
и сколько не жди данные, их нет в SSC_RHR.

Кто нидь знает, что я не так делаю smile.gif
SpiritDance
Цитата(boryx @ Dec 20 2006, 19:17) *
Кто нидь знает, что я не так делаю smile.gif

Телепаты в отпуске. Приведите кусок кода и скажите хотябы откуда Вы пытаетесь что-то принять.
boryx
Цитата
Телепаты в отпуске.


Жаль, а я так надеялся на их помощь. smile.gif

Если серьезно, то на шине для SSC2 висит устройство, которое генерит клоки и фреймы.
На осцилографе видно, что есть и данные, и клоки и фреймы. Причем эти 3 ножки точно подключены к Атмелю, т.к. я могу через PIO их поднимать/опускать и изменения видны на осцилографе

Теперь

at91_sys_write(AT91_PIOB + PIO_PDR, AT91_PB14_TD2|AT91_PB15_RD2|AT91_PB16_RK2|AT91_PB17_RF2);//disable pio to control pins
at91_sys_write(AT91_PIOB + PIO_ASR, AT91_PB14_TD2|AT91_PB15_RD2|AT91_PB16_RK2|AT91_PB17_RF2);//set pins to peripheral A

at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SSC2);//SSC2 power on

at91_ssc2_write(AT91C_SSC_CR, AT91C_SSC_RXEN); //reset

at91_ssc2_write(AT91_SSC_RCMR,
AT91_SSC_CKS_PIN| //AT91_SSC_CKS_PIN = 2;
AT91_SSC_CKI_RISING|
AT91_SSC_CKO_NONE
);

at91_ssc2_write(AT91_SSC_RFMR,
AT91_SSC_FSOS_NONE|
AT91_SSC_MSBF|
(15)
);

at91_ssc2_write(AT91C_SSC_CR, AT91C_SSC_RXEN);

теперь влажок RXRDY в SSC_SR об окончании приема не выставляется. А SSC_RHR = 0 всегда.

Подскажите, что не правельно.

Кто нидь работал с AT91 SSC на прием с клоком от внешнего источника?
SpiritDance
А попробуйте SSC slave,ом сделать.
boryx
Цитата(SpiritDance @ Dec 21 2006, 14:40) *
А попробуйте SSC slave,ом сделать.


как это?

я ведь ставлю AT91_SSC_CKS_PIN, что clk нужно брать с ножки
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.