|
Почему передатчик SSC смещает влево на 1 бит передаваемое 32-битное слово, at91sam7s |
|
|
|
Dec 28 2009, 11:00
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Передатчик SSC отправляет 32-битные слова в непрерывном режиме с паузой 40мкс, частота тактирования 100 кГц. По прерыванию (TXRDY) буфер передатчика обновляется. Непрерывную передачу с заданной паузой получить удалось, но данные почему-то смещены в сторону старшего бита на 1. Почему так происходит? CODE //++++++++++++++++++++++++++--SSC--+++++++++++++++++++++++++++++++++++++++++++++ __ramfunc void SscHandler() { AT91C_BASE_SSC->SSC_THR = dat_buf; //обновление буфера передатчика unsigned int dummy = AT91C_BASE_SSC->SSC_SR; }
void AT91F_SSC_Conf () { // Setup ssc AT91F_SSC_CfgPMC(); /* Enable MCK clock */ // pio Special configuration AT91F_SSC_CfgPIO(); //* Disable interrupts AT91C_BASE_SSC->SSC_IDR = 0xfff;
//* Reset receiver and transmitter AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_TXDIS ;
//* Define the Clock Mode Register AT91C_BASE_SSC->SSC_CMR = 240; //100 кГц
//* Write the Transmit Clock Mode Register AT91C_BASE_SSC->SSC_TCMR = (17 << 24) & AT91C_SSC_PERIOD | (5<<16) & AT91C_SSC_STTDLY | AT91C_SSC_START_RISE_RF | (0x2 << 6) | AT91C_SSC_CKI | AT91C_SSC_CKO_DATA_TX | AT91C_SSC_CKS_DIV;
//* Write the Transmit Frame Mode Register AT91C_BASE_SSC->SSC_TFMR = AT91C_SSC_FSOS_POSITIVE | (31<<0) & AT91C_SSC_DATLEN; }
void AT91F_SSC_Start(void) { //* Open SSC interrupt AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SSC] = (unsigned int)SscHandler; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SSC] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | SSC_INTERRUPT_LEVEL; AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_SSC); AT91C_BASE_SSC->SSC_IER = AT91C_SSC_TXRDY; AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN; AT91C_BASE_SSC->SSC_THR = dat_buf; } //++++++++++++++++++++++++++--SSC--+++++++++++++++++++++++++++++++++++++++++++++ ramfunc int main(void) { AT91F_SSC_Conf(); AT91F_SSC_Start(); while(1) write(dat_buf); }
Заранее благодарен!
|
|
|
|
|
 |
Ответов
|
Dec 29 2009, 06:30
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(aaarrr @ Dec 29 2009, 00:36)  Расширьте PERIOD. По Юзергайду "a period signal is generated at each 2 x (PERIOD+1) Transmit Clock", то есть STTDLY + DATLEN = 2 x (PERIOD+1) STTDLY = 4, DATLEN = 31, отсюда PERIOD = 17. То есть я просто STTDLY уменьшил на 1 по сравнению с первоначальным вариантом в этом посте. Но как я заметил, при такой конфигурации SSC, как я привел в этом посте, значение поля STTDLY не влияет на паузу, так как PERIOD включает в себя длину 32-битного слова и 4-битную паузу, а в поле CKO у меня Transmit Clock only during data transfers. То есть, на выводе TK пояаляются имульсы только, когда в буфер загружается слово, а так как слово (32 бита) на 4 бита меньше периода TF (36), то и появляется пауза. И всетаки, почему передаваемое слово смещается влево (в сторону старшего бита) на 1 относительно того, что я записываю в регистр THR? Я прикрепил картинку с эпюрами. Желтый сигнал - вывод TK, розовый - TD. В буфер THR я записываю число 0х2000, а по эпюре видно, что 1 на выводе TD появилась только при 15 такте TK, то есть на выходе SSC уже число 0х4000 (смещено на 1 в сторону старшего).
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 29 2009, 19:59
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(aaarrr @ Dec 29 2009, 20:50)  Может и 32. Давайте сделаем так: добавьте к своей осциллограмме сигнал TF и напишите точную конфигурацию регистров SSC. Точная конфигурацию регистров SSC: CODE //* Disable interrupts AT91C_BASE_SSC->SSC_IDR = 0xfff;
//* Reset receiver and transmitter AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_TXDIS ;
//* Define the Clock Mode Register AT91C_BASE_SSC->SSC_CMR = 240; //100 кГц
//* Write the Transmit Clock Mode Register AT91C_BASE_SSC->SSC_TCMR = (17 << 24) & AT91C_SSC_PERIOD | (4<<16) & AT91C_SSC_STTDLY | AT91C_SSC_START_RISE_RF | (0x2 << 6) | AT91C_SSC_CKI | AT91C_SSC_CKO_DATA_TX | AT91C_SSC_CKS_DIV;
//* Write the Transmit Frame Mode Register AT91C_BASE_SSC->SSC_TFMR = AT91C_SSC_FSOS_POSITIVE | (31<<0) & AT91C_SSC_DATLEN;
Осциллограмма TF представляет собой последовательность коротких импульсов с периодом 360 мкс, длительность импульса 10 мкс, то есть в период TF укладывается 36 бит - 32-бита данных и 4 бита паузы. К сожалению, сегодня не смогу снять эпюру с TF(
|
|
|
|
Сообщений в этой теме
Bulat Почему передатчик SSC смещает влево на 1 бит передаваемое 32-битное слово Dec 28 2009, 11:00       Bulat Цитата(Bulat @ Dec 30 2009, 00:59) Осцилл... Jan 4 2010, 07:07 aaarrr Странно, откуда вообще берутся клоки, если в поле ... Jan 5 2010, 10:04 Bulat Цитата(aaarrr @ Jan 5 2010, 15:04) Странн... Jan 5 2010, 11:35  aaarrr Цитата(Bulat @ Jan 5 2010, 14:35) ...пауз... Jan 5 2010, 12:43   Bulat Цитата(aaarrr @ Jan 5 2010, 17:43) 1. При... Jan 6 2010, 07:46    aaarrr Цитата(Bulat @ Jan 6 2010, 10:46) Попробо... Jan 6 2010, 11:39     Bulat Цитата(aaarrr @ Jan 6 2010, 16:39) Зато т... Jan 6 2010, 13:25      aaarrr Цитата(Bulat @ Jan 6 2010, 16:25) Вы имее... Jan 6 2010, 13:45       Bulat Цитата(aaarrr @ Jan 6 2010, 18:45) Ну да,... Jan 7 2010, 10:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|