реклама на сайте
подробности

 
 
> непонятки с Synchronous Serial Controller, как отправлять отдельно по байтам, типа, как SPI тока с frame sync
Andryha
сообщение Jun 30 2007, 06:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 6-04-07
Пользователь №: 26 805



help.gif Здравствуйте уважаемые участники форума, подскажите пожалуйста, как настроить SSC таким образом, чтобы он при записи данных в регистр SSC_THR тактирование шло только в течение передачи одного байта да еще и с frame sync вначале передачи?? всю ночь просидел, голова пухнет... но проблема в том, как только разрешаю передачу, устанавливаю AT91C_SSC_PERIOD регистра SSC_TCMR так он без передачи байт начинает тактировать и выдавать импульсы frame_sync.. что делать??? очень нада... заранее спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Leen
сообщение Jul 2 2007, 07:19
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Да нет, просто зима была лютой... В общем, все работает. Вот чего я нащупал с помощью С1-114 (верный друг, товарищ и едаsmile.gif:
- для того чтобы клоки на линии были только во время данных, поле CKO = 0x2, как и предполагалось;
- для формирования кадра синхронизации (далее FS) надо помудрить:
1 Определяем с какой скоростью поступают данные data_period (в периодах тактирования шины),
2 ставим период формирования FS в поле PERIOD регистра TCMR как (data_period/2) - 1,
3 ставим в TFMR нужный вид импульса (я не заметил разницы межлу falling & rising фронтами, хотя она наверно есть),
4 ставим в TCMR поле start в нужное нам положение - старт по заднему фронту,
5 ставим задержку вывода данных (если надо выводить данные после окончания FS) в поле STTDLY,
6 ставим длину данных - 1 (для одного байта за раз поставил DATLEN=7; DATNB = 0),
7 ставим длину FS: FSLEN = 0.
Естественно, надо сконфигурить выводы, клоки всех заинтересованных, а так же частоту собсно тактов SSC. Ну и не забыть разрешить прием и передачу.
Успехов.
ЗЫ: если не все объяснил - пишите.
ЗЫЫ: вышел (новый) datasheet по SAM7S, rev. G, 11/06. Багов в SSC не убавилось. Такое впечатление, что сляпали, народ не возмущается - они и не правят.

Сообщение отредактировал Leen - Jul 2 2007, 07:22
Go to the top of the page
 
+Quote Post
Andryha
сообщение Jul 4 2007, 13:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 6-04-07
Пользователь №: 26 805



Цитата(Leen @ Jul 2 2007, 14:19) *
я не заметил разницы межлу falling & rising фронтами, хотя она наверно есть


Falling & rising, насколько я понял относится к полю FSEDGE.. а оно детектирует либо передний фронт FS сигналла либо задний и вызывает прерывание
Go to the top of the page
 
+Quote Post
Andryha
сообщение Sep 25 2007, 06:44
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 6-04-07
Пользователь №: 26 805



Еще вопрос от Ламера... Чет не могу сообразить как работать с прерываниями ENDTX... Этот флаг, ведь всегда в еденице!! что бесконечно вызывает прерывание:-(.. Так вот вопрос.. как сделать так, чтоб прерывание выскакивало только один раз после завершения передачи байта.

SSC настройка стандартная, взятая откудато(не помню уже), с маленькими переадаптациями.

>void AT91F_SSC_Start(void)
{ // Setup ssc
AT91F_SSC_CfgPMC(); /* Enable MCK clock */

// pio Special configuration
*AT91C_PIOA_PDR = AT91C_SSC_TD; /* Enable TD on PA17 */
*AT91C_PIOA_ASR = AT91C_SSC_TD;
*AT91C_PIOA_ODR = AT91C_SSC_TD;
*AT91C_PIOA_PDR = AT91C_PA15_TF; /* Enable TF on */
*AT91C_PIOA_ASR = AT91C_PA15_TF;
*AT91C_PIOA_ODR = AT91C_PA15_TF;
*AT91C_PIOA_PDR = AT91C_PA16_TK; /* Enable TK on */
*AT91C_PIOA_ASR = AT91C_PA16_TK;
*AT91C_PIOA_ODR = AT91C_PA16_TK;

// Configure SSC in Transmit mode
AT91F_SSC_Conf(AT91C_BASE_SSC,
(MCK / (2 * SAMPLEWORDBITS * SAMPLE_RATE)) + 1, // SSC_CMR
0, // SSC_RCMR
0, // SSC_RFMR
AT91C_SSC_CKS_DIV + AT91C_SSC_CKO_DATA_TX + AT91C_SSC_START_CONTINOUS + AT91C_SSC_PERIOD, // SSC_TCMR

(SAMPLEWORDBITS - 1) + (((SAMPLEFRAME-1) & 0xF) << 8) + AT91C_SSC_MSBF + AT91C_SSC_FSLEN + AT91C_SSC_FSOS_HIGH + AT91C_SSC_FSEDGE ); // SSC_TFMR


//* Open SSC interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SSC, SSC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL , SscHandler);

AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SSC);

AT91F_SSC_EnableIt( AT91C_BASE_SSC, AT91C_SSC_TXEN );

AT91F_SSC_EnableTx(AT91C_BASE_SSC);
}<

Идея такая.. Когда нада передать несколько байт я просто записываю в THR первый байт из массива, а остальные байты я хочу посылать в обработчике прерывания, которое возникнет после передачи первого...
Как настроить?? чтото я Моск уже сломал....
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 09:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016