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

 
 
> 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
Ответов
Андрей К. Ф.
сообщение May 26 2008, 07:23
Сообщение #2





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



Ситуация прояснилась. Во всем виновато низкое быстродействие AVR, который работает как слэйв.
Частота кварца 4 МГц, а частота сигнала SCK ~ 78 кГц, получается ~ 51 командный цикл. И за это время обработчик прерывания должен сформировать новый байт на передачу.
Вот такой обработчик исправно выдает 0х55 на выход:
Код
#pragma vector=SPI_STC_vect
__interrupt void SPI_STC_vect_handler()
{
  char in_byte;
  SPDR = 0x55;
  in_byte = SPDR;
}

Значит придется пожертвовать преимуществом SPI - а именно одновременной передачей в обоих направлениях.
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 26 2008, 15:44
Сообщение #3


Ambidexter
*****

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



Цитата(Андрей К. Ф. @ May 26 2008, 06:23) *
Ситуация прояснилась. Во всем виновато низкое быстродействие AVR, который работает как слэйв.
Частота кварца 4 МГц, а частота сигнала SCK ~ 78 кГц, получается ~ 51 командный цикл. И за это время обработчик прерывания должен сформировать новый байт на передачу

Объяснение притянуто за уши, поскольку после завершения обмена возникает ОДНО прерывание, которое может обрабатываться хоть до морковкина заговенья, причём здесь 51 МЦ? А после того, как прерывание обработано и запущена новая передача должно пройти 51*8=408 МЦ до нового прерывания. Вагон времени даже на си.
Цитата(Андрей К. Ф. @ May 26 2008, 06:23) *
Значит придется пожертвовать преимуществом SPI - а именно одновременной передачей в обоих направлениях

Чепуха это всё, 78 кГц это черепашья скорость для спи, ничем не надо жертвовать. Вот здесь обсуждалась передача на скорости Fclk/2, для вашего случая будет 2 МГц (ну или 1 МГц, если ведомое устройство). Обратите внимание на посты #19 и #28. Даже можно написать на си, но лучше приём-передачу оформить подпрограммой на ассемблере.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:14
Рейтинг@Mail.ru


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