Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тихоходный SPI на SAM7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
prottoss
Всем привет. Хочу соорудить последовательный канал данных (примерно как SPI) c максимально низкой (50-100 Гц) тактовой частотой. Т.е. две однонаправленные линии данных плюс тактовый от мастера. Возможно ли аппаратно это сделать на SAM7?. Пока думаю в качестве передатчика использовать SSC (у него бОльший коэффициент деления тактовой частоты), а в качестве приемника SPI в режиме Slave. Конечно, SSC, судя по даташиту на 50-100 гц не потянет, а только минимум MCK/8190, но хотя бы пока так. С SSC не приходилось работать. Почитал форум, но в основном SSC используют вместе с квитирующими линиями, и ловят какие то баги.
vmp
Раз SPI в режиме slave, то и передавать им можно. Остается только тактовый сигнал сделать, например от таймера (аппаратно или программно по прерываниям) или от UART (выдавать на него последовательность чего-то вроде 0x55 или 0xF0).
prottoss
Цитата(vmp @ Nov 21 2009, 14:05) *
Раз SPI в режиме slave, то и передавать им можно. Остается только тактовый сигнал сделать, например от таймера (аппаратно или программно по прерываниям) или от UART (выдавать на него последовательность чего-то вроде 0x55 или 0xF0).
Ага, спасибо за идею. cheers.gif Седня попробую.
Dron_Gus
С такой частотой есть смысл задуматься о простом ногодрыгстве по таймеру или даже по таймеру ОС.
fmdost
Полу bb-offtopic.gif
А для чего надо так медленно?
prottoss
Цитата(Dron_Gus @ Nov 21 2009, 19:03) *
С такой частотой есть смысл задуматься о простом ногодрыгстве по таймеру или даже по таймеру ОС.
Частота может быть в широком диапазоне. Я указал нижнюю границу.

Цитата(Т.Достоевский @ Nov 21 2009, 20:23) *
Полу bb-offtopic.gif А для чего надо так медленно?
Потому что слэйв порой не успеваетsmile.gif
Petka
Цитата(prottoss @ Nov 21 2009, 17:29) *
Частота может быть в широком диапазоне. Я указал нижнюю границу.

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

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

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

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

А это чему-то мешает? Используйте "ногодрыганье" в нижнем диапазоне и аппаратный SPI в верхнем. Все лучше, чем тиранить железку пятьюдесятью герцами.
prottoss
Цитата(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
Petka
Цитата(prottoss @ Nov 24 2009, 09:42) *
Аппаратный

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

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


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

Для этих целей я разработал "abd-протокол" подробности можете посмотреть в последних постах темы AvrUsb500 by Petka. Не будем здесь оффтопить. Все вопросы туда или в личку.
prottoss
Всех с прошедшим Новым Годом и наступающим Рождеством!
Все у меня получилось с тихоходным 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. Но не могу понять почему...
aaarrr
У TC1 нет клока, как же он сможет "отреагировать" на SWTRG?
prottoss
Цитата(aaarrr @ Jan 3 2010, 22:29) *
У TC1 нет клока, как же он сможет "отреагировать" на SWTRG?
Как нет? Есть - AT91C_TC_CLKS_XC1

Да и кстати, это клок может зависеть от SWTRG, но не наоборот. По установке SWTRG должен асинхронно установиться выход TIOA, тем самым разрешая прохождение счетных импульсов на TC2, и разрешится счет имупльсов собсвтенно у ТС1
aaarrr
Цитата:
Цитата
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
prottoss
Цитата(aaarrr @ Jan 3 2010, 23:12) *
И это действительно так sad.gif
Спасибо... Тогда может быть флаг AT91C_TC_BURST_XC2 для блокировки первого счетчика ставить после запуска счетчиков? Хотя не факт, что успею на максимальной частоте передачи... В любом случае большое спасибо!
aaarrr
Цитата(prottoss @ Jan 3 2010, 20:13) *
Тогда может быть флаг AT91C_TC_BURST_XC2 для блокировки первого счетчика ставить после запуска счетчиков?

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

Надо заметить, что таймеры SAM7 вообще плохо приспособлены для работы с внешним тактированием или для подсчета импульсов. Приходится выдумывать различные work-around'ы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.