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

 
 
> Почему передатчик SSC смещает влево на 1 бит передаваемое 32-битное слово, at91sam7s
Bulat
сообщение Dec 28 2009, 11:00
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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);
}

Заранее благодарен!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Dec 28 2009, 13:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Dec 28 2009, 14:00) *
данные почему-то смещены в сторону старшего бита на 1. Почему так происходит?

Смещены относительно чего? Изложите чуть подробнее, что хотите получить, и что получается на самом деле.

Сейчас, как я понимаю, будет отрезан клок от одного бита, т.к. в конфигурации стоит Transmit Clock enabled only if TF High, но STTDLY + DATLEN > PERIOD.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 28 2009, 18:37
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



aaarrr
Слово смещено влево на 1 бит (то есть 32 бит теряется, а вместо первого бита 0),относительно записанного в переменной dat_buf. А как настроить, чтобы не был "отреза клок" от одного бита?

Сообщение отредактировал Omen_13 - Dec 28 2009, 23:06
Причина редактирования: Нарушение правил п.3.4
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 28 2009, 19:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Dec 28 2009, 21:37) *
А как настроить, чтобы не был "отреза клок" от одного бита?

Расширьте PERIOD.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 29 2009, 06:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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 в сторону старшего).
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 29 2009, 10:24
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Первый тактовый импульс на желтой эпюре (смотри рисунок прикрепленный выше) соответствует не первому биту 32-битного слова, а значению вывода TD при отсутствии передачи, которое определяется полем DATDEF: Data Default Value. То есть, если DATDEF=1, то первый бит передаваемого слова будет равен 1. Почему так происходит? Получается, что SSC может передавать слова максимально длины 31 бит?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 29 2009, 15:50
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Dec 29 2009, 13:24) *
Получается, что SSC может передавать слова максимально длины 31 бит?

Может и 32. Давайте сделаем так: добавьте к своей осциллограмме сигнал TF и напишите точную конфигурацию регистров SSC.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 29 2009, 19:59
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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(
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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