Аппаратный SPI

Беннебой
Пт. 03 февраля 2017 г. 12:00
Таким образом, обновляясь с Arduino Nano до STM32 (Maple Mini Clone), я нахожусь в смешном положении, используя все доступные выводы для устройств и аналоговых датчиков, которые я хочу подключить.

Одна из проблем, с которой я ранее сталкивался на Nano, заключалась в том, что мне приходилось использовать 2 отдельные автобусы SPI SPI, чтобы получить SSD1306 & Устройства MAX31586 для работы - это потому, что 2 реализации программного обеспечения в соответствующих библиотеках ADAFRIT не будут сосуществовать на одной и той же программной шине SPI SPI.

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

Теперь, когда я понимаю, что могу использовать HW SPI, я хочу реорганировать свой код & HW, чтобы использовать одну автобус HW SPI.

Вопросы:

1) Я понимаю, что с основной точки зрения нет проблем со мной, имея несколько устройств на шине HW SPI на STM32, то есть мне просто нужен штифт CS для каждого устройства?

2) Приведенная ниже ссылка для клонов Maple Mini показывает SPI1 как обнаруженный по 2 наборам контактов, PB5, PB_4, PB_3, PA_15 и PA_4, PA_5, PA_6, PA_7 - Аппаратное обеспечение не дублирует шину SPI на втором наборе PINS делает это? Это победит цель того, чего я пытаюсь достичь.

Изображение

Спасибо.

Стивестронг
Пт. 03 февраля 2017 г. 12:21
Bennehboy ​​написал: 2) Приведенная ниже ссылка для Maple Mini Clones показывает SPI1 как обнаруженный по 2 наборам булавок, PB5, PB_ $, PB_3, PA_15 и PA_4, PA_5, PA_6, PA_7 - Аппаратное обеспечение не дублирует шину SPI на втором наборе булавок делает это?

Беннебой
Пт. 03 февраля 2017 12:28
Спасибо, Стив.

В отношении вашего первого ответа, почему эталонная диаграмма показывает SPI1, обнаженную на 2 различных наборах контактов? Это опция конфигурации или просто ошибка?

К счастью, SSD и MAX используют MSBFirst и SPI_MODE0 - две библиотеки значительно по -другому, 8000000 & 500000 - Я даже не уверен, что эти скорости достижимы? Divisor 9 и 144 соответственно? Или это не работает таким образом.

Другое устройство SPI, которое я хотел бы добавить, - это SD -карта, - я посмотрю на SDFAT, чтобы посмотреть, как это будет играть.

ZMEMW16
Пт. 03 февраля 2017 г. 12:33
SPI1-PA4-PA7
SPI2-PB12-PB15

PA4 & PB12 - это линия CS, последовательность именования одинакова и является CS, SCK, MISO и MOSI

Для нескольких устройств на SPI1 линии PA5-PA7 являются общими для всех, каждое устройство имеет свой собственный CS, PA1, PA2, PA3, я склонен использовать как
CS, D/C и Res
PA4 должен быть установлен как выход и высокий, аналогичный, я полагаю, на линии AVR SS, как и PIN 10 (не уверен, что все еще правда ?? исторический)

Мой системный блок имеет лист A4 с булавками SPI1, SPI2, I2C1 и I2C2, перечисленными очень большими шрифтами :)

Стивен время снова пересек

Беннебой
Пт. 03 февраля 2017 г. 12:49
Спасибо,

Поэтому я должен игнорировать эту первую ссылку на то, что SPI 1 находится на PB5, PB_4, PB_3, PA_15.

Стивестронг
Пт. 03 февраля 2017 г. 12:50
PA15, PB3..5 - это альтернативные переигрывающие булавки SPI1 от PA4..7, см. RM0008, Глава 9.3.10, SPI1 Альтернативная функция переработка.
Так что да, просто игнорируйте его или используйте, если вам нужен PA4..7 Для других целей.

Таким же образом контакты USART1 могут быть переназначены с PA9/10 до PB6/7.

Беннебой
Пт. 03 февраля 2017 г. 13:05
Стивестронг написал:PA15, PB3..5 - это альтернативные переигрывающие булавки SPI1 от PA4..7, см. RM0008, Глава 9.3.10, SPI1 Альтернативная функция переработка.
Так что да, просто игнорируйте его или используйте, если вам нужен PA4..7 Для других целей.

