Обсуждаем контроллеры компании Atmel.
Ответить

Вопрос по SPI.

Чт сен 20, 2018 22:18:10

Изучаю работу SPI на AVR. Для начала элементарно хочу из регистра данных SPDR достать данные. На AVR Studio все работает. Proteus отказывается. В чем подвох ?
Записываю в SPDR данные (ну типа получил их от другого устройства) и тутже хочу их перенести в другой порт через переменную.
AtMega8.
Код:
(DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
.....
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 250,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
SPSR=(0<<SPI2X);
....
SPDR=0xAA;
data=SPDR;
PORTD=data;


В архиве проект если шо.
Вложения
SPI.7z
(23.44 KiB) Скачиваний: 147

Re: Вопрос по SPI.

Чт сен 20, 2018 22:46:35

prw07 писал(а):Записываю в SPDR данные (ну типа получил их от другого устройства) и тутже хочу их перенести в другой порт через переменную.

"Тут же" не получится... Надо дождаться окончания передачи/приёма данных.
SPI.jpg
(225.47 KiB) Скачиваний: 207

Цитата: "После того как один байт был полностью сдвинут, устанавливается флаг окончания передачи SPIF."

SPDR=0xAA;
while(!(SPSR & (1<<7))); // ждём флаг окончания передачи SPIF.
data=SPDR;
PORTD=data;

Ну или тупо поставить задержку... ))

SPDR=0xAA;
delay_ms(10); // ждём окончания передачи.
data=SPDR;
PORTD=data;

Re: Вопрос по SPI.

Пт сен 21, 2018 06:42:51

при этом не получится и "те же самые" данные считать - после окончания передачи там будут принятые данные.

Re: Вопрос по SPI.

Пт сен 21, 2018 08:20:17

Спасибо.
Короче, так как я хотел не получиться. Надо передавать данньіе.

Re: Вопрос по SPI.

Сб сен 29, 2018 11:18:29

если мне память не изменяет, то это не очень хорошо ставить паузу для получения данных. Там надо проверку по флагу ...

Re: Вопрос по SPI.

Пн окт 15, 2018 12:47:52

Записываю в SPDR данные (ну типа получил их от другого устройства) и тут же хочу их перенести в другой порт через переменную.

"Получил от другого устройства"? По тому же SPI? Если так, сначала примите данные, потом передавайте.
Код:
uint8_t SPI_send(uint8_t data){
  SPDR = data;
  while( !(SPSR & (1<<SPIF))){} //ни в коем случае не (1<<7)! Для пустого тела цикла не ставьте точку с запятой, это чревато ошибками. Либо пустые скобки как у меня, либо continue;
  return SPDR;
}
...
uint8_t temp = SPI_send(0); //принимаем данные
SPI_send( temp ); //передаем то что принято

В целом, непонятна задача. Вы хотите одни и те же данные послать двум получателям? А что мешает посылать одновременно? Или по очереди, но сохраняя в переменной?
Код:
SPI_send( data );
SPI_send( data );

Re: Вопрос по SPI.

Пн окт 15, 2018 12:55:31

https://radiokot.ru/forum/viewtopic.php?f=57&t=157695 сюда загляните, пожалуйста.
Ответить