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

 
 
> 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
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 29)
scifi
сообщение Sep 19 2016, 10:35
Сообщение #16


Гуру
******

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



Цитата(RadiatoR @ Sep 19 2016, 13:08) *
CPOL и CPHA созданы для другого.

Топор создан для того, чтобы рубить, но это не значит, что им невозможно забить гвоздь.
Так что "создан для другого" - это аргумент приблизительно такого же качества, как и ссылки на "хороший тон" biggrin.gif
Короче, если без иносказаний, то просто попробуйте. Результаты легко могут вас удивить.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 19 2016, 10:58
Сообщение #17


Местный
***

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



Прочтите внимательнее мое сообщение:
Цитата(RadiatoR @ Sep 18 2016, 11:20) *
Они не дали того эффекта


Писал я в прошлом времени - значит попробовал. Перестало вообще работать.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 19 2016, 11:23
Сообщение #18


Гуру
******

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



"Не верю" (С)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2016, 11:38
Сообщение #19


Гуру
******

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



Цитата(RadiatoR @ Sep 19 2016, 16:08) *
А по сабжу - как происходит запись/захват я описал еще в первом посте. Захват происходит по фронту.

Т.е. - это не Вы писали, а Ваш клон наверное?:
Цитата(RadiatoR @ Sep 17 2016, 19:05) *
Но есть проблема - как оказалось запись в чип происходит по спаду клока, пока еще выбран CS. Точнее захват может и по фронту происходит, но запись точно по спаду.

И что такое в Вашей терминологии "запись" и "захват"? И в чём между ними разница? Думаю многим тут будет интересно.

Цитата(RadiatoR @ Sep 19 2016, 16:08) *
Все как полагается. Но, видимо, захват значения (при записи в регистры mrf) происходит по фронту, а запись этого значения по спаду, при включенном CS. Опыты показали именно такое поведение.

Что есть "запись", а что есть "захват"?
Ещё раз настоятельно советую наконец-то открыть мануал на чип, а не заниматься "опытами".

Цитата(RadiatoR @ Sep 19 2016, 16:08) *
CPOL и CPHA созданы для другого.

Интересно - для чего же? Просветите. wink.gif
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 19 2016, 13:11
Сообщение #20


Местный
***

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



Что бы лишний раз не распинаться опишу - формат работы с mrf стандартный. Работает нормально при CPOL и CHPA = 0. Мне тоже интересно почему чип отказывается производить запись по фронту.
В самом первом посте в 1 скрине я пытаюсь записать байт в регистр. Он не записывается если CS поднимается до спада клока. Если точно таким же образом прочитать данные - они выведутся по фронту клока. То есть так как и полагается. Получается либо запись (она же захват (может буфер какой внутри есть.. я не знаю)) осуществляется по спаду и чтение по фронту, либо есть какой-то буфер захвата.

CPOL и CHPA меняют режимы. Не будем придираться
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 19 2016, 13:20
Сообщение #21


Гуру
******

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



Цитата(RadiatoR @ Sep 19 2016, 16:11) *
В самом первом посте в 1 скрине я пытаюсь записать байт в регистр. Он не записывается если CS поднимается до спада клока.

Специально заглянул в даташит. Там на картинке видно, что SCK должен упасть в 0 перед подъёмом CS. Так что нарушаете. Цифры времянки не приведены (видимо, планируют позже дописать), но мне известны микросхемы, у которых то же самое, и там времянка не оставляет сомнений, что SCK должен упасть перед тем, как CS поднимется.
Опять же из даташита видно, что есть единственный правильный режим CPOL = 0, CHPA = 0, так что менять его не получится.
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 19 2016, 13:26
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(RadiatoR @ Sep 19 2016, 17:11) *
… Работает нормально при CPOL и CHPA = 0. Мне тоже интересно почему чип отказывается производить запись по фронту.
В самом первом посте в 1 скрине я пытаюсь записать байт в регистр. Он не записывается если CS поднимается до спада клока…

Только так он и будет работать (CPOL = 0: SCK to 0 when idle, CHPA = 0: The first clock transition is the first data capture edge) см. рис. 2-4, 2-5 стр. 12 DS39776C.

В даташите на этот трансивер английским по белому:"The CS pin must be held low while communicating with the MRF24J40." Ну и опять же рисунок недвусмысленно это подтверждает.

CS не должен (не может, если не хотим чудес) сниматься (0 --> 1) раньше заднего фронта (1 --> 0) последнего импульса SCK.

Хоть и опередили, но CS ↑ after SCK Edge не менее 50нс.

Сообщение отредактировал Obam - Sep 19 2016, 13:29


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 19 2016, 14:20
Сообщение #23


