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

 
 
7 страниц V  « < 4 5 6 7 >  
Reply to this topicStart new topic
> stm32f407 SPI обнаружил косяк
Огурцов
сообщение Jan 12 2013, 07:43
Сообщение #76


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



А что с атмелом не так ? у мег такой ерунды не было.

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 12 2013, 08:13
Сообщение #77


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

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



Цитата(AHTOXA @ Jan 11 2013, 23:30) *
Кстати, именно с этой микросхемой я и имел проблемы "раннего отпускания чипселекта".

laughing.gif (с учетом вышесказанного)

Цитата(Огурцов @ Jan 12 2013, 10:43) *
А что с атмелом не так ? у мег такой ерунды не было.

Еще со времен какой-то 8952 нашел в даташите кучу ошибок, послал сообщение, получил ответное "у нас все хорошо". Пришлось по пунктам водить носом по ошибкам.
Потом, не нравилось регулярное изменение названия микросхем. Разрабатываешь с одной, потом, глядь, такой уже и нет! Зато есть другая, почти такая же, только с перламутровыми пуговицами.

Цитата(AHTOXA @ Jan 11 2013, 23:30) *
Я ж вам аргументировал.

Вот вы показали две осциллограммы, для малой тактовой частоты, и для большой. И обе работают, верно? Хотя на первой выбор оканчивается до окончания такта. Сами себе аргументировали.

Цитата(Огурцов @ Jan 12 2013, 04:12) *
Если считаете, что код кривой, поясните чайнику, как надо.

Как в сообщении №60. Нужно после каждой записи в регистр DR производить чтение из него же. Но, так как есть параллельный регистр Tx buffer, то в начале записать можно два раза подряд. Тогда в конце и прочитать придется два раза подряд. Помнить, какой записи соответствует какое чтение.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 12 2013, 09:01
Сообщение #78


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Jan 12 2013, 13:40) *
Пусть будет так. Только в даташите по ссылке для RDSR у них нарисовано уже 16 тактов. rolleyes.gif

А, ну значит выяснили, что и для чтения тоже нужны все такты. sm.gif
Или "поменяли техпроцесс". Уверены, что ваша M25PE40 не такая? А в следующей ревизии?
Кстати, вот картинка из даташита на M25PE40:
Прикрепленное изображение

Как видите, CS нужно удерживать до окончания клоков. Попробуйте снизить частоту SPI, и посмотрите, что получится.
Цитата(ViKo @ Jan 12 2013, 14:13) *
Вот вы показали две осциллограммы, для малой тактовой частоты, и для большой. И обе работают, верно? Хотя на первой выбор оканчивается до окончания такта. Сами себе аргументировали.

Так оно же просто "в воздух" работало! С реальными микросхемами на маленькой скорости - могли бы быть проблемы (в частности, с AT25640). Об этом я и талдычу уже который пост подрядsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 12 2013, 09:35
Сообщение #79


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

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



Цитата(AHTOXA @ Jan 12 2013, 12:01) *
Как видите, CS нужно удерживать до окончания клоков. Попробуйте снизить частоту SPI, и посмотрите, что получится.

Возможно. Даташит скачал только что, по первой же ссылке гугля. От вашего отличается. Но вопрос не в этом.
Прикрепленное изображение

Здесь отмеряется окончание S от фронта С (и составляет 5 или 10 ns, в зависимости от техпроцесса). По этому же фронту С данные и читаются.
Попробую поэкспериментировать с частотами. Я выдавал предельно допустимые, и голова не болела.
Тем более, что помимо проверки флага и перехода, и до подготовки и выдачи конца чип селекта еще производится чтение из DR и сохранение в нужной переменной.
В ближайшее время у меня по SPI нужно будет управлять поочередно то ЦАП, то сдвиговым регистром, по разным фронтам тактового сигнала. Если будет что-то любопытное, доложу.
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 13 2013, 15:44
Сообщение #80


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата
I've never used slave mode without DMA but i will present the code that works well without DMA for master mode. I think it should also work in slave mode with slight modification.

Sending a byte in master mode:

void Send_SPI_Byte( u8 B )
{
while (SPI1->SR & SPI_SR_BSY);
while (!(SPI1->SR & SPI_SR_TXE));
SPI1->DR = b;
while (SPI1->SR & SPI_SR_BSY);
while (!(SPI1->SR & SPI_SR_RXNE));
tmp8 = SPI1->DR;
}

receivng a byte in master mode:

The above function may look strange especially because of the flags SPI_SR_BSY that are checked twice. However, the functions NEVER worked when i writte them in other way.

Microcontrollers > STM32 > Receiving SPI data through DMA - STM32 internal hardware error
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2013, 16:15
Сообщение #81


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Tahoe @ Jan 13 2013, 21:44) *
Цитата
SPI1->DR = b;
while (SPI1->SR & SPI_SR_BSY);
while (!(SPI1->SR & SPI_SR_RXNE));


Судя по заглавному сообщению этого топика, проверка BSY здесь совершенно лишняяsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 13 2013, 22:43
Сообщение #82


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(AHTOXA @ Jan 13 2013, 20:15) *
Судя по заглавному сообщению этого топика, проверка BSY здесь совершенно лишняяsm.gif

