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

Вопрос по SPI.

Добавлено: Чт сен 20, 2018 22:18:10
prw07
Изучаю работу 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; 
В архиве проект если шо.

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

Добавлено: Чт сен 20, 2018 22:46:35
roman.com
prw07 писал(а):Записываю в SPDR данные (ну типа получил их от другого устройства) и тутже хочу их перенести в другой порт через переменную.
"Тут же" не получится... Надо дождаться окончания передачи/приёма данных.
SPI.jpg
(225.47 КБ) 220 скачиваний
Цитата: "После того как один байт был полностью сдвинут, устанавливается флаг окончания передачи 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
ARV
при этом не получится и "те же самые" данные считать - после окончания передачи там будут принятые данные.

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

Добавлено: Пт сен 21, 2018 08:20:17
prw07
Спасибо.
Короче, так как я хотел не получиться. Надо передавать данньіе.

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

Добавлено: Сб сен 29, 2018 11:18:29
Dream555
если мне память не изменяет, то это не очень хорошо ставить паузу для получения данных. Там надо проверку по флагу ...

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

Добавлено: Пн окт 15, 2018 12:47:52
COKPOWEHEU
[uquote="prw07",url="/forum/viewtopic.php?p=3461252#p3461252"]Записываю в SPDR данные (ну типа получил их от другого устройства) и тут же хочу их перенести в другой порт через переменную.[/uquote]
"Получил от другого устройства"? По тому же 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
prw07
https://radiokot.ru/forum/viewtopic.php?f=57&t=157695 сюда загляните, пожалуйста.