Цитата(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;
}