Проблема с SPI Chip Select

Rogerclark
Вт, 09 июня 2015 г., 10:32 утра
Это отключенная нить из вопроса с SD Lib

В основном проблема заключается в том, что в SPI этот PA4 технически является технически аппаратным программным обеспечением Select (AKA Select и т. Д.)

Однако, кажется, существует ошибка / функция в F103 и F4 (и, возможно, других процессорах STM32), где Adwardware Speeric Soft Ship Select, известный как NSS, в основном ничего не делает.

Что хуже, так это то, что когда код устанавливает регистры управления управлением SPI, он эффективно меняет Pinmode штифта NSS (PA4), так что он больше не вывод (я понятия не имею, каким режим штифта оно становится, но он больше не Выход GPIO)

Мы обнаружили, что исправление для этого - установить PinMode (PA4, выход); После вызова SPI.начинать()

Итак, я думаю, что решение состоит в том, чтобы изменить SPI.начать () сделать это как часть своей работы.

Тем не менее, я обеспокоен тем, что если кто -то решил использовать PA4 в качестве входа и прикрепил его к переключателю и т. Д., то если код в одностороннем порядке установит его на вывод в SPI.begin () это может повредить оборудование.

Итак, я думаю, что решение состоит в том, чтобы получить Pinmode PA4 в начале SPI.Begin (), а затем после установки SPI REG, чтобы повторно инбор PinMode PA4. я.E, если он был установлен на вывод до SPI.begin () называется, он будет восстановлен в этом Pinmode до возврата begin ().

Обратите внимание, что для SPI2 и SPI3 существуют различные контакты NSS, поэтому код (in begin ()) должен проверить, какой канал SPI используется, и только восстановить соответствующий Pinmode NSS



Если кто -то может увидеть недостаток в этом, пожалуйста, дайте мне знать

Rogerclark
Вт, 09 июня 2015 г., 11:45
Ребята,

Я не могу закончить это сегодня вечером, так как мне стало слишком поздно

Но вот работа до сих пор

Первая функция - это существующий, который устанавливает режим GPIO (ну, это код, который меняет регистры GPIO CR и ODR)

Функция под ним - моя попытка сделать наоборот

