Страница 1 из 1

SPI, Atmega8 и задержки

Добавлено: Вт мар 26, 2013 20:38:35
balmer
Добрый день. Не понимаю такой момент с SPI протоколом.

Вот скажем есть мастер который быстро посылает данные.
И есть 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;
}
но как сделать по правильному?

Re: SPI, Atmega8 и задержки

Добавлено: Вт мар 26, 2013 21:02:52
SmarTrunk
Си я не понимаю, но аппаратный SPI работает так: Мастер дает сигнал CS Слейву, и посылает данные (или считывает данные, смотря какое устройство). Слейв тупо ждет сигнала CS от Мастера, который может поступить в любой момент, чтобы считать команду и потом принять данные (или отправить данные)