Всё вроде делаю правильно, а нужного результата не получаю. Попробую собрать всё в кучу, и описать что получается.
Итак на данный момент код прошивки такой:
Код
#include <mega16.h>
#include <io.h>
#define DDR_SPI DDRB
#define DD_MISO PORTB.6
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << 6);
/* Enable SPI */
SPCR = 0x40;
}
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << 7)));
/* Return data register */
return SPDR;
}
void main (void){
SPI_SlaveInit();
DDRA = 0xFF;
while (1){
//SPI_SlaveReceive();
PORTA = SPDR;
}
}
Как в реальности работает этот код:1. МК запускается (светодиоды выключены)
2. Я посылаю байт на МК (светодиоды выключены)
// Т.е - по сути ничего не происходит
3. Если я делаю RESET то на светодиодах появляется переданный в пункте 2 байт (PORTA = SPDR;)
// Значит всё таки хоть и как-то криво, но байт передается
4. Если после пункта 3 (когда горят светодиоды), я посылаю ещё раз байт на МК - то всё снова гаснет, и отобразится лишь при следующем перезапуске
Ещё стоит заметить, что в коде я закомментировал и не использую процедуру ожидания завершения передачи байта (из даташита):
Код
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << 7)));
/* Return data register */
return SPDR;
}
Путем отладки - выяснил, что условие while(!(SPSR & (1 << 7))) - никогда не будет пройдено => ничего не произойдет
Вот такая вот загогулина