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

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение 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;
}
но как сделать по правильному?
Реклама
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

Си я не понимаю, но аппаратный SPI работает так: Мастер дает сигнал CS Слейву, и посылает данные (или считывает данные, смотря какое устройство). Слейв тупо ждет сигнала CS от Мастера, который может поступить в любой момент, чтобы считать команду и потом принять данные (или отправить данные)
Реклама
Ответить

Вернуться в «AVR»