Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Связать 2 AT91SAM7S64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_4afc_
Понадобилось мне передавать значения переменных из одного процессора в другой.
Размер структуры - 8 байт. Частота опроса около 20000 раз в секунду.
Собирался изначально реализовать на SSC (Slave->Master):

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

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

Вообще какую реализацию для этого лучше выбрать SSC, SPI, USART ?
Повторяю данные лежат всегда с одного и тогоже адреса.
_4afc_
Цитата(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;
}
_4afc_
сори ДУП
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.