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

 
 
7 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> stm32f407 SPI обнаружил косяк
AHTOXA
сообщение Jan 9 2013, 20:30
Сообщение #46


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

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



Цитата(ViKo @ Jan 10 2013, 01:47) *
по картинке

Думаю, что врёт картинка. Потому что в тексте не так. (И из опыта - тоже не так.)
BSY сделан для управления чипселектом, а чипселект надо держать до конца байта, а не до гипотетического момента, когда нам думается, что ведомое устройство уже приняло байт.
Цитата(ViKo @ Jan 10 2013, 01:47) *
У нас есть команды проверки флага, перехода, если установился, подготовки байта (CS) для засылки в порт, засылки в порт. Даже на 168 MHz тактовой это займет не один десяток ns. Пара nop, что вы добавляете, составит ~1/4 от всего количества команд.

Да ради бога, если вам нравится делать устройства, работа которых зависит от погоды на Марсе - делайте, как вам угодно. Только потом не удивляйтесь, если ваш девайс перестанет работать с новой партией микросхем. Вам два человека хором говорят, что RXNE и BSY - это не одно и то же, и что они ходили по этим граблям. Но выбор, конечно, за вами.

Цитата(ViKo @ Jan 10 2013, 01:55) *
Именно на STM32F207. НА STM32F103 разрешал отдельной командой. Иначе - никак.

У меня на 10x тоже одной командой:
Код
    RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
    SPIx->I2SCFGR &= ~SPI_I2SCFGR_I2SMOD;
    SPIx->CR2 = 0;
    SPIx->CR1 = SPI_CR1_MSTR | divisor | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | phase | cpol;

И работает. ЧЯДНТ?


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


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

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



Цитата(AHTOXA @ Jan 9 2013, 23:30) *
... а чипселект надо держать до конца байта, а не до гипотетического момента...

Не надо
Цитата
И работает. ЧЯДНТ?

Что нам скажет товарищ HHIMERA?

103-й я программировал так. Возможно, при другом сочетании можно было бы сразу разрешить.
Код
  SPI1->CR1 = SPI_CR1_SSI | SPI_CR1_BR_0 | SPI_CR1_MSTR;        // Fpclk/4
  SPI1->CR2 = SPI_CR2_SSOE;
...
  SPI_Cmd(SPI1, ENABLE);        // разрешить SPI1


Цитата(AHTOXA @ Jan 9 2013, 23:30) *
два человека хором говорят, что RXNE и BSY - это не одно и то же, и что они ходили по этим граблям

И я прошелся когда-то давным-давно, и ничего не заметил:
Код
inline uint8_t SFMByte_send(uint8_t data) {
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождения
  SPI1->DR = data;            // послать данные
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байта в приемнике (конца передачи)
//  while (SPI1->SR & SPI_SR_BSY);    // другой способ дождаться конца передачи
  return SPI1->DR;
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 9 2013, 21:00
Сообщение #48


Местный
***

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



Что вы референс не читали...
RXNE говорит только о том, что можно/нельзя забирать данные из приёмного буфера, но это, увы, не признак окончания передачи... вернее, не всегда является признаком...
По поводу SPI_CR1_SSM и SPI_CR1_SSI... всегда их устанавливал... во всей линейке STM32...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 21:02
Сообщение #49


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

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



Цитата(HHIMERA @ Jan 10 2013, 00:00) *
Что вы референс не читали...
RXNE говорит только о том, что можно/нельзя забирать данные из приёмного буфера, но это, увы, не признак окончания передачи... вернее, не всегда является признаком...

Да ну? А вы в курсе, что прием и передача происходят синхронно? Один битик выдвинули, один задвинули.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 9 2013, 21:06
Сообщение #50


Местный
***

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



Цитата(ViKo @ Jan 9 2013, 23:53) *
И я прошелся когда-то давным-давно, и ничего не заметил:
Код
inline uint8_t SFMByte_send(uint8_t data) {
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождения
  SPI1->DR = data;            // послать данные
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байта в приемнике (конца передачи)
//  while (SPI1->SR & SPI_SR_BSY);    // другой способ дождаться конца передачи
  return SPI1->DR;

Конечно не заметили...
while (!(SPI1->SR & SPI_SR_TXE)); здесь и даром не нужна... смело можно выкинуть...
И вполне логично, если возвращать return SPI1->DR, то и проверять нужно while (!(SPI1->SR & SPI_SR_RXNE)); ...
О дёргании CS тут не слова... увы...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 21:13
Сообщение #51


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

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



Цитата(HHIMERA @ Jan 10 2013, 00:06) *
О дёргании CS тут не слова... увы...

Код
inline uint32_t SFMID_read(void)
{
  SFMSel_low();
  volatile uint32_t ID = 0;
  SFMByte_send(SFM_RDID);            // Send "RDID " instruction
  ID = SFMByte_send(SFM_DUMMY);            // Read a byte from the SFM
  ID = (ID<<8) | (SFMByte_send(SFM_DUMMY));    // Read a byte from the SFM
  ID = (ID<<8) | (SFMByte_send(SFM_DUMMY));    // Read a byte from the SFM
  SFMSel_high();
  return ID;
}
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 9 2013, 21:15
Сообщение #52


Местный
***

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



Цитата(ViKo @ Jan 10 2013, 01:02) *
Да ну? А вы в курсе, что прием и передача происходят синхронно? Один битик выдвинули, один задвинули.

И о чем нам это говорит? (с)

Какая еще такая "синхронная" связь, между "выдвижением битиков" и выставлением флагов, которые еще через стопицот разных шин, с не пойми какими частотами, доставляются до ядра? В каком порядке эти флаги выставляются, какие там буферизации/задержки, не видя исходного Verilog/VHDL ( на чем там был пИсан этот SPI модуль ), можно только гадать. Или просто воспользоваться описанием в документации.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 9 2013, 21:15
Сообщение #53


Местный
***

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



Цитата(ViKo @ Jan 10 2013, 00:02) *
Да ну? А вы в курсе, что прием и передача происходят синхронно? Один битик выдвинули, один задвинули.

Неужели???
Вы так и собираетесь мучаться со SPI STM32 на уровне АВР??? )))
Да дочитайте уже референс до конца... спокойно и без нервов... включите воображение...
В частности... для чего существует TXE... и что такое непрерывный режим передачи...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 9 2013, 21:18
Сообщение #54


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

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



