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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Тихоходный SPI на SAM7
prottoss
сообщение Jan 3 2010, 15:19
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Всех с прошедшим Новым Годом и наступающим Рождеством!
Все у меня получилось с тихоходным SPI. Сделал два счетчика - первый для формирования импульса , второй для счета этих самых импульсов. Счетный вход второго счетчика соответсвенно соединен с выходом TIOA первого. Останавливал оба счетчика в прерывании по "COMPARE А" второго. . Решил избавиться от прерывания. Для этого выход TIOA запрограммировал на соединение со счетным входом первого через мультиплексор по AND (флаг Burst Signal Selection). Но что то не пашет...
Вот код инициализации:
Код
/* Init SCK WAVE maker counter */
    TC_Init(AT91C_BASE_TC2, AT91C_ID_TC2,
            0 | /* Source clock - none */
            AT91C_TC_BURST_XC2 |        /* Clock from XCLK & control signal (HI) from PULSE TIOA */
            AT91C_TC_WAVESEL_UP_AUTO |    /* UP mode with atomatic trigger on RC Compare */
            AT91C_TC_WAVE |                  /* Waveform Mode is enabled */
            AT91C_TC_ACPA_SET |            /* A Compare Effect on TIOA - Set output pin after compare */
            AT91C_TC_ACPC_CLEAR            /* C Compare Effect on TIOA - Clear output pin after compare */
            );
    AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN;    /* Enable clock */
    
    /* Init SCK PULSE counter */
    TC_Init(AT91C_BASE_TC1, AT91C_ID_TC1,
            AT91C_TC_CLKS_XC1 |        /* Clock from WAVE TIOA */
            AT91C_TC_CLKI |     /* Invert clock - for negative edge counting */
            AT91C_TC_WAVESEL_UP_AUTO |    /* UP mode with atomatic trigger on RC Compare */
            AT91C_TC_WAVE |                       /* Waveform Mode is enabled */
            AT91C_TC_ACPA_CLEAR |              /* Clear TIOA after compare - for stopping Wave Counter */
            AT91C_TC_ASWTRG_SET               /* Set TIOA after starting - for start Wave Counter */
            );
     AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN;    /* Enable clock */

     /* Set counters block register */
    AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC2XC2S_TIOA1 | AT91C_TCB_TC1XC1S_TIOA2 | AT91C_TCB_TC0XC0S_NONE;


Старт счетчиков:
Код
/* Enable clock and start pulse counter */
    AT91C_BASE_TC1->TC_RA = (UINT32)n_pulses;    /* Setup pulse counter compare */
    (void)AT91C_BASE_TC1->TC_SR;    /* Clear status register */
    AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; /* !!!!!!!!!!!!!!!!!!!!! Here TIOA must be set to one, for enable clock for Wave Maker !!!!!!!!!!!!!!!!!!!!! */
    
    /* Enable clock and start wave maker */
    (void)AT91C_BASE_TC2->TC_SR;    /* Clear status register */
    AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG;


В окне отладчика вижу, что после команды "AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG" MTIOA в регистре статуса не устанавливается в "1", тем самым не разрешает счет для ТС2. Но не могу понять почему...


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 3 2010, 15:29
Сообщение #17


Гуру
******

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



У TC1 нет клока, как же он сможет "отреагировать" на SWTRG?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 3 2010, 15:50
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jan 3 2010, 22:29) *
У TC1 нет клока, как же он сможет "отреагировать" на SWTRG?
Как нет? Есть - AT91C_TC_CLKS_XC1

Да и кстати, это клок может зависеть от SWTRG, но не наоборот. По установке SWTRG должен асинхронно установиться выход TIOA, тем самым разрешая прохождение счетных импульсов на TC2, и разрешится счет имупльсов собсвтенно у ТС1


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 3 2010, 16:12
Сообщение #19


Гуру
******

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



Цитата:
Цитата
Regardless of the trigger used, it will be taken into account at the following active edge of the
selected clock. This means that the counter value can be read differently from zero just after a
trigger, especially when a low frequency signal is selected as the clock.

И это действительно так sad.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 3 2010, 17:13
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jan 3 2010, 23:12) *
И это действительно так sad.gif
Спасибо... Тогда может быть флаг AT91C_TC_BURST_XC2 для блокировки первого счетчика ставить после запуска счетчиков? Хотя не факт, что успею на максимальной частоте передачи... В любом случае большое спасибо!


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 3 2010, 17:25
Сообщение #21


Гуру
******

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



Цитата(prottoss @ Jan 3 2010, 20:13) *
Тогда может быть флаг AT91C_TC_BURST_XC2 для блокировки первого счетчика ставить после запуска счетчиков?

Да, можно так. Т.е. запуститься от внутреннего клока, а потом "на горячую" перекинуть его на внешний.

Надо заметить, что таймеры SAM7 вообще плохо приспособлены для работы с внешним тактированием или для подсчета импульсов. Приходится выдумывать различные work-around'ы.
Go to the top of the page
 
+Quote Post

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

 


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


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