ZMEMW16
Пт. 03 февраля 2017 г. 13:40
Стивестронг написал:PA15, PB3..5 - это альтернативные переигрывающие булавки SPI1 от PA4..7, см. RM0008, Глава 9.3.10, SPI1 Альтернативная функция переработка.
Так что да, просто игнорируйте его или используйте, если вам нужен PA4..7 Для других целей.

Таким же образом контакты USART1 могут быть переназначены с PA9/10 до PB6/7.

Стивестронг
Пт. 03 февраля 2017 г. 14:02
Bennehboy ​​написал:Хорошо, в настоящее время я использую PA_4 в качестве аналогового ввода, но я могу перенести его на PB_0 и переместить пьезо -зуммер из этого булавки на один из ШИМ, который я освобождаю.

Беннебой
Пт. 03 февраля 2017 г. 15:17
Стивестронг написал: На самом деле, если вы используете SPI1 только в главном режиме, то вам не нужно «переоценить» PA4 по регистрации AFIO, потому что PA4 (= Select Select Select) используется в любом случае в качестве обычного GPIO в выходе. Таким образом, вы можете выбрать любой другой бесплатный GPIO в качестве CS вместо PA4.

Беннебой
Пт. 03 февраля 2017 г. 16:45
Epic Fail, не могу заставить экраны работать с HW SPI.

Ну, они демонстрируют мусор... Я соединил код прямо обратно.

Есть ли какая -либо подготовка булавки, мне нужно сначала сделать?

Стивестронг
Пт, 03 февраля 2017 г., 17:02
Любой доступный код, как вы инициализировали SPI? Понизить частоту тактовой частоты?

