реклама на сайте
подробности

 
 
> SPI в СЛЭЙВ режиме - ничего не передет
Андрей К. Ф.
сообщение May 23 2008, 13:48
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 23-05-08
Пользователь №: 37 753



Пишу в IARе следующее:

/******************************************************************************/
void SPI_init()
{
volatile char c;
SPCR = (1<<SPIE)|(1<<SPE)|(0<<DORD)|(0<<MSTR)|(0<<CPOL)|(0<<CPHA);
c = SPSR;
c = SPDR;
}


//******************************************************************************
#pragma vector=SPI_STC_vect
__interrupt void SPI_STC_vect_handler()
{
char in_byte;
in_byte = SPDR;

//...

SPDR = param.bt[0];

// ....
}

В итоге все ВХОДЯЩИЕ байты принимаются на ура.
Но передает SPI (по линии MISO) не то, что я ему говорю, а то что в него пришло от мастера в прошлом цикле передачи (проверял осциллографом).
Подскажите пожалуйста в чем проблема???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение May 23 2008, 16:14
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Андрей К. Ф. @ May 23 2008, 12:48) *
В итоге все ВХОДЯЩИЕ байты принимаются на ура. Но передает SPI (по линии MISO) не то, что я ему говорю, а то что в него пришло от мастера в прошлом цикле передачи (проверял осциллографом)


Данные на передачу вам надо записывать в регистр SPDR ДО чтения пришедших данных (и в вашем случае, как можно быстрее, пока новая передача не началась, поскольку нет двойной буферизации, как на приём), т.е. примерно так
Код
__interrupt void SPI_STC_vect_handler()
{
  char in_byte;
  SPDR = param.bt[0];
  ...
  in_byte = SPDR;
  ....
}

Цитата
When configured as a Slave, the SPI interface will remain sleeping with MISO tri-stated as long
as the SS pin is driven high. In this state, software may update the contents of the SPI Data
Register, SPDR, but the data will not be shifted out by incoming clock pulses on the SCK pin
until the SS pin is driven low
. As one byte has been completely shifted, the end of Transmission
Flag, SPIF is set. If the SPI Interrupt Enable bit, SPIE, in the SPCR Register is set, an interrupt
is requested. The Slave may continue to place new data to be sent into SPDR before reading
the incoming data
. The last incoming byte will be kept in the Buffer Register for later use.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Андрей К. Ф.
сообщение May 26 2008, 05:43
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 23-05-08
Пользователь №: 37 753



Большое спасибо, сейчас буду пробовать
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016