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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> SPI1 в STM32F429 считывает 0 в младший бит
Tarbal
сообщение Jun 16 2016, 00:06
Сообщение #1


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Если не давать сброс на периферийное устройство (slave), подключенное к SPI, то у него на выходе MISO стоит твердая единица. Однако если считывать в процессор, то вместо 0xFF читается 0xFE.

Происходит ошибочное чтение нестабильно. Иногда читается правильно. Однако если к выходу SPI CLK присоединить щуп осциллографа, то правильного чтения больше не происходит. Стабильно читается 0xFE.

Я нашел в форуме ST, что такое происходит если читать данные не дожидаясь установки RXNE в единицу. Однако в моем коде я жду установки RXNE в единицу.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Jun 16 2016, 05:11
Сообщение #2


Местный
***

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



Попробуйте прочитать по флагу BSY. Вообще есть ли у вас возможность посмотреть оба канала - MISO относительно клока?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 16 2016, 05:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А какая настройка?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 16 2016, 06:06
Сообщение #4


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

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



Смотря, каким фронтом записываете и читаете. Надо внимательно изучить все варианты.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 16 2016, 07:13
Сообщение #5


Гуру
******

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



Цитата(RadiatoR @ Jun 16 2016, 08:11) *
Попробуйте прочитать по флагу BSY.

+1.
В своё время отлаживал SPI, приходилось плясать вокруг разных битов статуса. До конца не стал вникать, как оно по феншую должно быть. Получил вариант, который работает, и оставил его:
Код
SPI1_DR = 0x05;
while ((SPI1_SR & (1 << 1)) == 0) { /* wait for TXE */ }
while ((SPI1_SR & (1 << 0)) == 0) { /* wait for RXNE */ }
while ((SPI1_SR & (1 << 7)) != 0) { /* wait for !BUSY */ }
CS_DEASSERT();
return SPI1_DR;
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Jun 16 2016, 07:34
Сообщение #6


Местный
***

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



Вообще сам флаг BSY для приема использовать не правильно. Для этого и нужен RXNE. Я отлаживая SPI на LIS3DS6 при вылавливании косяков тоже его использовал, думая что он сейчас все решит. Проблема оказалась в другом.
Цитата(ЯadiatoR @ May 28 2016, 11:44) *
После записи в регистре DR оставалось 2 байта. и при следующем чтении CS устанавливался и сразу сбрасывался

И считывалось хрен знает что. Может тут тоже CS ножка на этот бит улетает и MISO в HiZ попадает? Отсюда и периодические срабатывания...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jun 16 2016, 12:37
Сообщение #7


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(RadiatoR @ Jun 16 2016, 09:11) *
Попробуйте прочитать по флагу BSY. Вообще есть ли у вас возможность посмотреть оба канала - MISO относительно клока?


Оба канала в смысле MOSI MISO? Нет как раз спалил логический анализатор. Только двухлучевой осциллограф.

Но у меня на MISO жестко стоит единица -- нет надобности. Должен всефда читать 0xFF.

Цитата(ViKo @ Jun 16 2016, 10:06) *
Смотря, каким фронтом записываете и читаете. Надо внимательно изучить все варианты.


Там всего четыре варианта. Я выбрал то, что надо периферийному устройству:
инвертированный CLK и по читать фронту. Но в моем тесте нет вариантов получить сдвиг или гонки на меняющемся в момент выборки входе даже если неправильная фаза выборки -- у меня всегда единица на входе.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Jun 16 2016, 18:56
Сообщение #8


Местный
***

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



Цитата(Tarbal @ Jun 16 2016, 15:37) *
Оба канала в смысле MOSI MISO? Нет как раз спалил логический анализатор. Только двухлучевой осциллограф.

Я когда боролся с акселерометром нашел проблему просмотрев одновременно сигналы CS, MISO, CLK.
Если есть возможность посмотрите их. У меня тоже читалось одно, а на ноге была единица - как я понял она подтягивалась осциллографом, я это по ссылке выше описывал.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 16 2016, 19:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Tarbal @ Jun 16 2016, 15:37) *
Но у меня на MISO жестко стоит единица -- нет надобности. Должен всефда читать 0xFF.

Видел такое, вроде, на SPI4 на PE2-PE6.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jun 17 2016, 11:59
Сообщение #10


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(adnega @ Jun 16 2016, 23:38) *
Видел такое, вроде, на SPI4 на PE2-PE6.