Местный
***

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



Вот вот. Я и говорю об этом. Всмысле про то, что если поднять CS раньше, то он не запишется. График я видел. Просто чтение нормально проходит если CS бросить раньше, а запись нет. Вот и встал вопрос об продлении CS сигнала без ожидания.

В общем что бы не разглагольствовать предлагаю закончить. Результата я добился.
Всем спасибо за помощь.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2016, 18:03
Сообщение #24


Гуру
******

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



Простой способ продлить CS дольше не прибегая к таймеру и ожиданиям: в последнем прерывании RXNEIE уменьшить длину слова до минимума и выплюнуть на передачу ещё одно слово. Если логика внутри чипа сделана прямыми руками, то это никак не повредит обмену, так как по подъёму CS битовый счётчик будет сброшен. Хотя на этот счёт лучше всё-таки уточнить по доке.
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Sep 20 2016, 12:23
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(jcxz @ Sep 19 2016, 21:03) *
Простой способ продлить CS дольше не прибегая к таймеру и ожиданиям

У меня проще - обмен идет с использованием DMA, CS управляется в прерывании от DMA контроллера, по окончании приема блока данных. К этому времени уже все передано и принято.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 20 2016, 16:58
Сообщение #26


Местный
***

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



Цитата(Шаманъ @ Sep 20 2016, 15:23) *
У меня проще - обмен идет с использованием DMA, CS управляется в прерывании от DMA контроллера, по окончании приема блока данных. К этому времени уже все передано и принято.


Через DMA я скорее всего делать не буду, но попробовать можно. Хотя бы посмотреть как себя будет CS вести.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 21 2016, 04:30
Сообщение #27


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(RadiatoR @ Sep 20 2016, 21:58) *
Через DMA я скорее всего делать не буду, но попробовать можно.

Ну и зря. Особенно, если устройство с батарейным питанием. С DMA обмен будет проходить быстрее, а следовательно, экономим немного Джоулей на работе ядра.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 21 2016, 05:02
Сообщение #28


Местный
***

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



Цитата(Alechek @ Sep 21 2016, 07:30) *
Ну и зря. Особенно, если устройство с батарейным питанием. С DMA обмен будет проходить быстрее, а следовательно, экономим немного Джоулей на работе ядра.


Не, батарейки нет никакой. Да и быстродействие особое не нужно (по крайней мере на прерываниях скорости более чем достаточно, а поднять DMA это 1-2 дня будет - для меня это дорого выйдет)
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 21 2016, 07:09
Сообщение #29


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Стандартные библиотеки не наш метод? Уважуха! beer.gif
По использованию без библиотек для начала все можно глянуть сюда
http://we.easyelectronics.ru/STM32/primery...-bibliotek.html

А так все просто:

Для STM32F10x
Код
void DmaXfer(void const * txbuf,
             void       * rxbuf,
             int len)
{
  DMA1_Channel2->CCR = 0;
  DMA1_Channel3->CCR = 0;
  
  DMA1->IFCR = DMA_IFCR_CGIF2;
  
  DMA1_Channel2->CPAR = (uint32_t)&SPI1->DR; //DR Base
  DMA1_Channel2->CMAR = (uint32_t)rxbuf;
  DMA1_Channel2->CNDTR = len;
  
  DMA1_Channel3->CPAR = (uint32_t)&SPI1->DR; //DR Base
  DMA1_Channel3->CMAR = (uint32_t)txbuf;
  DMA1_Channel3->CNDTR = len;
  
  DMA1_Channel2->CCR = 0
                      | DMA_CCR_MSIZE_0
                      | DMA_CCR_PSIZE_0 // 16 bit
                      | DMA_CCR_MINC
                      | DMA_CCR_TCIE
                      | DMA_CCR_EN;
                        
  DMA1_Channel3->CCR = 0
                      | DMA_CCR_MSIZE_0
                      | DMA_CCR_PSIZE_0 // 16 bit
                      | DMA_CCR_MINC
                      | DMA_CCR_DIR
                      | DMA_CCR_EN;

  SPI1->CR2 |= 0
   |SPI_CR2_RXDMAEN // разрешить передачу принятых данных через DMA
   | SPI_CR2_TXDMAEN; // Разрешить принимать данные для передачи через DMA  
   ;  
  
  while (!(DMA1->ISR & (DMA_ISR_TCIF2 | 0)));
  
  return;
}
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 21 2016, 07:33
Сообщение #30


Местный
***

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



Приятно видеть людей, которые понимают в чем прелесть собственного кода без сторонних либ и ХАЛов. Спасибо.
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 - 21:05
Рейтинг@Mail.ru


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