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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Готовность SPI, как определить?
777777
сообщение May 20 2008, 08:00
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Как определить, что в SPDR можно писать очередной байт? SPIF устанавливается после передачи, но после обработки сбрасывается, и при включении там 0. А есть ли какой бит, по которому можно определить, что передача в данный момент не идет? Т.е. который устанавливается сразу после записи в SPDR?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 20 2008, 08:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(777777 @ May 20 2008, 11:00) *
Как определить, что в SPDR можно писать очередной байт? SPIF устанавливается после передачи, но после обработки сбрасывается, и при включении там 0. А есть ли какой бит, по которому можно определить, что передача в данный момент не идет? Т.е. который устанавливается сразу после записи в SPDR?

Код
uchar SpiReadWrite(uchar data)
{    // set data to send into SPI data register
    SPDR = data;
    // Wait for transmission complete
    while(!(SPSR & (1<<SPIF)));
    // return data read from SPI
    return SPDR;
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 08:23
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(777777 @ May 20 2008, 12:00) *
Как определить, что в SPDR можно писать очередной байт? SPIF устанавливается после передачи, но после обработки сбрасывается, и при включении там 0. А есть ли какой бит, по которому можно определить, что передача в данный момент не идет? Т.е. который устанавливается сразу после записи в SPDR?
ИМХО, ни как, но если очень надо, заведите свой флаг который будете
выставлять перед записью в SPDR и сбрасывать после чтения SPIF из SPSR.
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение May 20 2008, 09:38
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(777777 @ May 20 2008, 12:00) *
Как определить, что в SPDR можно писать очередной байт? SPIF устанавливается после передачи, но после обработки сбрасывается, и при включении там 0. А есть ли какой бит, по которому можно определить, что передача в данный момент не идет? Т.е. который устанавливается сразу после записи в SPDR?

Чего-то напутано. "Сразу после записи в SPDR" передача как раз идёт. Если записать в SPDR пока передача идёт, поднимется флаг WCOL. Писать в SPDR можно через 34 цикла процессора после предыдущей записи (SPCR=0x50). Раньше - синхроимпульсы будут, а данные - нет. Прямо сейчас этим занимаюсь, Мега16. AVR Studio всё правильно симулирует.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 09:57
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



SPI генерит прерывание, сигнализирующее о том, что передача завершена.
Go to the top of the page
 
+Quote Post
777777
сообщение May 20 2008, 10:45
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Maik-vs @ May 20 2008, 13:38) *
Чего-то напутано. "Сразу после записи в SPDR" передача как раз идёт.


Вот я и хочу узнать, когда она закончится. Не используя прерываний, по готовности. Похоже, только читая SPIF и ожидая когда он исчезнет.

А хотелось бы наоборот: перед записью узнать что предыдущая передача уже завершилась, записать SPDR и продолжить заниматься другими делами.

Сообщение отредактировал 777777 - May 20 2008, 11:09
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 20 2008, 10:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



А ответы нужны?
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение May 20 2008, 13:01
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(777777 @ May 20 2008, 14:45) *
Вот я и хочу узнать, когда она закончится. Не используя прерываний, по готовности. Похоже, только читая SPIF и ожидая когда он исчезнет.

А хотелось бы наоборот: перед записью узнать что предыдущая передача уже завершилась, записать SPDR и продолжить заниматься другими делами.

"перед записью узнать что предыдущая передача уже завершилась" Как? "читая SPIF". Прочитали - узнали - не завершилась. Что делать? "читая SPIF и ожидая когда он исчезнет". Ну или прерывание скажет, когда.
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 20 2008, 13:41
Сообщение #9


Ambidexter
*****

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



Цитата(777777 @ May 20 2008, 09:45) *
Похоже, только читая SPIF и ожидая когда он исчезнет

А по-моему, наоборот, флаг SPIF появится, когда закончится передача текущего байта. Для самого первого раза (после подачи питания) можно передать фиктивную посылку, чтобы взвести флаг SPIF.
Цитата(777777 @ May 20 2008, 09:45) *
А хотелось бы наоборот: перед записью узнать что предыдущая передача уже завершилась, записать SPDR и продолжить заниматься другими делами

Делаете, как описано выше, потом проверяете флаг SPIF, если он установлен, то записываете в SPDR новый байт на передачу, при этом флаг SPIF сбросится.

Цитата(Maik-vs @ May 20 2008, 08:38) *
Писать в SPDR можно через 34 цикла процессора после предыдущей записи (SPCR=0x50). Раньше - синхроимпульсы будут, а данные - нет

Откуда вы взяли про 34 цикла, ссылочкой не поделитесь? И что такое SPCR=0x50, в нём вроде используются только 0, 6 и 7 биты?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 16:26
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(=GM= @ May 20 2008, 17:41) *
А по-моему, наоборот, флаг SPIF появится, когда закончится передача текущего байта. Для самого первого раза (после подачи питания) можно передать фиктивную посылку, чтобы взвести флаг SPIF.
конечно после окончания передачи, и поэтому буз внешнего флага здесь не обойтись.
Ну типа так он устроен...
Цитата
Откуда вы взяли про 34 цикла
Ну это почти правда, только там не 34 smile.gif
ну и для других делителей будет другое количество тактов,
сам пробовал в железе только для X2 режима, но с Вами поделюсь инфой только после
того как Вы раскажите/покажите вариант про который мы долго и упорно
спорили(PWM на 24 канала) smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 20 2008, 16:55
Сообщение #11


