Добрый день. Не понимаю такой момент с SPI протоколом.
Вот скажем есть мастер который быстро посылает данные.
И есть slave который между приемами байтов делает определенную задержку.
Код примерно такой
Валидна ли такая последовательность?
_delay_us(100) приведет к кривой передаче данных, либо все будет нормально?
И еще вопрос тогда сразу:
Иногда у меня после power down режима SPI оказывается в какомто странном полуживом состоянии.
Хотя я перед power down выключаю его, а после power down включаю обратно.
Практически всегда помогает такая функция:
но как сделать по правильному?
Вот скажем есть мастер который быстро посылает данные.
И есть slave который между приемами байтов делает определенную задержку.
Код примерно такой
Код: Выделить всё
uint8_t spiXchange(uint8_t data)
{
SPDR = data;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
Master:
spiXchange(123)
uint8_t receiveByte = spiXchange(456)
Slave:
uint8_t cmd = spiXchange(255)
_delay_us(100)
spiXchange(777)
_delay_us(100) приведет к кривой передаче данных, либо все будет нормально?
И еще вопрос тогда сразу:
Иногда у меня после power down режима SPI оказывается в какомто странном полуживом состоянии.
Хотя я перед power down выключаю его, а после power down включаю обратно.
Практически всегда помогает такая функция:
Код: Выделить всё
void spiClear(void)
{
uint8_t storedSPSR = SPSR;
if(storedSPSR&(1<<SPIF))
{
clearError = SPDR;
}
clearError = storedSPSR;
}
