|
Готовность SPI, как определить? |
|
|
|
May 20 2008, 08:23
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(777777 @ May 20 2008, 12:00)  Как определить, что в SPDR можно писать очередной байт? SPIF устанавливается после передачи, но после обработки сбрасывается, и при включении там 0. А есть ли какой бит, по которому можно определить, что передача в данный момент не идет? Т.е. который устанавливается сразу после записи в SPDR? ИМХО, ни как, но если очень надо, заведите свой флаг который будете выставлять перед записью в SPDR и сбрасывать после чтения SPIF из SPSR.
|
|
|
|
|
May 20 2008, 09:38
|
Местный
  
Группа: Участник
Сообщений: 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 всё правильно симулирует.
|
|
|
|
|
May 20 2008, 13:01
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(777777 @ May 20 2008, 14:45)  Вот я и хочу узнать, когда она закончится. Не используя прерываний, по готовности. Похоже, только читая SPIF и ожидая когда он исчезнет.
А хотелось бы наоборот: перед записью узнать что предыдущая передача уже завершилась, записать SPDR и продолжить заниматься другими делами. "перед записью узнать что предыдущая передача уже завершилась" Как? "читая SPIF". Прочитали - узнали - не завершилась. Что делать? "читая SPIF и ожидая когда он исчезнет". Ну или прерывание скажет, когда.
|
|
|
|
|
May 20 2008, 13:41
|

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 биты?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 20 2008, 16:26
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ May 20 2008, 17:41)  А по-моему, наоборот, флаг SPIF появится, когда закончится передача текущего байта. Для самого первого раза (после подачи питания) можно передать фиктивную посылку, чтобы взвести флаг SPIF. конечно после окончания передачи, и поэтому буз внешнего флага здесь не обойтись. Ну типа так он устроен... Цитата Откуда вы взяли про 34 цикла Ну это почти правда, только там не 34 ну и для других делителей будет другое количество тактов, сам пробовал в железе только для X2 режима, но с Вами поделюсь инфой только после того как Вы раскажите/покажите вариант про который мы долго и упорно спорили(PWM на 24 канала)
|
|
|
|
|
May 20 2008, 16:55
|

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 (:-)? Напомните, подзабыл я, и вроде бы с вами не спорил, тем более долго и упорно, поскольку вы были не в теме.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 20 2008, 17:29
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ May 20 2008, 20:55)  Я и так знаю, что там не 34. Как устроен спи внутри, к сожалению, не знаю. Что такое внешний флаг, не понимаю, о чём вы? просто переменная в памяти которая будет говорить всем что SPI в данный момент занят Цитата То, что я сказал насчёт первого фиктивного байта правильно, но можно обойтись и без его передачи. А вот здесь я уже недопонял... Цитата Если уж взялись отвечать за другого, так и отвечайте нормально, а не наводите тень на плетень (:-). Повторю ещё раз: "Откуда вы взяли про 34 цикла, ссылочкой не поделитесь? И что такое SPCR=0x50, в нём вроде используются только 0, 6 и 7 биты?" Sulking, are we (:-)? Напомните, подзабыл я, и вроде бы с вами не спорил, тем более долго и упорно, поскольку вы были не в теме. Да ни вапрос, в отличии от Вас готов просто показать код...  Код 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 режима...
|
|
|
|
|
May 20 2008, 19:36
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(singlskv @ May 20 2008, 21:29)  Код ... __asm__ __volatile__ ("nop"); // бездельничаем пока передается байт но это для X2 режима... Так весь смысл в том, чтоб вместо бездельничья занять контроллер чем то более полезным. Например при подключении индикатора по SPI, где ответа нет. Я делаю с передачей холостого байта при неактивном /cs. Положил в SPDR и пошел готовить следующие данные. Как обойтись без холостой записи надеюсь подскажет GM. А вообще в этом плане хорошо использовать USART в тех контроллерах, в которых есть этот режим. Там получается буферизация записи и можно по паре байт отправлять за один раз. Ну и с флагами там все не так запущено...
|
|
|
|
|
May 20 2008, 20:04
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Qwertty @ May 20 2008, 23:36)  Так весь смысл в том, чтоб вместо бездельничья занять контроллер чем то более полезным. Ну... это был просто пример для разяснения того как работает SPI, хотя пример был из рабочей проги ....  Ну типа иногда(если нет других дел), выгоднее просто ничего не делать... Цитата Например при подключении индикатора по SPI, где ответа нет. Я делаю с передачей холостого байта при неактивном /cs. А вот это мне все-таки кто-нить объясните, что за холостой байт который Многим нужен ?
|
|
|
|
|
May 20 2008, 21:50
|
Местный
  
Группа: Свой
Сообщений: 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_; // Завершения не ждем. }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|