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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Тихоходный SPI на SAM7
prottoss
сообщение Nov 21 2009, 05:47
Сообщение #1


Гуру
******

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



Всем привет. Хочу соорудить последовательный канал данных (примерно как SPI) c максимально низкой (50-100 Гц) тактовой частотой. Т.е. две однонаправленные линии данных плюс тактовый от мастера. Возможно ли аппаратно это сделать на SAM7?. Пока думаю в качестве передатчика использовать SSC (у него бОльший коэффициент деления тактовой частоты), а в качестве приемника SPI в режиме Slave. Конечно, SSC, судя по даташиту на 50-100 гц не потянет, а только минимум MCK/8190, но хотя бы пока так. С SSC не приходилось работать. Почитал форум, но в основном SSC используют вместе с квитирующими линиями, и ловят какие то баги.


--------------------
Go to the top of the page
 
+Quote Post
vmp
сообщение Nov 21 2009, 07:05
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Раз SPI в режиме slave, то и передавать им можно. Остается только тактовый сигнал сделать, например от таймера (аппаратно или программно по прерываниям) или от UART (выдавать на него последовательность чего-то вроде 0x55 или 0xF0).
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 21 2009, 08:47
Сообщение #3


Гуру
******

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



Цитата(vmp @ Nov 21 2009, 14:05) *
Раз SPI в режиме slave, то и передавать им можно. Остается только тактовый сигнал сделать, например от таймера (аппаратно или программно по прерываниям) или от UART (выдавать на него последовательность чего-то вроде 0x55 или 0xF0).
Ага, спасибо за идею. cheers.gif Седня попробую.


--------------------
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 21 2009, 12:03
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



С такой частотой есть смысл задуматься о простом ногодрыгстве по таймеру или даже по таймеру ОС.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Nov 21 2009, 13:23
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Полу bb-offtopic.gif
А для чего надо так медленно?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 21 2009, 14:29
Сообщение #6


Гуру
******

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



Цитата(Dron_Gus @ Nov 21 2009, 19:03) *
С такой частотой есть смысл задуматься о простом ногодрыгстве по таймеру или даже по таймеру ОС.
Частота может быть в широком диапазоне. Я указал нижнюю границу.

Цитата(Т.Достоевский @ Nov 21 2009, 20:23) *
Полу bb-offtopic.gif А для чего надо так медленно?
Потому что слэйв порой не успеваетsmile.gif


--------------------
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 21 2009, 15:05
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(prottoss @ Nov 21 2009, 17:29) *
Частота может быть в широком диапазоне. Я указал нижнюю границу.

Потому что слэйв порой не успеваетsmile.gif

Слэйв программный что-ли?
Go to the top of the page
 
+Quote Post
IJAR
сообщение Nov 23 2009, 21:03
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Цитата(prottoss @ Nov 21 2009, 17:29) *
Частота может быть в широком диапазоне. Я указал нижнюю границу.

Потому что слэйв порой не успеваетsmile.gif

Если Slave не успевает, то попробуйте его сделать мастером а Master - Slave-ом
и используйте его SPI. Часто помогает.


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 23 2009, 21:12
Сообщение #9


Гуру
******

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



Цитата(prottoss @ Nov 21 2009, 17:29) *
Частота может быть в широком диапазоне. Я указал нижнюю границу.

А это чему-то мешает? Используйте "ногодрыганье" в нижнем диапазоне и аппаратный SPI в верхнем. Все лучше, чем тиранить железку пятьюдесятью герцами.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 24 2009, 06:42
Сообщение #10


Гуру
******

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



Цитата(Petka @ Nov 21 2009, 22:05) *
Слэйв программный что-ли?
Аппаратный

Цитата(IJAR @ Nov 24 2009, 04:03) *
Если Slave не успевает, то попробуйте его сделать мастером а Master - Slave-оми используйте его SPI. Часто помогает.
Его невозможно сделать мастером

Цитата(aaarrr @ Nov 24 2009, 04:12) *
А это чему-то мешает? Используйте "ногодрыганье" в нижнем диапазоне и аппаратный SPI в верхнем. Все лучше, чем тиранить железку пятьюдесятью герцами.
Я все таки склонился к варианты с двумя счетчиками и SPI в режиме Slave. Т.е. одним счетчиком задаем период, вторым количество тактовых импульсов SPI. Да и вообще меня больше привлекает динамичный железный SPI, нежели ногодрыгание. smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 24 2009, 07:34
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(prottoss @ Nov 24 2009, 09:42) *
Аппаратный

Аппаратный и не успевает? Вы не используете прерывания, программно поллите регистр аппаратного SPI?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 24 2009, 07:45
Сообщение #12


Гуру
******

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



Цитата(Petka @ Nov 24 2009, 14:34) *
Аппаратный и не успевает? Вы не используете прерывания, программно поллите регистр аппаратного SPI?
Не успевает. Второй вопрос мне не совсем понятен, но для приемной стороны я не писал софтины, если Вы это имеете ввиду.


--------------------
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 24 2009, 07:50
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(prottoss @ Nov 24 2009, 10:45) *
Второй вопрос мне не совсем понятен, но для приемной стороны я не писал софтины, если Вы это имеете ввиду.

Понятно. Хотел предложить протокол с контролем потока данных. Что-бы успевало всегда =). Но если слэйв перепрограммировать нельзя, то это отпадает.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 24 2009, 13:52
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Petka @ Nov 24 2009, 10:50) *
Понятно. Хотел предложить протокол с контролем потока данных. Что-бы успевало всегда =). Но если слэйв перепрограммировать нельзя, то это отпадает.


Предложите мне. Тонее расскажите как это реализовать на "чистом" SPI (4 линии)? Сейчас подобная задача стоит.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 24 2009, 14:25
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Dron_Gus @ Nov 24 2009, 16:52) *
Предложите мне. Тонее расскажите как это реализовать на "чистом" SPI (4 линии)? Сейчас подобная задача стоит.

Для этих целей я разработал "abd-протокол" подробности можете посмотреть в последних постах темы AvrUsb500 by Petka. Не будем здесь оффтопить. Все вопросы туда или в личку.
Go to the top of the page
 
+Quote Post
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 Текстовая версия Сейчас: 21st July 2025 - 13:58
Рейтинг@Mail.ru


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