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

 
 
> Как правильно сконфигурировать SSC на передачу 32-битного слова., at91sam7s
Bulat
сообщение Dec 21 2009, 14:21
Сообщение #1


Местный
***

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



Мне необходимо передавать 32-битное слово с частотой 100 кГц и с паузой перед началом передачи в 4 такта. За основу взял стандартный пример, но существенно упростил его. Использую непрерывный режим передачи, а также не пользуюсь выводом TF. То есть, в основном цикле программы регулярно опрашиваю бит ENDTX регистра статуса и после его установки останавливаю работу SSC, обновляю буфер и вновь запускаю передатчик.
Код
//++++++++++++++++++++++++++--SSC--+++++++++++++++++++++++++++++++++++++++++++++

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 = 92;                                            //100 кГц

     //* Write the Transmit Clock Mode Register
    AT91C_BASE_SSC->SSC_TCMR =  (4<<16) & AT91C_SSC_STTDLY | AT91C_SSC_START_CONTINOUS | AT91C_SSC_CKI | AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKS_DIV;

     //* Write the Transmit Frame Mode Register
    AT91C_BASE_SSC->SSC_TFMR =  (32<<0) & AT91C_SSC_DATLEN;
}


//AT91F_SSC_Start
void AT91F_SSC_Start(void)
{  
  AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN;
  AT91C_BASE_SSC->SSC_THR = datA;  //Запись 32-битного слова в буфер передатчика                                                      
}


// AT91F_SSC_Stop
void AT91F_SSC_Stop(void)
{  
  
    //* Reset receiver and transmitter
        AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_TXDIS;

}


Правильно ли так конфигурировать SSC без использования PDMA-контроллера? И значительно ли разгружает процессор использования PDMA при передачи?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
aaarrr
сообщение Dec 21 2009, 15:03
Сообщение #2


Гуру
******

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



Цитата(Bulat @ Dec 21 2009, 17:21) *
Правильно ли так конфигурировать SSC без использования PDMA-контроллера?

Тут ошибка:
Код
AT91C_BASE_SSC->SSC_TFMR =  (32<<0) & AT91C_SSC_DATLEN;

Поле DATLEN пятибитное, для 32-битного слова в него нужно записать 31.

Цитата(Bulat @ Dec 21 2009, 17:21) *
И значительно ли разгружает процессор использования PDMA при передачи?

Учитывая то, что сейчас все сделано предельно неоптимально - да значительно разгрузит.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 22 2009, 10:49
Сообщение #3


Местный
***

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



Данные с заданной частотой предавать удается, но заданной паузы перед каждым словом нет. Хотя в регистре SSC_TCMR я установил паузу перед началом передачи 4 такта.
Код
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 =  (4<<16) & AT91C_SSC_STTDLY | AT91C_SSC_START_CONTINOUS | (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 = (0<<8) & AT91C_SSC_DATNB | (31<<0) & AT91C_SSC_DATLEN;
}

void AT91F_SSC_Start(void)
{  
  AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN;
  AT91C_BASE_SSC->SSC_THR = datA;                                                        
}

void main()
{
   while(1)
   {
      if(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXBUFE) {write(datA); AT91F_SSC_Start();}
    }
}

В основном цикле программы непрерывно опрашивается бит TXBUFE регистра SSC_SR и в случае готовности передатчика данные записываются в буфер datA и запускается передатчик. Как обеспичить паузу между словами и возможно ли во время паузы останавливать тактовые импульсы ТК?

Модератор (rezident). Для публикования значительных по объему исходников пользуйтесь наставлениями Правил форума. То бишь текстовыми вложениями. А при оформлении таких цитат тэгами [ codebox ], вместо [ code ]. При этом сами (самостоятельно) форматируйте свои исходники так, чтобы они не "распирали" окно просмотра топика в браузере.

Сообщение отредактировал rezident - Dec 22 2009, 12:19
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2009, 16:41
Сообщение #4


Гуру
******

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



Цитата(Bulat @ Dec 22 2009, 13:49) *
Данные с заданной частотой предавать удается, но заданной паузы перед каждым словом нет. Хотя в регистре SSC_TCMR я установил паузу перед началом передачи 4 такта.

В continuous режиме STTDLY не работает.

Цитата(Bulat @ Dec 22 2009, 13:49) *
Как обеспичить паузу между словами и возможно ли во время паузы останавливать тактовые импульсы ТК?

Использовать нормальный режим с TF (можно "виртуальным"), выставить STTDLY и CKG.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 23 2009, 10:13
Сообщение #5


Местный
***

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



Цитата(aaarrr @ Dec 22 2009, 21:41) *
Использовать нормальный режим с TF (можно "виртуальным"), выставить STTDLY и CKG.

А как настроить режим с "виртуальным" TF? Вот мои регистры SSC_TCMR и SSC_TFMR:
Код
AT91C_BASE_SSC->SSC_TCMR = (15 << 24) & AT91C_SSC_PERIOD | (4<<16) & AT91C_SSC_STTDLY | AT91C_SSC_START_HIGH_RF | (0x2 << 6)
| AT91C_SSC_CKI | AT91C_SSC_CKO_DATA_TX | AT91C_SSC_CKS_DIV;

AT91C_BASE_SSC->SSC_TFMR = AT91C_SSC_FSDEN | AT91C_SSC_FSOS_HIGH | (0<<8) & AT91C_SSC_DATNB | (31<<0) & AT91C_SSC_DATLEN;

Так передатчик вообще не запускается.

Модератор (rezident). Еще раз поясняю, что тэги [ codebox ] следует использовать для цитирования объёмных исходников (десять и более строк). Для небольших исходников пользуйтесь [ code ]. Но перед публикацией следует самостоятельно форматировать исходник так, чтобы при отображении страницу не "распирало". Поправил цитату.

Сообщение отредактировал rezident - Dec 23 2009, 10:41
Причина редактирования: Правка вида цитаты исходника.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Dec 24 2009, 11:07
Сообщение #6


Местный
***

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



Почему даже на выводе TF сигнала нет? В AT91C_SSC_START_CONTINOUS режиме данные на выходе есть, а при других режимах нету.
Go to the top of the page
 
+Quote Post

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

 


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


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