|
STM32 конец клока SPI |
|
|
|
Sep 19 2016, 10:58
|

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

|
Прочтите внимательнее мое сообщение: Цитата(RadiatoR @ Sep 18 2016, 11:20)  Они не дали того эффекта Писал я в прошлом времени - значит попробовал. Перестало вообще работать.
|
|
|
|
|
Sep 19 2016, 11:38
|
Гуру
     
Группа: Свой
Сообщений: 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 созданы для другого. Интересно - для чего же? Просветите.
|
|
|
|
|
Sep 19 2016, 13:20
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(RadiatoR @ Sep 19 2016, 16:11)  В самом первом посте в 1 скрине я пытаюсь записать байт в регистр. Он не записывается если CS поднимается до спада клока. Специально заглянул в даташит. Там на картинке видно, что SCK должен упасть в 0 перед подъёмом CS. Так что нарушаете. Цифры времянки не приведены (видимо, планируют позже дописать), но мне известны микросхемы, у которых то же самое, и там времянка не оставляет сомнений, что SCK должен упасть перед тем, как CS поднимется. Опять же из даташита видно, что есть единственный правильный режим CPOL = 0, CHPA = 0, так что менять его не получится.
|
|
|
|
|
Sep 19 2016, 13:26
|

Знающий
   
Группа: Участник
Сообщений: 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
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Sep 20 2016, 12:23
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Sep 19 2016, 21:03)  Простой способ продлить CS дольше не прибегая к таймеру и ожиданиям У меня проще - обмен идет с использованием DMA, CS управляется в прерывании от DMA контроллера, по окончании приема блока данных. К этому времени уже все передано и принято.
|
|
|
|
|
Sep 21 2016, 07:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Стандартные библиотеки не наш метод? Уважуха! По использованию без библиотек для начала все можно глянуть сюда 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; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|