Доброго времени суток, возникла необходимость допилить уже существующий девайс на восьмой меге, добавив туда измерение времени с выдачей результата мастеру на ADUC836.
Проблема в том, что постоянно возникают коллизии при записи ответа в SPDR, пробовал добавлять на мастере задержки между отправляемыми байтами - безрезультатно.
Кусок кода мастера (с51) выглядит так:
set_spi_ss(1);
delay_ms(1);
// signature
cs = 'F';
EA = 0;
SPIDAT = cs;
while(ISPI == 0);
ISPI = 0;
b = SPIDAT;
EA=1;
spi_test[0] = b;
//mode
cs += 5;
EA=0;
SPIDAT = 5;
while(ISPI == 0);
ISPI = 0;
b = SPIDAT;
EA = 1;
spi_test[0] = b;
... (тут остальные байты пакета данных)
set_spi_ss(0);
delay_ms(1);
Код мастера отлажен и работает с данным девайсом (только на передачу), ЦАПом, флешкой. Полярность/фаза у обоих естественно те же самые.
Код slave'a (avrgcc) покамест вообще обрезал до безобразия, убрав запись в буфер/проверку SPCR на коллизии, оставив только "голый" ответ:
void SPI_SlaveInit(void)
{
DDRB=(1<<PINB4) | (BIT(0)) | (BIT(1)); //MISO as OUTPUT
SPCR=(1<<SPE)|(1<<SPIE); //Enable SPI && interrupt enable bit
SPDR=0x88;
}
ISR (SPI_STC_vect)
{
UCHAR c = SPDR;
SPDR = 0x55; // that's what i'm trying to send back
}
В свое время делал подобный обмен по SPI на 8051-совместимых и STM32, подобных проблем не вылезало :(.
Буду премного благодарен за любой пинок в нужном направлении.