Ambidexter
*****

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



Цитата(singlskv @ May 20 2008, 15:26) *
конечно после окончания передачи, и поэтому без внешнего флага здесь не обойтись. Ну типа так он устроен...
Ну это почти правда, только там не 34

Я и так знаю, что там не 34. Как устроен спи внутри, к сожалению, не знаю. Что такое внешний флаг, не понимаю, о чём вы? То, что я сказал насчёт первого фиктивного байта правильно, но можно обойтись и без его передачи.

Если уж взялись отвечать за другого, так и отвечайте нормально, а не наводите тень на плетень (:-). Повторю ещё раз: "Откуда вы взяли про 34 цикла, ссылочкой не поделитесь? И что такое SPCR=0x50, в нём вроде используются только 0, 6 и 7 биты?"

Цитата(singlskv @ May 20 2008, 15:26) *
сам пробовал в железе только для X2 режима, но с Вами поделюсь инфой только после того как Вы раскажите/покажите вариант про который мы долго и упорно спорили (PWM на 24 канала)

Sulking, are we (:-)? Напомните, подзабыл я, и вроде бы с вами не спорил, тем более долго и упорно, поскольку вы были не в теме.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 17:29
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(=GM= @ May 20 2008, 20:55) *
Я и так знаю, что там не 34. Как устроен спи внутри, к сожалению, не знаю.
Что такое внешний флаг, не понимаю, о чём вы?
просто переменная в памяти которая будет говорить всем что SPI в данный момент занят
Цитата
То, что я сказал насчёт первого фиктивного байта правильно, но можно обойтись и без его передачи.
А вот здесь я уже недопонял...
Цитата
Если уж взялись отвечать за другого, так и отвечайте нормально, а не наводите тень на плетень (:-). Повторю ещё раз: "Откуда вы взяли про 34 цикла, ссылочкой не поделитесь? И что такое SPCR=0x50, в нём вроде используются только 0, 6 и 7 биты?"
Sulking, are we (:-)? Напомните, подзабыл я, и вроде бы с вами не спорил, тем более долго и упорно, поскольку вы были не в теме.
Да ни вапрос, в отличии от Вас готов просто показать код... smile.gif
Код
  SPDR = OutHi;                    // старшая часть выходов
758:    6f b8           out    0x0f, r6; 15
    ...
  __asm__ __volatile__ ("nop"); // бездельничаем пока передается байт
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
  __asm__ __volatile__ ("nop");
776:    00 00           nop
  Ch2Hi = SPSR;                    // читаем для сброса флага
778:    2e b0           in    r2, 0x0e; 14
  Ch2Hi = SPDR;                    // читаем старшие 8 бит канала2
77a:    2f b0           in    r2, 0x0f; 15

но это для X2 режима...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 20 2008, 19:36
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ May 20 2008, 21:29) *
Код
    ...
  __asm__ __volatile__ ("nop"); // бездельничаем пока передается байт

но это для X2 режима...

Так весь смысл в том, чтоб вместо бездельничья занять контроллер чем то более полезным. Например при подключении индикатора по SPI, где ответа нет. Я делаю с передачей холостого байта при неактивном /cs. Положил в SPDR и пошел готовить следующие данные. Как обойтись без холостой записи надеюсь подскажет GM. А вообще в этом плане хорошо использовать USART в тех контроллерах, в которых есть этот режим. Там получается буферизация записи и можно по паре байт отправлять за один раз. Ну и с флагами там все не так запущено...
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 20:04
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Qwertty @ May 20 2008, 23:36) *
Так весь смысл в том, чтоб вместо бездельничья занять контроллер чем то более полезным.
Ну... это был просто пример для разяснения того как работает SPI,
хотя пример был из рабочей проги .... smile.gif Ну типа иногда(если нет других дел), выгоднее просто
ничего не делать...
Цитата
Например при подключении индикатора по SPI, где ответа нет. Я делаю с передачей холостого байта при неактивном /cs.
А вот это мне все-таки кто-нить объясните, что за холостой байт который Многим нужен ?
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 20 2008, 21:50
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ May 21 2008, 00:04) *
А вот это мне все-таки кто-нить объясните, что за холостой байт который Многим нужен ?

Про это выше написано - холостая посылка, только для взвода SPIF. Просто записать в SPDR что попало, при неактивных cs. Я пишу сразу после настройки SPI. Далее примерно так:
Код
void TransmitSPI(uint8_t _data_)
{
while(!(SPSR & (1<<SPIF)));
SPDR = _data_;
// Завершения не ждем.
}
Go to the top of the page
 
+Quote Post

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

 


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


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