Цитата(ViKo @ Jan 10 2013, 02:53) *
Не надо

Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков. Но раз вам не надо, то конечно, дело ваше.
Вообще, у вас очень странная позиция. Если вы утверждаете, что нет разницы между RXNE и BSY, то почему вы упёрлись в использование RXNE? Чисто чтоб поспорить?
Короче, утомили вы меня, не стану больше вас отговаривать от глупых поступков. Да и вообще зря я это начал, сразу было понятно, что бесперспективняк.


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


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

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



Цитата(HHIMERA @ Jan 10 2013, 00:06) *
while (!(SPI1->SR & SPI_SR_TXE)); здесь и даром не нужна... смело можно выкинуть...

это верно
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 9 2013, 21:22
Сообщение #56


Местный
***

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



Цитата(AHTOXA @ Jan 10 2013, 01:18) *
Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков

Скажу больше, я даже сталкивался с камнем, который защелкивал CS фронтом последнего клока. sm.gif Хотя, формально, это не был SPI, просто serial interface.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 21:48
Сообщение #57


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

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



Цитата(AHTOXA @ Jan 10 2013, 00:18) *
Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков. Но раз вам не надо, то конечно, дело ваше.

Взгляните на картинку еще раз. Среза при передаче последнего бита b7 нет. Ждать нечего.
Цитата
Вообще, у вас очень странная позиция. Если вы утверждаете, что нет разницы между RXNE и BSY, то почему вы упёрлись в использование RXNE? Чисто чтоб поспорить?

А вы?

Цитата(HHIMERA @ Jan 10 2013, 00:15) *
Вы так и собираетесь мучаться со SPI STM32 на уровне АВР??? )))
Да дочитайте уже референс до конца... спокойно и без нервов... включите воображение...
В частности... для чего существует TXE... и что такое непрерывный режим передачи...

Фантазии отбрасываем. Обсуждаем технические вопросы. Оценки личностных качеств оставляем при себе.

Меня больше интересуют биты SSM и SSI.

Цитата(Tahoe @ Jan 10 2013, 00:22) *
Скажу больше, я даже сталкивался с камнем, который защелкивал CS фронтом последнего клока. sm.gif Хотя, формально, это не был SPI, просто serial interface.

О сдвиговых регистрах я упоминал выше.

Цитата(Tahoe @ Jan 10 2013, 00:15) *
И о чем нам это говорит? (с)

Какая еще такая "синхронная" связь, между "выдвижением битиков" и выставлением флагов, которые еще через стопицот разных шин, с не пойми какими частотами, доставляются до ядра?

О том, что если флаги дошли до ядра, то битики уже выдвинуты и задвинуты. sm.gif
А пока от ядра дойдет до порта, пройдет ох... ох, сколько наносекунд! Так что ведомое устройство уже получит своё.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 9 2013, 21:51
Сообщение #58


Местный
***

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



Цитата(ViKo @ Jan 10 2013, 00:38) *
Фантазии отбрасываем. Обсуждаем технические вопросы.

А я технически и обсудил...
Приведённые вами примеры - "лишь бы работало"...
В них возможности SPI STM32 не раскрыты даже частично... но я не настаиваю...
Цитата
Меня больше интересуют биты SSM и SSI.

Всё сначала... Что с ними не так???
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 9 2013, 22:00
Сообщение #59


Местный
***

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



Цитата(ViKo @ Jan 10 2013, 01:48) *
О том, что если флаги дошли до ядра, то битики уже выдвинуты и задвинуты. sm.gif

Не надо приписывать флагу то, в чем он "не копенгаген". Битики может и задвинуты, но откуда RXNE знать, что SPI трансфер завершен?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 11 2013, 07:55
Сообщение #60


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

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



Подправил код для чтения идентификатора SPI Flash Memory, что показывал выше. Такты выдаются непрерывным потоком, сигнал SS стал короче в 1.5 раза.
CODE

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)); // ждать байт в приемнике
id |= SPI1->DR; // Memory capacity
// while (SPI1->SR & SPI_SR_BSY); // ждать, если SPI занят
SMSS_OFF();
// Test = id;
return id;
}
Go to the top of the page
 
+Quote Post

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

 


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


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