Не совсем так:
Цитата
I've never used slave mode without DMA but i will present the code that works well without DMA for master mode.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 14 2013, 05:28
Сообщение #83


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Понятно, что этот код работает. Но точно так же он будет работать и без проверки BSY.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 14 2013, 06:56
Сообщение #84


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Речь про "сакральный смысл" флага BSY. На днях, как будет время, проверю его вариант.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 14 2013, 07:36
Сообщение #85


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Так как раз его вариант и не раскрывает "сакральный смысл" флага BSY, ибо будет работать точно также и без проверок BSY! sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 14 2013, 08:30
Сообщение #86


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

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



Цитата(Tahoe @ Jan 14 2013, 09:56) *
Речь про "сакральный смысл" флага BSY. На днях, как будет время, проверю его вариант.

Смысл BSY - показать, что автомат последовательной пересылки работает. Смысл его использовать... нет, не вижу. sm.gif
Потому что флаги, показывающие, что буферы передачи и приема не свободны, логичнее использовать в программе.

Возможно, для I2S найдется смысл его использовать.
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 14 2013, 09:05
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(ViKo @ Jan 14 2013, 12:30) *
Смысл BSY - показать, что автомат последовательной пересылки работает. Смысл его использовать... нет, не вижу. sm.gif
Потому что флаги, показывающие, что буферы передачи и приема не свободны, логичнее использовать в программе.

Так вот как раз для управления SS, интересует именно состояние автомата, а не буферов. wink.gif
Другой вопрос, что BSY, который как раз и должен показывать состояние автомата, работает как-то не так.

Собственно, чего гадать-то, когда есть мануал:
Цитата(Handling data transmission and reception)
For some configurations, the BSY flag can be used during the last data transfer to wait until the completion of the transfer.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 15 2013, 12:57
Сообщение #88


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

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



Цитата(Tahoe @ Jan 14 2013, 12:05) *
Так вот как раз для управления SS, интересует именно состояние автомата, а не буферов. wink.gif
Другой вопрос, что BSY, который как раз и должен показывать состояние автомата, работает как-то не так.

Я проделал примерно те же эксперименты, что показывал АНТОХА, только на живом SPI устройстве M25PE40, MCU STM32F207. Код следующий. Конец Chip Select перенес до последнего чтения из DR. Первая закомментированная строка (проверка TXE) никогда не используется, осталась от прошлого. А использовалась проверка RXNE или проверка BSY. Скорость тоже выбиралась из двух вариантов: самая медленная (60 MHz / 256) и максимально допустимая (60 MHz / 4 = 15 MHz).
Код
uint32_t SFMID_read(void) {
  SMSS_ON();
  uint32_t id = 0;
  SPI1->DR = SFM_RDID;            // послать команду "RDID"
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождение передатчика
  SPI1->DR = SFM_DUMMY;            // послать пустой байт
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байт в приемнике
  id = SPI1->DR;                // High Impedance
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождение передатчика
  SPI1->DR = SFM_DUMMY;            // послать пустой байт
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байт в приемнике
  id = SPI1->DR << 16;                // Manufacturer
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождение передатчика
  SPI1->DR = SFM_DUMMY;            // послать пустой байт
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байт в приемнике  
  id |= SPI1->DR << 8;                // Memory type
  // while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождение передатчика  
  // while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байт в приемнике
  while (SPI1->SR & SPI_SR_BSY);    // ждать, если SPI занят
  SMSS_OFF();
  id |= SPI1->DR;                // Memory capacity
  // while (SPI1->SR & SPI_SR_BSY);    // ждать, если SPI занят
//  SMSS_OFF();
  // Test = id;
  return id;
}

Выводы у меня следующие.
Во всех 4-х случаях работоспособность сохраняется, идентификатор памяти читается правильно. Даже если тактовый сигнал продолжается после окончания сигнала выбора в случае малой скорости.
Проверки флагов RXNE и BSY совпадают по времени с точностью, с какой мог видеть осциллограмму.
На первой картинке - малая скорость, проверка RXNE. На второй картинке - большая скорость, проверка BSY. Есть и остальные варианты.
Прикрепленное изображение
Прикрепленное изображение

Коль уж такое окончание выбора нормально работает, то конец выбора после чтения никаких проблем не создаст.
Упрямцы могут продолжать твердить свое, но уже без моего участия.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 15 2013, 13:41
Сообщение #89


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Приведённый вами код, как частный случай, ни о чём не говорит и ничего не доказывает... wink.gif

Сообщение отредактировал HHIMERA - Jan 15 2013, 13:42
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 15 2013, 13:57
Сообщение #90


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Jan 15 2013, 18:57) *
Коль уж такое окончание выбора нормально работает, то конец выбора после чтения никаких проблем не создаст.

Здесь необходимо одно существенное уточнение: работает с конкретным экземпляром конкретной микросхемы памяти. Что совершенно не означает, что это будет работать всегда и со всеми микросхемами.
С другой стороны, имеющийся у меня негативный опыт неопровержимо доказывает, что с таким подходом могут быть проблемы.
Цитата(ViKo @ Jan 15 2013, 18:57) *
Упрямцы могут продолжать твердить свое, но уже без моего участия.

Ну наконец-то вы перестанете смущать неокрепшие умы начинающих читателей.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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