Вопрос по SPI.

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение 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; 
В архиве проект если шо.
Вложения
SPI.7z
(23.44 КБ) 170 скачиваний
Реклама
Друг Кота
Сообщения: 9179
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение 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;
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

Спасибо.
Короче, так как я хотел не получиться. Надо передавать данньіе.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 99
Зарегистрирован: Сб апр 28, 2018 20:29:42

Сообщение Dream555 »

если мне память не изменяет, то это не очень хорошо ставить паузу для получения данных. Там надо проверку по флагу ...
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение 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 );
Реклама
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

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

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