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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 конец клока SPI
RadiatoR
сообщение Sep 17 2016, 13:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Всем доброго дня.
Завожу MRF24J40. SPI.
Аппаратного CS нету, вылезаем софтверно.

Ногу CS опускаю в начале записи, поднимаю по прерыванию RXNEIE. Все вроде бы нормально (процесс записи в регистр 0x18 значения 0x98):

Но есть проблема - как оказалось запись в чип происходит по спаду клока, пока еще выбран CS. Точнее захват может и по фронту происходит, но запись точно по спаду. И тут возникает проблема - прерывание происходит на половине последнего клока - то есть его фронт уже был, прошла четверть периода клока и прерывается. Соответственно я поднимаю CS. Но как показали опыты если его поднять до того, как клок упадет вниз запись не произведется.

Собственно вопрос - как оптимально сдвинуть CS на половину периода клока? То есть после того, как он опустится.

Спасибо.

PS
Очень интересно - проблема решилась сама собой с увеличением частоты. На скриншоте частота = 24МГц/256. поставил делитель 64 и CS сдвинулся более чем на пол периода

Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 17 2016, 13:10
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Поднимайте ногу CS по SPI_SR_BSY.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Sep 17 2016, 13:57
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Лично у меня - вот такая конструкция:
Код
    GPIOA->BSRR = (GPIO_BSRR_BR_2 | GPIO_BSRR_BR_6);    // nCS DN, D/C# DN
    SPI1->DR = command;
    while (!(SPI1->SR & SPI_SR_TXE));
    while (SPI1->SR & SPI_SR_BSY);
    GPIOA->BSRR = GPIO_BSRR_BS_2;        // nCS UP


Магия? Возможно. Но без первой инструкции ожидания порой пролетал мимо передачи и пин /CS дёргался вниз-вверх за 2 такта, а уже после этого начиналась передача. Третью строку можно убрать, но на свой страх и риск.

Сообщение отредактировал AlanDrakes - Sep 17 2016, 13:59
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 17 2016, 14:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(RadiatoR @ Sep 17 2016, 16:05) *
Очень интересно - проблема решилась сама собой с увеличением частоты. На скриншоте частота = 24МГц/256. поставил делитель 64 и CS сдвинулся более чем на пол периода

Ничего интересного. Просто обработчик прерывания не успел дёрнуть CS раньше. Сегодня не успел, а завтра успеет. Следовательно, не вариант.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 17 2016, 18:29
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



2ViKo не вариант - не использую вайлы

2scifi при частоте 375к у ядра на периода клока 128 тактов. Вполне возможно, что задержался. Но это был его самый "быстрый путь" по коду. так что врядли будет быстрее.

А вот mrf так и не завелась толком... Отправляет вроде, прерывание на отправку генерит, в статусе все ок. А вот приемник пару раз с антенной на прерывание входил и все. Никак не заработает. И мощности добавил и антенну поменял.. Не понятно что не так
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 18 2016, 04:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(RadiatoR @ Sep 17 2016, 19:05) *
Собственно вопрос - как оптимально сдвинуть CS на половину периода клока? То есть после того, как он опустится.

Использовать другой режим SPI (биты CPOL, CPHA).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 18 2016, 05:59
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(RadiatoR @ Sep 17 2016, 21:29) *
2ViKo не вариант - не использую вайлы

В прерывании от TXE (или от RXNE, если очень хочется) дождитесь BSY, не много потеряете. Если внимательно рассмотрите RM, увидите на картинках, что да как.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 18 2016, 08:20
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Цитата(jcxz @ Sep 18 2016, 07:41) *
Использовать другой режим SPI (биты CPOL, CPHA).


Это не то. Они не дали того эффекта

Цитата(ViKo @ Sep 18 2016, 08:59) *
В прерывании от TXE (или от RXNE, если очень хочется) дождитесь BSY, не много потеряете. Если внимательно рассмотрите RM, увидите на картинках, что да как.

Ждать тоже не хочется - все таки это не хороший тон ждать в прерывании. В любом случае я добился своего.
А по поводу mrf - походу антенна не заходит в кабель. Кабель и антенну купил в разных местах и промазал походу.
вот такой набор:


Ее подергаешь бац - несколько пакетов подряд примет, потом о5 пропадает. Короче антенну заменю.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 18 2016, 09:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(RadiatoR @ Sep 18 2016, 11:20) *
Ждать тоже не хочется - все таки это не хороший тон ждать в прерывании.

Глупости.
Нехороший тон - это делать то, чего не понимаешь.
Если же понимание присутствует, то можно и ждать в прерывании, и рвать шаблоны слабонервным ещё тысячью способов, одновременно указывая любителям хорошего тона, куда им можно пойти.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 18 2016, 09:23
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(RadiatoR @ Sep 18 2016, 11:20) *
Ждать тоже не хочется - все таки это не хороший тон ждать в прерывании. В любом случае я добился своего.

Да, увеличив скорость, добились. А когда уменьшите, косяк вылезет назад. Если будете проверять BSY, то вам и ждать не придется на высокой скорости, он уже выключится. А на низкой спасет.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 18 2016, 11:45
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Цитата(ViKo @ Sep 18 2016, 12:23) *
Да, увеличив скорость, добились. А когда уменьшите, косяк вылезет назад. Если будете проверять BSY, то вам и ждать не придется на высокой скорости, он уже выключится. А на низкой спасет.

Уменьшать и не планирую - низкую ставил пока отлаживал. Вообще попробую с BSY. Если на осцилле будет такая же картина может и оставлю.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 18 2016, 12:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вообще, конечно, плохо, что нет у STM32 нужного прерывания. Похожая история с I2C: непрерывный обмен только на прерываниях без ожидания флагов часто сделать невозможно.
Если хочется совсем по феншую, можно привлечь таймер для доп. задержки. Но, боюсь, в данном случае это не даст никакого выигрыша по сравнению с простым и недолгим ожиданием флага BUSY.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 18 2016, 13:29
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



В общем я гляну как будет себя вести ожидание BSY и сколько тактов оно на себя сожрет и посмотрю

Вообще у стм порой странности бывают. Например с той же ножкой NSS. Она, конечно, нужна не для Chip select, но могли же добавить в нее такую возможность... В конце концов очень часто бывает, что на 1 SPI вешают только 1 девайс, а тут такая засада...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 18 2016, 14:01
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(RadiatoR @ Sep 18 2016, 14:20) *
Это не то. Они не дали того эффекта

Что именно "не то"?
Судя по картинке у Вас CPOL=0, CPHA=0. Т.е. - Вы настроили защёлкивание данных по фронту SCLK. И в то же время пишете:
Цитата(RadiatoR @ Sep 17 2016, 19:05) *
как оказалось запись в чип происходит по спаду клока,

Так всё-таки: чип MRF24J40 защёлкивает данные по фронту или по спаду??? Неужели на этот чип нет доки? Или читать не умеете?
Если всё-таки по спаду, то CPOL=1, CPHA=0 - должно решить проблему.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 19 2016, 10:08
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Цитата(jcxz @ Sep 18 2016, 17:01) *
Или читать не умеете?


К вашему сведению не всем людям нравится читать такие "наезды". Прошу в отношении меня впредь от них воздержаться.

А по сабжу - как происходит запись/захват я описал еще в первом посте. Захват происходит по фронту. Все как полагается. Но, видимо, захват значения (при записи в регистры mrf) происходит по фронту, а запись этого значения по спаду, при включенном CS. Опыты показали именно такое поведение.
CPOL и CPHA созданы для другого.
Go to the top of the page
 
+Quote Post

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

 


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


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