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

 
 
 
Reply to this topicStart new topic
_4afc_
сообщение Sep 6 2006, 07:47
Сообщение #1


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

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



Понадобилось мне передавать значения переменных из одного процессора в другой.
Размер структуры - 8 байт. Частота опроса около 20000 раз в секунду.
Собирался изначально реализовать на SSC (Slave->Master):

S_TF <- M_RF
S_TK <- M_RK
S_TD -> M_RD

Но мне кажется, что придётся писать обработчик в slave, что-то я не понял как ПДП подключить.

Вообще какую реализацию для этого лучше выбрать SSC, SPI, USART ?
Повторяю данные лежат всегда с одного и тогоже адреса.
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 6 2006, 08:39
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



http://electronix.ru/forum/index.php?showtopic=20584


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Sep 28 2006, 11:43
Сообщение #3


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

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



Цитата(VAI @ Sep 6 2006, 12:39) *


Это немного не то - там автор исследует софтовую проблему (верхнего уровня) - как распределить роли между процессами\программами.

Меня же больше интересует уровень железа - насколько реально он совпадает с последними доками амела и чего кому удалось добиться... Например сейчас у меня не корректно работает SSC...

Вроде удалось мне подружить два AT91SAM7S64 по SSC.
Но не до конца. Я посылаю данные порциями по 4 16 битных слова, но часто приёмник начинает складывать данные в ОЗУ не с первого слова, а с любого другого. Не понимаю как это может происходить, если старт установлен по спаду кадра?
Причём данные (TD->RD) идут одинаково всегда (по осциллографу)!

Когда проверял на одном микроконтроллере - ошибок не было.
Конфигурация была (PA0->TF,PA0->RF,TK->RK,TD->RD).
Залил ТУЖЕ программу в два контроллера, кадровая от первого,
Второй передаёт на первый - путает слова.

Снижение на порядок частоты передачи - не влияет.
При PA0 = 0-70us,1-10us - часто не считывается первый бит в посылке.

Код
int main ( void ) //Slave TX
{
InitIO();
InitSSC();
InitSSC_PDC();
while (1) if ((AT91C_BASE_SSC->SSC_SR&0x0f)==0x0f) {AT91C_BASE_SSC->SSC_TPR=TBuf;AT91C_BASE_SSC->SSC_TCR=4;}
}

int main ( void ) //Master RX
{
InitIO();
InitSSC();
InitSSC_PDC();
timer_init(); //PA0 = 0-70us,1-30us
while (1) if ((AT91C_BASE_SSC->SSC_SR&0x40)==0x40) {AT91C_BASE_SSC->SSC_RPR=RBuf;AT91C_BASE_SSC->SSC_RCR=1600*4;}
}

Начальные установки идентичны. В обоих контроллерах включены и приёмник и передатчик.

void InitSSC_PDC(void)
{
AT91C_BASE_SSC->SSC_PTCR=AT91C_PDC_TXTDIS|AT91C_PDC_RXTDIS;
AT91C_BASE_SSC->SSC_RPR=RBuf0;    
AT91C_BASE_SSC->SSC_RCR=1600*4;        
AT91C_BASE_SSC->SSC_PTCR=AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;     
}

void InitSSC(void)
{
AT91PS_SSC pSSC=AT91C_BASE_SSC;
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SSC );
AT91C_BASE_PIOA->PIO_PDR = (RD1 | RK1 | RF1 | TD1 | TK1 | TF1);
AT91C_BASE_PIOA->PIO_ASR = (RD1 | RK1 | RF1 | TD1 | TK1 | TF1);
AT91C_BASE_SSC->SSC_IDR = (unsigned int) -1;
AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS;

AT91C_BASE_SSC->SSC_CMR = 0;

// Настраиваем приемник
AT91C_BASE_SSC->SSC_RCMR = AT91C_SSC_CKS_RK;
AT91C_BASE_SSC->SSC_RCMR |= AT91C_SSC_START_FALL_RF;
AT91C_BASE_SSC->SSC_RCMR|=8<<16; //8 пустых бит вначале

AT91C_BASE_SSC->SSC_RFMR = 15;
AT91C_BASE_SSC->SSC_RFMR |= AT91C_SSC_MSBF;
AT91C_BASE_SSC->SSC_RFMR |= (((4-1)<<8) & AT91C_SSC_DATNB);

// Настраиваем передатчик

AT91C_BASE_SSC->SSC_TCMR = 0x4;  // 8 не работает!!!

AT91C_BASE_SSC->SSC_TCMR |= AT91C_SSC_CKI;
AT91C_BASE_SSC->SSC_TCMR |=4<<8;    //AT91C_SSC_START_FALL_TF=4;    
AT91C_BASE_SSC->SSC_TCMR |= ((8<<16) & AT91C_SSC_STTDLY);

AT91C_BASE_SSC->SSC_TFMR = 15;
AT91C_BASE_SSC->SSC_TFMR |= AT91C_SSC_MSBF;
AT91C_BASE_SSC->SSC_TFMR |= (((4-1)<<8) & AT91C_SSC_DATNB);

AT91C_BASE_SSC->SSC_CR = AT91C_SSC_RXEN;
AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN;
AT91C_BASE_SSC->SSC_CMR = 16;
}
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Sep 28 2006, 11:45
Сообщение #4


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

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



сори ДУП

Сообщение отредактировал _4afc_ - Sep 28 2006, 11:48
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 14:08
Рейтинг@Mail.ru


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