Есть один МК AVR, который работает в режиме SPI Slave. Я собирал с него данные с помощью программатора USBTiny, который умеет посылать-получать произвольные данные, а не только прошивать. Всё работало хорошо.
Теперь у меня есть второй МК - atmega8. И теперь она, а не программатор, будет являться SPI Master, но тут возникла проблема - первый байт пакета приходит нормально, а остальные портятся по пути, причём иногда (но редко) всё же проскакивают нормальные данные. Поскольку первый контроллер нормально работал с программатором, думаю проблема во втором МК.
Я пробовал понижать частоту SPI до минимума и укорачивать провода (даже если провода между МК в 2 раза короче, чем от программатора ничего не меняется).
Вот мой код инициализации SPI:
PORTB |= _BV(2);
DDRB |= _BV(5) | _BV(3) | _BV(2); // SCK, MOSI, SS
SPCR = _BV(SPIE) | _BV(SPE) | _BV(MSTR) | _BV(SPR1) | _BV(SPR0);
Вот а вот код всех обработчиков:
unsigned char spi_buffer[256];
unsigned char spi_buffer_cursor;
unsigned char spi_message_size;
volatile unsigned char spi_ready;
ISR(SPI_STC_vect) {
spi_buffer[spi_buffer_cursor++] = SPDR;
if (spi_buffer_cursor < spi_message_size) {
_delay_ms(1); // Чтобы первый МК успел положить данные в свой SPDR, потом уменьшу задержку
SPDR = spi_buffer[spi_buffer_cursor];
} else {
spi_ready = 1;
}
}
void spi_read_data() {
PORTB &= ~_BV(2);
spi_message_size = 10; // Сколько байт я хочу получить
spi_buffer_cursor = 0;
memset(&spi_buffer, 0, sizeof(spi_buffer));
spi_ready = 0;
SPDR = 0;
while (!spi_ready);
PORTB |= _BV(2);
}
Режимы работы SPI обоих контроллеров точно совпадают (иначе бы и первый байт не принялся бы).
В чём может быть проблема?
Раздел: AVR