|
|
  |
stm32f407 SPI обнаружил косяк |
|
|
|
Jan 9 2013, 20:30
|

фанат дивана
     
Группа: Свой
Сообщений: 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; И работает. ЧЯДНТ?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 9 2013, 20:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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;
|
|
|
|
|
Jan 9 2013, 21:06
|
Местный
  
Группа: Участник
Сообщений: 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 тут не слова... увы...
|
|
|
|
|
Jan 9 2013, 21:15
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(ViKo @ Jan 10 2013, 01:02)  Да ну? А вы в курсе, что прием и передача происходят синхронно? Один битик выдвинули, один задвинули. И о чем нам это говорит? (с) Какая еще такая "синхронная" связь, между "выдвижением битиков" и выставлением флагов, которые еще через стопицот разных шин, с не пойми какими частотами, доставляются до ядра? В каком порядке эти флаги выставляются, какие там буферизации/задержки, не видя исходного Verilog/VHDL ( на чем там был пИсан этот SPI модуль ), можно только гадать. Или просто воспользоваться описанием в документации.
|
|
|
|
|
Jan 9 2013, 21:15
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(ViKo @ Jan 10 2013, 00:02)  Да ну? А вы в курсе, что прием и передача происходят синхронно? Один битик выдвинули, один задвинули. Неужели??? Вы так и собираетесь мучаться со SPI STM32 на уровне АВР??? ))) Да дочитайте уже референс до конца... спокойно и без нервов... включите воображение... В частности... для чего существует TXE... и что такое непрерывный режим передачи...
|
|
|
|
|
Jan 9 2013, 21:18
|

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

|
Цитата(ViKo @ Jan 10 2013, 02:53)  Не надо Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков. Но раз вам не надо, то конечно, дело ваше. Вообще, у вас очень странная позиция. Если вы утверждаете, что нет разницы между RXNE и BSY, то почему вы упёрлись в использование RXNE? Чисто чтоб поспорить? Короче, утомили вы меня, не стану больше вас отговаривать от глупых поступков. Да и вообще зря я это начал, сразу было понятно, что бесперспективняк.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 9 2013, 21:22
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(AHTOXA @ Jan 10 2013, 01:18)  Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков Скажу больше, я даже сталкивался с камнем, который защелкивал CS фронтом последнего клока.  Хотя, формально, это не был SPI, просто serial interface.
|
|
|
|
|
Jan 9 2013, 21:48
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 фронтом последнего клока.  Хотя, формально, это не был SPI, просто serial interface. О сдвиговых регистрах я упоминал выше. Цитата(Tahoe @ Jan 10 2013, 00:15)  И о чем нам это говорит? (с)
Какая еще такая "синхронная" связь, между "выдвижением битиков" и выставлением флагов, которые еще через стопицот разных шин, с не пойми какими частотами, доставляются до ядра? О том, что если флаги дошли до ядра, то битики уже выдвинуты и задвинуты.  А пока от ядра дойдет до порта, пройдет ох... ох, сколько наносекунд! Так что ведомое устройство уже получит своё.
|
|
|
|
|
Jan 9 2013, 21:51
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(ViKo @ Jan 10 2013, 00:38)  Фантазии отбрасываем. Обсуждаем технические вопросы. А я технически и обсудил... Приведённые вами примеры - "лишь бы работало"... В них возможности SPI STM32 не раскрыты даже частично... но я не настаиваю... Цитата Меня больше интересуют биты SSM и SSI. Всё сначала... Что с ними не так???
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|