Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно сконфигурировать SSC на передачу 32-битного слова.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Bulat
Мне необходимо передавать 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 при передачи?
aaarrr
Цитата(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 при передачи?

Учитывая то, что сейчас все сделано предельно неоптимально - да значительно разгрузит.
Bulat
Данные с заданной частотой предавать удается, но заданной паузы перед каждым словом нет. Хотя в регистре 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 ]. При этом сами (самостоятельно) форматируйте свои исходники так, чтобы они не "распирали" окно просмотра топика в браузере.
aaarrr
Цитата(Bulat @ Dec 22 2009, 13:49) *
Данные с заданной частотой предавать удается, но заданной паузы перед каждым словом нет. Хотя в регистре SSC_TCMR я установил паузу перед началом передачи 4 такта.

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

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

Использовать нормальный режим с TF (можно "виртуальным"), выставить STTDLY и CKG.
Bulat
Цитата(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 ]. Но перед публикацией следует самостоятельно форматировать исходник так, чтобы при отображении страницу не "распирало". Поправил цитату.
Bulat
Почему даже на выводе TF сигнала нет? В AT91C_SSC_START_CONTINOUS режиме данные на выходе есть, а при других режимах нету.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.