void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { gpio_reg_map *regs = dev->regs; __io uint32 *cr = ®s->CRL + (pin >> 3); uint32 shift = (pin & 0x7) * 4; uint32 tmp = *cr; tmp &= ~(0xF << shift); tmp |= (mode == GPIO_INPUT_PU ? GPIO_INPUT_PD : mode) << shift; *cr = tmp; if (mode == GPIO_INPUT_PD) { regs->ODR &= ~(1U << pin); } else if (mode == GPIO_INPUT_PU) { regs->ODR |= (1U << pin); } } gpio_pin_mode gpio_get_mode(gpio_dev *dev, uint8 pin) { gpio_reg_map *regs = dev->regs; __io uint32 *cr = ®s->CRL + (pin >> 3); uint32 shift = (pin & 0x7) * 4; uint32 tmp = *cr; uint32 crMode = (*cr>>shift) & 0x0F; // could be pull up or pull down. Nee to check the ODR if (crMode==GPIO_INPUT_PD && ((regs->ODR >> pin) & 0x01) !=0 ) { crMode = GPIO_INPUT_PU; } return(crMode); } }

victor_pv
Вторник 09 июня 2015 г. 14:12
Роджер, я понимаю функцию spi_config_gpios в STM32F1/cores/maple/libmaple/spi_f1.C устанавливает штифт NSS как AF:
gpio_set_mode (nss_dev, nss_bit, gpio_af_output_pp);

Эта функция вызывается в Hardwarespi Configure_gpios, который называется поворотом, называется enable_device, который называется void hardwarespi :: negn

Таким образом, мы можем переназначить файл обратно в обычную функцию GPIO, как вы предлагаете выше, или мы можем просто остановить изменение, что это прикрепляет к альтернативной функции, если установить его, поскольку AF не работает как NSS в любом случае из -за аппаратной ошибки.

Кроме того, если мы изменим функцию SPI_CONFIG_GPIO, чтобы не делать GPIO_SET_MODE в PIN -контакте NSS, она будет работать для всех портов SPI.

пико
Вторник 09 июня 2015 г., 14:21
Rogerclark написал: Мы обнаружили, что исправление для этого - установить PinMode (PA4, выход); После вызова SPI.начинать()

Ахулл
Вт, 09 июня 2015 г., 14:27
Если бы вы могли быть уверены в времени, возможно, можно было бы использовать таймеры или даже функцию ШИМ, чтобы утверждать и отработать PIN..... Просто обдумывая это в мой ум на данный момент....

пико
Вторник 09 июня 2015 г., 14:30
Ахулл написал:Если бы вы могли быть уверены в времени, возможно, можно было бы использовать таймеры или даже функцию ШИМ, чтобы утверждать и отработать PIN..... Просто обдумывая это в мой ум на данный момент....

Вассилис
Вт, 09 июня 2015 г., 15:18
Я внес несколько изменений в файлы
\ Arduino_stm32 \ stm32f1 \ libraries \ spi \ src \ spi.в и \ Arduino_stm32 \ stm32f1 \ libraries \ spi \ src \ spi.час

Я добавил новый начинать конструктор.

SPI.час /** * EXPERIMENTAL CONSTRUCTOR (Vassilis Serasidis) */ void begin(int8_t pin, SPISettings settings);

Rogerclark
Вт, 09 июня 2015 г., 21:02
Виктор

Я не понимал, что код переигрывает PIN -код NSS.

Интересно, почему Leaflabs это сделал. Я согласен, что это кажется бессмысленным.

Стоит прокомментировать эту строку и посмотреть, что делает линия NSS на PA4, но похоже, что у NSS есть проблемы в оборудовании независимо от того, что ее сопоставлено с намечкой на карту с.

@andy и @pic

Мы могли бы легко поместить код в SPI.перенести, чтобы управлять линией SS, но очень неэффективно делать это таким образом.

Afik, обычно на платформе Arduino, SS -PIN управляется кодом в SD и других LIBS или кодом в эскизе.

Даже если бы нам удалось заработать аппаратные NSS, я бы беспокоился о том, что либера

@pico

Я намерен сделать то, что вы описываете, но просто настройка PA4 для вывода может быть вредным, если кто -то подключил этот вывод к GND через нормально закрытый коммутатор.

Вот почему я хочу получить режим PIN PA4 в начале Begin () и восстановить этот режим в конце начала ()

Mrburnette
Ср 10 июня 2015 г. 12:19
Я намерен сделать то, что вы описываете, но просто настройка PA4 для вывода может быть вредным, если кто -то подключил этот вывод к GND через нормально закрытый коммутатор. ИМО, это реальная проблема, потому что некоторые онлайн -ссылки сообщают пользователям «Ground/GND» неиспользованные булавки.
https: // www.Google.com/#q = земля+неиспользованный ... Оллер+булавки
После того, как кто -то попадает в специфику, ссылки обычно квалифицируются с «резистором или конденсатором."Я также видел такие советы в различных ответах на форум Arduino.

Луча

Rogerclark
Ср 10 июня 2015 г. 12:44
Ребята,

Я подтолкнул, возможно, исправление для проблемы SPI NSS / CS

видеть

https: // github.com/rogerclarkmelbourne/ ... fix_spi_ss

Изменения кода должны добавить новую функцию низкого уровня с именем gpio_get_mode () и использовать эту новую функцию в spi :: neply ()

Вот пересмотренный SPI :: Begin

Во -первых, код должен определить, какое устройство SPI используется.
Поскольку мы не храним номер канала SPI, я должен сравнить устройство SPI (адрес) с добавлением трех возможных устройств SPI.
(Это не имеет большого значения, так как все это всего лишь 32 -битные числа для процессора)

Конечно, мне нужно иметь #ifdef для обслуживания различных моделей процессоров - я взял #ifdef от конструктора Spiclass, но, глядя на них, я не думаю, что на самом деле есть доски с менее чем 2 SPI, так что на самом деле Первые 2 Ifdefs в конструкторе Spiclass, и здесь в начале действительно избыточно. Но в любом случае.....

После этого код просто получает режим GPIO PIN -кода NSS, затем после настройки аппаратного обеспечения SPI он устанавливает PinMode обратно в свое хранимое состояние.

Примечание. Я не смотрел на переоборудование AF, на который указал Виктор. Но он не похож на переиздание булавки, похоже, что это перепродажа, чтобы сделать булавку «выходной удар», что мы хотим, я.e Нормальный выходной штифт.
Но мы можем вернуться к этому

Я провел некоторое базовое тестирование на одной из моих испытательных буровых установок, и SD, кажется, работает нормально, но мне нужно проверить его на более крупной плате, чтобы подтвердить, что он в порядке


void SPIClass::begin(void) { gpio_pin_mode nssPinMode; int nssPin; if (dataMode >= 4) { ASSERT(0); return; } #if BOARD_NR_SPI >= 1 if (this->spi_d == SPI1) { nssPin=BOARD_SPI1_NSS_PIN; } #endif #if BOARD_NR_SPI >= 2 if (this->spi_d == SPI2) { nssPin=BOARD_SPI2_NSS_PIN; } #endif #if BOARD_NR_SPI >= 3 if (this->spi_d == SPI3) { nssPin=BOARD_SPI3_NSS_PIN; } #endif nssPinMode = gpio_get_mode(PIN_MAP[nssPin].gpio_device, PIN_MAP[nssPin].gpio_bit);// get and save NSS pin mode uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); spi_init(spi_d); configure_gpios(spi_d, 1); #ifdef SPI_DEBUG Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags); gpio_set_mode(PIN_MAP[nssPin].gpio_device, PIN_MAP[nssPin].gpio_bit, nssPinMode);// restore pin mode of nss pin (work around for bug in the STM32) }

Rogerclark
Ср 10 июня 2015 г. 12:56 утра
Обновлять

Я проверил это с помощью моего F103ZET (хотя и на SPI 1 / PA4) и посмотрел на PA4 с моей областью, и он работает нормально.

Если кто -то еще может проверить ветвь https: // github.com/rogerclarkmelbourne/ ... fix_spi_ss

Это было бы удобно. Но если я не получу отрицательных отзывов за 24 часа, я объединю его в мастер -копию репо

Ваше здоровье

Роджер

пико
Ср 10 июня 2015 г., 5:03
Rogerclark написал:Что хуже, так это то, что когда код устанавливает регистры управления управлением SPI, он эффективно меняет Pinmode штифта NSS (PA4), так что он больше не вывод (я понятия не имею, каким режим штифта оно становится, но он больше не Выход GPIO)

Rogerclark
Ср 10 июня 2015 г., 5:49
@pico

Моим основным соображением была совместимость с существующими. эн.глин. SD, где они управляют штифтом SS с помощью GPIO

Если бы нам удалось заставить работу автоматического SS (я не уверен приколоть.

Если мы хотим использовать аппаратную функцию NSS, я думаю, что для общей совместимости нам необходимо изменить либо конструктор Spiclass, либо функцию begin (), с дополнительным дефолтным аргументом e.глин. Nssmode. я.E NSSMode по умолчанию в GPIO для максимальной совместимости, но позвольте пользователям установить NSSMode на Hardwarenss, если они специально хотят этой функции.


Примечание. На данный момент я не коснулся линии вывода PP Remap, мне нужно будет проверить, что произойдет, если я ее удалю, я.E Pin Pint все еще работает как GPIO.


КСТАТИ.
Удалось ли вам автоматически переключать NSS ? Когда я попытался установить бит MSS в CR, это, похоже, не сделало PIN -код NSS активным. Но я думаю, что AF Remap может вызвать проблемы с этим

пико
Ср 10 июня 2015 г., 6:36
Rogerclark написал:@pico

Моим основным соображением была совместимость с существующими. эн.глин. SD, где они управляют штифтом SS с помощью GPIO

Если бы нам удалось заставить работу автоматического SS (я не уверен приколоть.

Если мы хотим использовать аппаратную функцию NSS, я думаю, что для общей совместимости нам необходимо изменить либо конструктор Spiclass, либо функцию begin (), с дополнительным дефолтным аргументом e.глин. Nssmode. я.E NSSMode по умолчанию в GPIO для максимальной совместимости, но позвольте пользователям установить NSSMode на Hardwarenss, если они специально хотят этой функции.

Rogerclark
Ср 10 июня 2015 г., 6:48
@pico,

Когда я перечитал вашу публикацию, я понял, что мы предложили тот же режим по умолчанию.

Re: автоматическое переключение

Вы имеете в виду изменение SPI.Передача для обработки переключения CS с помощью GPIO ?

Я думаю, что единственная проблема с этим заключается в том, что это критический код времени. Если мы поместим, если там, что переключим CS, то я уверен, что люди будут жаловаться мне, что это замедлилось, добавив новую функцию - существует огромное количество сопротивления, что можно было замедлить вещи.
(Если операторы, по -видимому, вызывают замедление на STM32 из -за кэширования трубопровода инструкций)

Что понятно, потому что большинство людей используют STM32, потому что его 72 МГц и 32 бит, следовательно, примерно на 5 х выше AVR.

Я подозреваю, что нам нужно добавить новые функции E.глин. TransferHwnss ()

К сожалению, невозможно выполнить условную компиляцию, чтобы включить и выключить это.

У нас уже есть новая функция, которую мы добавили Spiclass :: dmatransfer, так что это может быть легко изменено, чтобы обрабатывать свой собственный CS, если это необходимо, но в настоящее время его блокировка, так что автоматическое CS не такая проблема.

Я также смутно некоторая проблема с добавлением указателя функции обратного вызова DMA в Spiclass, но, возможно, я смущаю это с чем -то другим.
ммм. Возможно, это было связано с тем, как использовался канал SPI, и как необходимо прикрепить обратные вызовы DMA к разным векторам... К сожалению, моя память немного туманна в этом, так как это было несколько месяцев назад, я посмотрел на это :-(

пико
Ср 10 июня 2015 г., 6:58
Rogerclark написал:Когда я попытался установить бит MSS в CR, это, похоже, не сделало PIN -код NSS активным. Но я думаю, что AF Remap может вызвать проблемы с этим

Rogerclark
Ср 10 июня 2015 г., 7:12
@pico


Ах.

Я понимаю, что ты имеешь в виду.

Я использовал определение для булавки из заголовка, и я только что сделал бинар или | на конце существующего схема.

Как ни странно, я подумал, когда смотрел на паттен, когда гекс выглядел нормально, но я, вероятно, обманул себя


Но, как вы говорите, он полностью ломает SPI, если вы просто сделаете это ;-)

пико
Ср 10 июня 2015 г., 7:55
Rogerclark написал:@pico,

Когда я перечитал вашу публикацию, я понял, что мы предложили тот же режим по умолчанию.

Re: автоматическое переключение

Вы имеете в виду изменение SPI.Передача для обработки переключения CS с помощью GPIO ?

Я думаю, что единственная проблема с этим заключается в том, что это критический код времени. Если мы поместим, если там, что переключим CS, то я уверен, что люди будут жаловаться мне, что это замедлилось, добавив новую функцию - существует огромное количество сопротивления, что можно было замедлить вещи.
(Если операторы, по -видимому, вызывают замедление на STM32 из -за кэширования трубопровода инструкций)

Что понятно, потому что большинство людей используют STM32, потому что его 72 МГц и 32 бит, следовательно, примерно на 5 х выше AVR.

Rogerclark
Ср 10 июня 2015 г. 8:02
@pico

Не беспокойся

Если это возможно, вы можете проверить код в филиале FIRCE_SPI_SS и сообщите мне, что GPIO работает для вас OK на PA4, то есть проверьте, что материал для сохранения и восстановления режим PIN работает в Spiclass :: Begin

Я надеялся, что еще несколько человек протестируют это, но мне нужно подождать до завтра, чтобы дать парням в Европе и США, чтобы прочитать эту ветку и проверить вещи.

Спасибо

Роджер

пико
Ср 10 июня 2015 г. 9:51
Rogerclark написал:@pico
Если это возможно, вы можете проверить код в филиале FIRCE_SPI_SS и сообщите мне, что GPIO работает для вас OK на PA4, то есть проверьте, что материал для сохранения и восстановления режим PIN работает в Spiclass :: Begin

Rogerclark
Ср 10 июня 2015 г. 10:08
@pico

.

Я попробую.

Я, вероятно, сохраню свою новую функцию gpio_get_mode, так как она может пригодиться ;-), Но я не буду использовать его в Spiclass :: Начните, если просто комментируйте линию переработки AF

Спасибо

Rogerclark
Ср 10 июня 2015 г. 10:26
@pico

Вы смотрели на PA4 с логическим анализатором ?

Я прокомментировал эту линию, но все время, кажется, все время заставляют PA4 низко.

Моя область показывает около 280 мВ и немного шума на PA4 все время.

Моя SD -карта работает нормально, но это потому, что это единственное устройство, прикрепленное к SPI 1, так как я запускаю VS1053 на SPI 2, так что нет столкновения.


Редактировать.

Подожди

Я не уверен, что моя область работает ;-)

Возможно, это исправление в порядке.

Редактировать 2

Извиняюсь, это работает.

Не проблема с масштабами, проблема с эскизом.

Похоже, работает. я.E просто комментируя эту строку. Теперь я могу увидеть хорошие квадратные импульсы на своей области !

Редактировать 3.

Я только что подтолкнул новую версию в эту филиал fix_spi_nss

Я удалил код сохранения и сброса режима PIN -кода из SPI.C и только что прокомментировал линию переработки AF в SPI_F1.в

пико
Ср 10 июня 2015 г. 11:04
Rogerclark написал:Я не уверен, что моя область работает ;-)

Ахулл
Ср 10 июня 2015 12:17
Пико написал:Rogerclark написал:Я не уверен, что моя область работает ;-)

Rogerclark
Ср 10 июня 2015 г., 21:52
Привет, Энди

В этом случае, к счастью, это была программная ошибка.

Я бегал с CS на PA2, который на моей доске рядом с PA4.

Затем вчера, когда я пытался заставить NSS (PA4) работать, я переместил CS и изменил эскиз.

Но я не мог бы сохранить изменения.

Поэтому, когда я попробовал это снова, на следующий день CS был установлен на PA2, и моя область была на PA4, поэтому ничего не было видно на PA4.

Прикоснуться к дереву.. Я ничего не взорвался недавно, но после того, как вы опубликовали об инциденте с волшебным дымом, я теперь немного более осторожно, особенно о металле от USB -вилок или других досках, зажигая булавки на доске, которые я включил.

Я также взял на себя, чтобы отключить USB (и, следовательно, мощность), когда я подключаю область и т. Д., Поскольку всегда есть шанс, что я могу сортировать соседние булавки при подключении области.