Беннебой
Пт. 03 февраля 2017 г., 17:18
Библиотека инициализирует SPI...
if (hwSPI){ SPI.begin(); #ifdef SPI_HAS_TRANSACTION SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); #else SPI.setClockDivider (4); #endif }

Беннебой
Пт. 03 февраля 2017 г., 17:37
Software SPI над теми же булавками работает нормально.

С HW весь дисплей сжимается в нижние 8 линий пикселей, я вижу, что он правильно рисует, но что -то не так.

Я взломал часы, безрезультатно.

Стивестронг
Пт. 03 февраля 2017 г., 18:46
Боюсь, в библиотеке дисплеев есть больше, чем вы ожидаете.
Специально функция begin () и функции написания данных.
Без проверки всего кода трудно понять, где проблема.
Какую библиотеку отображения вы используете?

РЕДАКТИРОВАТЬ
Я уже вижу проблему: вам не нужно начинать (), если вы используете begintransaction ().
Если вы используете begintransaction (), вам не нужно setclockdivider ().
Так что я бы переписал вашу кодовую часть таким образом: if (hwSPI){ #ifdef SPI_HAS_TRANSACTION SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); #else SPI.begin(); SPI.setClockDivider (4); #endif }

Беннебой
Пт. 03 февраля 2017 г., 19:39
ОК, спасибо, это все часть библиотеки adafruit_ssd1306.

Я сыграю еще немного завтра, я вырывал волосы на 2 часа, пытаясь выяснить, почему 2 идентично проводные и запрограммированные установки дают мне разные результаты. Если я поменяю контроллеры между двумя досками, проблема остается на одной плате, протестировал все провода, поменявшись в разных OLED и т. Д.

В любом случае, у меня было достаточно, и я пойду в паб : D

Беннебой
Сб 04 февраля 2017 г. 11:28
Я знаю, что похмелья не способствуют производительности, но сегодня обе доски ведут себя точно так же, как и ожидалось... Я ничего не изменил.

Как ни странно, когда я сейчас пытаюсь загрузить в парную заднюю тестовую систему, на которой видит IDE:

Maple_Loader v0.1
Сброс в загрузчик через DTR Pulse

И я вижу светодиодную пульсацию на доске - Это из -за проблемы R10? Не уверен, что это затрачено, но сейчас я не могу получить новый набросок.

Беннебой
Сб 04 февраля 2017 г. 15:36
Свернули обратно в оригинальные загрузчики и могут загрузить снова - ясно, что какая -то причуда V2, о которой я не читал - штифты должны быть настроены вручную?

В любом случае, теперь, конечно, кровавая вещь снова показывает мусор.

Я знаю, что делаю здесь что -то действительно глупое, но то, что уклоняется от меня.

Ахулл
Сб 04 февраля 2017 г. 15:38
Bennehboy ​​написал:Свернули обратно в оригинальные загрузчики и могут загрузить снова - ясно, что какая -то причуда V2, о которой я не читал - штифты должны быть настроены вручную?

В любом случае, теперь, конечно, кровавая вещь снова показывает мусор.

Я знаю, что делаю здесь что -то действительно глупое, но то, что уклоняется от меня.

Беннебой
Сб 04 февраля 2017 г. 16:35
Ну, я получил это работа,

Отказался от проводки и начал снова - должно быть, что -то не так, хотя я проверил провода Umpteen Times.

Так или иначе, повернуть предложения в библиотеку 1306, а HWSPI все еще не функциональный.

Я собираюсь проверить библиотеку на нано с HWSPI на случай, если это неотъемлемая ошибка.

Беннебой
Сб 04 февраля 2017 г. 16:59
Таким образом, библиотека также не работает должным образом на клоне Nano, она вращает весь дисплей на 1 байт прямо каждый раз, когда он нарисован, как будто он неправильно xferse дополнительный байт буфера экрана.

Вздох.

Беннебой
Сб 04 февраля 2017 г. 20:39
Ну, я идиот.

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

Итак, HW SPI работает на Nano в конце концов.

Все еще не могу заставить его работать на Maple Mini - даже после внесения изменений в библиотеку (отключение кода Portreg, и принуждение режима SPI и разделителя часов).

Я также не могу заставить этот код работать -> http: // www.STM32duino.com/viewtopic.PHP?t = 357

Software SPI работает просто отлично над теми же булавками (то есть не проблема проводки)

По иронии судьбы, причина, по которой мои 2 программных устройства SPI, вероятно, не работали вместе, заключалась в том, что я бы топал на мисо с линейкой DC для SSD1306. Если я не могу понять, почему HW SPI ничего не делает, то я, скорее всего, попробую следующее.

Стивестронг
Солнце 05 февраля 2017 г. 16:30
@Bennehboy, не могли бы вы быть немного более конкретными, что это значит "HW SPI ничего не делает"?
Можете ли вы построить хотя бы один пиксель на экране? Или, по крайней мере, установите фон на цвет (красный)?

Я также рекомендую использовать исключительно SPI.beginTransaction(SPISetting(8000000, ...));

Беннебой
Солнце 05 февраля 2017 г., 17:13
Нет пикселей вообще, я попробую использовать изменение в библиотеке, спасибо.

Беннебой
Солнце 05 февраля 2017 г. 17:37
Нет ничего.

Zip -файл библиотек и кода прикреплен. Это просто код испытаний "Сниженного". Будет компилироваться против Uno/Nano и STM32 - соответственно.

Комментарий/Строки нельзя 75 & 85 для переключения между программным/аппаратным SPI

Включенная библиотека ADAFRUI_SSD1306 была отредактирована для удаления кода Portreg & Только используйте начало транзакции.

Пса. Nano/uno hw spi работает только в случае SPI.начало кода вновь включено в LIB

Стивестронг
Солнце 05 февраля 2017 г. 18:34
Мои комментарии:
- Я не вижу, где определяется "_variant_arduino_stm32_", чтобы использовать правильный oled_cs в строке 32 INO.
- Я не понимаю, зачем тебе <Проволока.час>. Даже в LIB ADAFRIT_SSD1306 это не нужно, пока у вас есть только соединение SPI, так что вы можете удалить или #ifdef все экземпляры проводов.
- Попробуйте использовать "SPI.Напишите (d); «В строке 496 adafruit_ssd1306.CPP.

В противном случае все остальное выглядит разумно для меня.

В качестве альтернативы, вы можете попробовать Моя версия SPI Lib.

Беннебой
Солнце 05 февраля 2017 г., 19:42
Я сделаю редактирование и попробую.

HMM _Variant_arduino_stm32_ работал для меня ранее, я думал, что это было определено как часть ядра?

Я просто прокомментирую все условия условий и попробую, как есть, чтобы быть уверенным.

Беннебой
Солнце 05 февраля 2017 г., 19:47
Нет изменений. :(

Стивестронг
Солнце 05 февраля 2017 г. 20:00
- Попробуйте использовать "SPI.Напишите (d); «В строке 496 adafruit_ssd1306.CPP.

Беннебой
Солнце 05 февраля 2017 г. 20:11
<Яйцо на лице>
Настоящим я разрешаю вам выпустить удаленный удар в мою голову. : oops: : oops:

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

Аппаратный SPI работает без каких -либо модификаций библиотеки.
</яйцо на лице>

Я действительно идиот.

Стивестронг
Солнце 05 февраля 2017 8:48 вечера
Изображение
: D

Беннебой
Солнце 05 февраля 2017 г. 8:54
:ржу не могу: :ржу не могу:

Беннебой
Солнце 05 февраля 2017 г. 22:01
Ну, это просто очень очень расстраивает.

Поэтому я пережил всю проводку на моей основной тестовой плате, чтобы использовать аппаратный SPI, а 8 экранов работают просто отлично.... За исключением того, что через некоторое время 2 из них просто не показывают ничего.

MAX31856 не будет работать, делясь на том же автобусе, но в отличие от S/W SPI, по крайней мере, это не приводит к тому, что OLED просто заполняется белыми пикселями - я посмотрю, работает ли он с отключенным OLED.

Не могу представить, что я тоже собираюсь работать SD, лол.

Rogerclark
Солнце 05 февраля 2017 г. 22:38
Bennehboy ​​написал:
MAX31856 не будет работать, делясь на том же автобусе, но в отличие от S/W SPI, по крайней мере, это не приводит к тому, что OLED просто заполняется белыми пикселями - я посмотрю, работает ли он с отключенным OLED.

Беннебой
Солнце 05 февраля 2017 22:44
Они прикованы в цепях.

Я выяснил, почему некоторые из экранов шли пустые, программный SPI -код в библиотеке инициализирует CS -булавки и пишет их высоко.

Добавление инициализации CS PIN -контакта и написание их всех высоких фиксированных, которые для HW SPI.

Все еще работая над проблемой MAX31856.

Будет перемещен на пользовательскую плату с полосками с межсоединениями как можно более короткие, скорость шины SPI будет отрегулирована для того, что головное устройство должно быть висят с конца ленточного кабеля ~ 60 см (отлично работает на 8 МГц на Нано Ардуни, который В настоящее время в автомобиле я мог бы добавить).

Беннебой
Солнце 05 февраля 2017 22:53
Возможно ли, что мне нужно инициализировать мисо? Я вижу прокомментированные интенсии SS в SPI.CPP, но я думаю, что это позволяет повторному использованию этих булавок для других целей - например, я использую SPI 1 SS в качестве аналогового ввода...

STM32F1 SPI.H включает <Libmaple/Spi.час> - Этот файл заголовка не в папке Libmaple Core??

Я, наверное, упускаю что -то очевидное

Rogerclark
Пн, 06 февраля 2017 г. 4:03
Bennehboy ​​написал:Возможно ли, что мне нужно инициализировать мисо? Я вижу прокомментированные интенсии SS в SPI.CPP, но я думаю, что это позволяет повторному использованию этих булавок для других целей - например, я использую SPI 1 SS в качестве аналогового ввода...

STM32F1 SPI.H включает <Libmaple/Spi.час> - Этот файл заголовка не в папке Libmaple Core??

Я, наверное, упускаю что -то очевидное

Стивестронг
Пн, 06 февраля 2017 г. 8:25 утра
В Master -режиме SPI штифт SS оставлен пользователю для настройки (в режиме вывода) и для использования (установите низко перед передачей и установлена ​​высокой после этого). Но таким образом можно использовать любой GPIO.
В режиме рабов необходим и автоматически настроен с помощью SPI HW для обнаружения внешнего SS, но не пробовал то, что произойдет, если вы повторно его снимаете после инициализации SPI SPI.

Беннебой
Пн, 06 февраля 2017 г. 8:29 утра
Стивестронг написал:В Master -режиме SPI штифт SS оставлен пользователю для настройки (в режиме вывода) и для использования (установите низко перед передачей и установлена ​​высокой после этого). Но таким образом можно использовать любой GPIO.
В режиме рабов необходим и автоматически настроен с помощью SPI HW для обнаружения внешнего SS, но не пробовал то, что произойдет, если вы повторно его снимаете после инициализации SPI SPI.

Беннебой
Пн, 06 февраля 2017 г. 8:31
Rogerclark написал: Но если это сработает для вас как аналог, то я бы продолжал использовать его.

Стивестронг
Пн, 06 февраля 2017 г. 10:45 утра
Bennehboy ​​написал:Что касается Libmaple SPI.H должен беспокоиться о том, что я не могу его найти?

Беннебой
Пн, 06 февраля 2017 г. 10:53 утра
Спасибо, только я смотрю не в том месте. Мне нужно многому научиться.

Беннебой
Вт, 07 февраля 2017 г. 14:24
Роджер, я не думаю, что у вас есть ваша версия этого кода, чтобы передать? -> http: // форум.Ардуино.CC/INDEX.PHP?тема ... MSG2945098

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

Беннебой
Вторник 07 февраля 2017 г. 19:39
Неважно,

Я взломал это вместе, и это работает... поменял его, чтобы использовать начало транспортировки также.

Некоторые вещи должны отметить... Библиотека Adafruit неверно использует SPI_MODE0, устройство ожидает, что SPI_MODE3 - исправление библиотеки не привело.

Двойная проверка проводки всегда помогает, у меня был SDO & SDI поменялся! Исправление этого не привело к успеху.

Обучение - это очень весело, даже когда оно включает в себя публичное унижение :ржу не могу: :ржу не могу:

Просто нужно взломать это в мой проект и убедиться, что он прекрасно сосуществовает с OLED.
#include "SPI.h" #define MAX_CS 29 #define NumRegisters 10 byte RegisterValues[] = {0x90, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xFF, 0x80, 0x00, 0x00 }; String RegisterNames[] = {"CR0", "CR1", "MASK", "CJHF", "CHLF", "LTHFTH", "LTHFTL", "LTLFTH", "LTLFTL", "CJTO"}; byte RegisterAddresses[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x06, 0x07, 0x08, 0x09 }; void setup() { // put your setup code here, to run once: Serial.begin(250000); pinMode(MAX_CS, OUTPUT); //init CS digitalWrite(MAX_CS, HIGH); InitializeChannel(MAX_CS); delay(500); } void InitializeChannel(int Pin) { Serial.print("Initializing channel on pin "); Serial.println(Pin); for (int i = 0; i < NumRegisters; i++) { WriteRegister(Pin, i, RegisterValues[i]); } } void loop() { Serial.println("================================================="); double TC_temp = ReadTemperature(MAX_CS); Serial.print("\tThermocouple temp is "); Serial.println(TC_temp); delay(1000); } byte ReadSingleRegister(int Pin, byte Register) { SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); digitalWrite(Pin, LOW); delayMicroseconds(1); SPI.transfer(Register & 0x7F); //set bit 7 to 0 to ensure a read command delayMicroseconds(1); byte data = SPI.transfer(0); digitalWrite(Pin, HIGH); SPI.endTransaction(); return data; } unsigned long ReadMultipleRegisters(int Pin, byte StartRegister, int count) { //reads up to 4 sequential registers SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); digitalWrite(Pin, LOW); unsigned long data = 0; SPI.transfer(StartRegister & 0x7F); //force bit 7 to 0 to ensure a read command delayMicroseconds(1); for (int i = 0; i < count; i++) { data = (data << 8) | SPI.transfer(0); //bitshift left 8 bits, then add the next register } digitalWrite(Pin, HIGH); SPI.endTransaction(); return data; } void WriteRegister(int Pin, byte Register, byte Value) { byte Address = Register | 0x80; //Set bit 7 high for a write command SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); digitalWrite(Pin, LOW); delayMicroseconds(1); SPI.transfer(Address); delayMicroseconds(1); SPI.transfer(Value); digitalWrite(Pin, HIGH); SPI.endTransaction(); } double ReadTemperature(int Pin) { double temperature; long data; data = ReadMultipleRegisters(Pin, 0x0C, 4); // Strip the unused bits and the Fault Status Register data = data >> 13; // Negative temperatures have been automagically handled by the shift above :-) // Convert to Celsius temperature = (double) data * 0.0078125; // Return the temperature return (temperature); }

Беннебой
Вторник 07 февраля 2017 г. 20:51
Хорошо, объединили код в мой проект LRDUINO, и все работает хорошо. УРА : D : D

Я добавил дополнительный код, в котором также проверяет состояние регистра состояния, поэтому моя проверка неисправностей все еще работает.

Работа Jobbed. Код будет на GitHub позже.

Ахулл
Вторник 07 февраля 2017 г. 9:35 вечера
Bennehboy ​​написал:Хорошо, объединили код в мой проект LRDUINO, и все работает хорошо. УРА : D : D

Я добавил дополнительный код, в котором также проверяет состояние регистра состояния, поэтому моя проверка неисправностей все еще работает.

Работа Jobbed. Код будет на GitHub позже.

Беннебой
Вторник 07 февраля 2017 г. 9:56 вечера
Как будто по магии...

Изображение

Все важная часть-верхняя треть с левого экрана, чтение прямо над окружающей средой (в пределах процента ошибки для K-типа).