На форуме поддержки мне написали, что известная проблема, но ST не шевелится:

This is a recurrent problem, with around a dozen threads on this forum, which was never completely investigated down to the root - but I am afraid it can't be without active involvement of ST.

It might be related to the sequencing of the very first SCK clock after enabling the peripheral, i.e. whether the SCK line was in active or inactive state from the point of view of CPOL just before enabling the peripheral or so. I've seen issues of a similar nature although not quite the same, when changing CPOL/CPHA on-the-go without stopping/restarting the peripheral (it's lots of fun to find out what's going on, I can recommend it as a weekend project ;-) ). Also, one friend of mine discovered, that the SPI receiver is driven from the pin directly rather than from an internal signal (i.e. when no pin was not set as SPI-SCK AF, the receiver did not work at all).

I can't quite explain how could it be more specific to SPI1 - either through different parasitics, or different source clock (different APB)?

https://my.st.com/public/STe2ecommunities/m...urrentviews=260
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 17 2016, 12:15
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Tarbal @ Jun 17 2016, 14:59) *
На форуме поддержки мне написали, что известная проблема, но ST не шевелится:

Хоть бы в эррате упомянули.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 17 2016, 13:16
Сообщение #12


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

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



Что-то мне подсказывает, что если прочитать руководство, то окажется, что-нибудь из примечаний пользователи не выполняют.
У меня в STM32F207 переключаются режимы работы, так сначала запрещаю, изменяю, потом разрешаю. И все работает. Не думаю, что в STM32F429 сделали неработающий SPI. Не верю!
На упомянутом выше форуме поддержки сидят Кубодрочеры, похоже.

Код
void AnaDAC_send(uint16_t data)
{
  ANAS->CR1 &= ~SPI_CR1_SPE;        // запретить SPI
  ANAS->CR1 |= SPI_CR1_CPOL;        // данные стабильные на срезе \_
  ANAS->CR1 |= SPI_CR1_SPE;            // разрешить SPI

  ANSYN_ON();                        // \__
  ANAS->DR = (uint8_t)(data >> 8);    // послать биты 15 - 8
  while (!(ANAS->SR & SPI_SR_TXE));    // ждать освобождение буфера
  ANAS->DR = (uint8_t)(data);        // послать биты 7 - 0
  while (!(ANAS->SR & SPI_SR_TXE));    // ждать освобождение буфера
  // while (!(ANAS->SR & SPI_SR_RXNE)); // ждать конец передачи - нельзя!
  while (ANAS->SR & SPI_SR_BSY);    // ждать освобождение приемопередатчика
  ANSYN_OFF();                        //            __/

  ANAS->CR1 &= ~SPI_CR1_SPE;        // запретить SPI
  ANAS->CR1 &= ~SPI_CR1_CPOL;        // данные стабильные на фронте _/
  ANAS->CR1 |= SPI_CR1_SPE;            // разрешить SPI
}
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jun 17 2016, 14:47
Сообщение #13


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(ViKo @ Jun 17 2016, 17:16) *
Не думаю, что в STM32F429 сделали неработающий SPI. Не верю!


Да я тоже не верю, но уж упростил задачу до минимума. Инициализирую SPI, удерживаю периферию в сбросе (что значит на вход MISO подаю единицу).
Читаю инигда 0xFE иногда 0xFF. Подключаю осциллограф к клоку и всегда читаю 0xFE.
Каким таким чудесным образом клок влияет на достоверность чтения? В форуме объяснили этот эффект тем, что клок с ножки используется для работы приемника SPI.

Но попробую добавить while (ANAS->SR & SPI_SR_BSY);

Вы привели код для передачи. У меня с этим проблем нет. Вот прием читает нестабильно.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Jun 17 2016, 16:02
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



А у Вас что, на клоке вход и нет ни сигнала ни подтяжки? Почему подключение осциллографа влияет хоть на что-то?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jun 17 2016, 18:23
Сообщение #15


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Alex11 @ Jun 17 2016, 20:02) *
А у Вас что, на клоке вход и нет ни сигнала ни подтяжки? Почему подключение осциллографа влияет хоть на что-то?


На клоке есть сигнал клок. Представьте мастер SPI у которого MISO жестко к единице подключен. Это мой тест. Если читаем, то только 0хFF, но никак не 0xFE.
Go to the top of the page
 
+Quote Post

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

 


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


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