SPI + ISR + SPCR и т. Д.

Hextank
Пт 30 сентября 2016 г. 11:03
Итак, я только что перешел в Baite MM, чтобы использовать более быстрый SPI по сравнению с Arduinos. Теперь я пытался перенести простой набросок и ударить с компиляцией.

Вещи не объявлены, такие как SPCR, SPDR и т. Д. и использование ошибок конструктора ISR -макроса, а что нет.

Были ли эти вещи настроены на сторону STM32 или это прагматично иначе? Меня не интересует DMA или что -то в этом роде, я просто ищу простой стрельбу по прерыванию, когда данные были получены как раб SPI.

ZMEMW16
Пт 30 сентября 2016 г., 12:55
Сделайте поиск на сайте на SPI Slave 72 Результаты, один выдающийся заголовок включает Maple Mini

Hextank
Пт 30 сентября 2016 г. 13:19
Добавить «прерывание» в уравнение, и вы получите 4, одно из которых это.

Я видел, как используется Spiclass, глядя на http: // www.STM32duino.com/viewtopic.PHP?t = 891&начало = 10 И после этого я был в поисках, что привело к тому, что GitHub, к сожалению, PR не был вытянут, и нигде больше на сайте не упоминается о том, как прерывает ручку, я обнаружил, чем на другом внешнем сайте. Spiclass кажется неполным, или, скорее, заключается в том, что для интеграции как подлеза, так и в главном режиме.

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

Спасибо за урок в поисках, это была большая помощь.

Ciao.

Стивестронг
Пт 30 сентября 2016 г. 13:46
Мы не против, если бы вы поделились своим кодом : mrgreen:

ZMEMW16
Пт 30 сентября 2016 г., 15:04
Hextank написал:Добавить «прерывание» в уравнение, и вы получите 4, одно из которых это.
Спасибо за урок в поисках, это была большая помощь.

Hextank
Пт 30 сентября 2016 г., 19:29
Ну, я добрался до
SPI.setModule(2); SPI.beginSlave(); spi_irq_enable(SPI.dev(), SPI_RXNE_INTERRUPT);

Martinayotte
Пт 30 сентября 2016 г., 19:40
Векторная таблица находится в файле STM32F1/Cores/Maple/Libmaple/STM32F1/Performance/Vector_Table.С.
В файле STM32F1/Cores/Maple/Libmaple/STM32F1/ISRS существует слабый default_handler.С
Вам нужно переопределить этот слабый обработчик, написав свою собственную функцию __irq_spi1.

Hextank
Пт 30 сентября 2016 г., 8:31 вечера
Какой правильный синтаксис для переоценки?

Я попробовал так.
void __irq_spi1() { digitalWrite(33, LOW); }

Martinayotte
Пт 30 сентября 2016 г., 21:54
Да, это должно быть просто C, но у вас была недостающая "void", это должно быть: extern "C" { void __irq_spi1(void) { digitalWrite(33, LOW); } }

Hextank
Сб 01 октября 2016 г., 7:20 утра
Я получаю то же самое с несоответствием сцепления C/C ++. Я думал, как C неявно предполагает int xxxx (void).

Жаль, что компилятор не говорит, откуда была предыдущая декларация (я предполагаю, что это тот, который в ISRS.S)


Ах, хорошо, это компилирует и работает.
extern "C" { void __irq_spi1(void); } void __irq_spi1(void) { digitalWrite(33, LOW); }

Hextank
Сб 01 октября 2016 г., 7:54 утра
Я предполагаю, что у людей работали коммуникации правильно, но подобные вещи меня беспокоят.

https: // my.ул.com/public/ste2ecommuniti ... TVIEWS = 290

Учитывая, как он сфальсифицирован сейчас с помощью кленового кода, он будет чтение / написание 32 -битных значений.

Martinayotte
Сб, 01 октября 2016 г. 14:24
Hextank написал: Ах, хорошо, это компилирует и работает.
Это прерывание теперь обслуживается, хотя оно все еще висит, поэтому я думаю, что будет труднее отслеживать причину этого. :)

Hextank
Сб, 01 октября 2016 г. 14:40
Выключает прерывание.

Чтение данных в буфере, чтобы я мог написать значения в Loop (), которые работают, хотя все значения, которые я получаю, - все 0xff, что неверно. Значения, отправленные из STM в мастер, тоже 0xff.

Как ни странно, мой ISR в основном SPI.Читать с переменной и передайте это SPI.Напишите, я бы изменил эту переменную, скажем, назначьте ее ноль, прежде чем использовать ее в SPI.писать, это висит. : D

В этом есть что -то немного чувствительное, как я сказал в своем предыдущем посте, я не думаю, что доктор доктор верен. Даже у кленового источника есть актеры перед чтением / писанием, это перенаправления, а не набрать результат.

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

Racemaniac
Сб, 01 октября 2016 г. 18:01
Не уверен, над каким прерыванием вы сейчас работаете, но одна из проблем, с которыми я регулярно сталкивался при работе с прерыванием, случайно заставляет прерывание постоянно огонь. Для некоторых прерываний вы должны принести систему в действительное состояние со своим обработчиком, а если вы этого не сделаете, это просто будет продолжать стрелять навсегда, и никакой другой код не будет выполняться.
Но есть так много вещей, которые могут пойти не так с прерывами, я рад, что на данный момент я не работаю с ними: P.

Hextank
Сб, 01 октября 2016 г., 21:27
Я просто использую (в данном случае) Global Spi1 intr, глядя на руководство, вам просто нужно прочитать Spr_dr, чтобы он был опустошен RX, поэтому, если компилятор не генерирует хитрый ассемблер (еще не проверяется), я не знаю. Я полагаю, мне нужно было выяснить, почему 0xff читается сначала из Мастера, я знаю, что эта сторона работает, так как я подключился к Promicro, это просто промикро не мог справиться с часами 8 МГц.

У меня есть пример Billy No Mates в его том, почему из Китая, чтобы проверить все эти вещи в порядке, но SS и CLK явно работают.

Hextank
Пт, 07 октября 2016 г., 18:48
ОК, Analyzer появился, что за находка, он подчеркнул нуби на нескольких уровнях.

Независимо от того, сколько раз я проверял, кажется, что у меня все еще был SCLK и SS неправильный путь, это само по себе наверняка вызовет проблемы. :)
Теперь я знаю, что у меня есть мисо и Моси неправильно, имея их правильный путь обойти, заставляет другое устройство SPI провалиться (что прикрепляется к мастеру), так что это задает вопрос о вопросе.

SS на SPI1, так как раб только что игнорировал? Например, когда он подходит высоко, он не входит в состояние с высоким сопротивлением?

Hextank
Пт, 07 октября 2016 г., 19:04
HRM, таким образом, поставив подтягивание в VCC или Pulldown в GND для SS и SPI прерывания, все еще выпускает, независимо?

Rogerclark
Пт, 07 октября 2016 г., 8:58 вечера
Не используйте SS PIN -код для CS.

Он имеет специальную функцию и не предназначен для использования в качестве CS.

В основном это некоторая странная функция, разработанная STM, которую никто другой не использует.

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

Hextank
Пт, 07 октября 2016 г., 21:04
Хорошо, у меня сейчас это работает, спасибо за передачи, предложения и т. Д.

Я подключил все свои провода к SPI2, и это сработало, поэтому я подумал, что, может быть, анализатор каким -то образом вмешивался, поэтому удалил эти зонды и вернул провода в SPI1, все еще работает. Вставьте зонды и все еще работает. :?

Ибо любопытство, если кто -нибудь упадет на этот пост. (немного грубо, но укротит его после того, как я закончил наслаждаться успехом)
#include char buf [100]; volatile byte pos; volatile boolean process_it; void setup() { Serial.begin(9600); pos = 0; // buffer empty process_it = false; SPI.setModule(1); SPI.beginSlave(); spi_irq_enable(SPI.dev(), SPI_RXNE_INTERRUPT); pinMode(33, OUTPUT); digitalWrite(33, HIGH); // turn the LED on (HIGH is the voltage level) } extern "C" { void __irq_spi1(void); } void __irq_spi1(void) { digitalWrite(33, LOW); // toggle onboard LED to see if we crash out short b = spi_rx_reg(SPI.dev()); // read data which shoould flush RXNE spi_tx_reg(SPI.dev(), b); // echo data back to master if (pos < sizeof buf) // append to a buffer and GTFO of the interrupt { buf [pos++] = b; process_it = true; } digitalWrite(33, HIGH); // turn LED back on, we got this far.. oh my. } void loop() { delay(1000); Serial.print("*"); // in case we crash whilst LED is still on :D if (process_it) { buf [pos] = 0; for( int i=0; i<12 && i

Hextank
Пт, 07 октября 2016 г., 21:05
Это только когда дело с мастер -мысли, верно? Раб без формы CS в качестве раба был бы в значительной степени бесполезен. (с чем я имею дело)
Rogerclark написал:Не используйте SS PIN -код для CS.

Он имеет специальную функцию и не предназначен для использования в качестве CS.

В основном это некоторая странная функция, разработанная STM, которую никто другой не использует.

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

Rogerclark
Пт, 07 октября 2016 г. 11:04
Мы должны использовать GPIO для управления CS, и мы не можем использовать SS PIN -код для этого, так как MCU, кажется, случайным образом переопределяет настройки GPIO

Это известная ошибка для устройства F103, на которое многие люди (не только пользователи Arduino) жаловались на ST на.

Но из того, что я помню, ST говорит, что то, как он работает, «по дизайну» (хотя это выглядит как ошибка)


Так что просто используйте другой пин -код CS и используйте DigitalWrite для управления его

Примечание. Для некоторых устройств аппаратный SS PIN -код просто не работает из -за времени. я.E NSS может снизиться всего за несколько нс до того, как данные будут выполнены, и я знаю, по крайней мере, одно устройство, которое требует задержек между CS, опускающим

Hextank
Сб 8 октября 2016 г. 14:35
Rogerclark написал:Так что просто используйте другой пин -код CS и используйте DigitalWrite для управления его

Hextank
Пн 12 декабря 2016 г., 20:47
Похоже, что мне нужно получить USSerial Work и получить новую кодовую базу, я потерял функциональность SPI, теперь я не могу вспомнить, если бы я сделал эти исправления локально, или база кода была изменена.

Несмотря на это, у меня нет этой кодовой базы, настраиваемой через GIT (я загружаю как ZIP), так что это изменения, которые, возможно, должны перейти на кодовую базу для работы SPI Slave для работы. К счастью, я поддерживал рабочую версию, чтобы я мог сделать различие, иначе я прямо сейчас плачу. ;)

Это нижняя из двух, которые необходим, тот, у кого есть _currentsetting->DataSize IS.

Diff -r Adware/arduino_stm32/stm32f1/библиотеки/spi/src/spi.CPP Hardware_2/arduino_stm32/stm32f1/библиотеки/spi/src/spi.CPP
145C145
< uint32 flags = ((_currentsetting->bitorder == msbfirst ? Spi_frame_msb: spi_frame_lsb) | Spi_dff_8_bit | Spi_sw_slave | Spi_soft_ss);
---
> uint32 flags = ((_currentsetting->bitorder == msbfirst ? Spi_frame_msb: spi_frame_lsb) | _currentsetting->DataSize | Spi_sw_slave | Spi_soft_ss);
153d152
<
160,164D158
< if (_currentsetting->DataMode >= 4) {
< Утверждение (0);
< возвращаться;
< }
< uint32 flags = ((_currentsetting->bitorder == msbfirst ? Spi_frame_msb: spi_frame_lsb) | Spi_dff_8_bit/* | Spi_cr1_ssi | Spi_sw_slave*/);
166a161
> uint32 flags = ((_currentsetting->bitorder == msbfirst ? Spi_frame_msb: spi_frame_lsb) | _currentsetting->DataSize | Spi_sw_slave);
198C193,194

Стивестронг
Пн 12 декабря 2016 г., 11:53 вечера
Hextank написал: > uint32 flags = ((_currentsetting->bitorder == msbfirst ? Spi_frame_msb: spi_frame_lsb) | _currentsetting->DataSize | Spi_sw_slave);
198C193,194

Hextank
Вт 13 декабря 2016 г. 12:46
Это работает со SPI_SW_SLAVE, этот флаг отсутствует в GitHub, и это то, что у меня было ранее, я также меняюсь, чтобы взять наборы настройки, а не исправить. Что RX приносит только на стол? Я думал, что только что сделал коммунируемые наполовину дуплекс, вы предполагаете, что они взаимозаменяемые?

Стивестронг
Вт 13 декабря 2016 г. 8:20 утра
Hextank написал:Он работает со SPI_SW_SLAVE

Hextank
Вт 13 декабря 2016 г. 10:49
Извините, Diff немного запутан, в основном источник тока в GitHub не будет работать правильно, как SPI Slave, SS полностью игнорируется, и доска активна, как и в случае, MISO активен, что противоречит любым другим подключенным устройствам.

Установка spi_sw_slave заставляет плату ведут себя правильно, как и в приличном, чтобы SS был высоким (отключенным) или низким (активным).
RM0008, Page734 написал:
Этот бит также полезен в многословной системе, в которой этот конкретный
Рабоев не доступен, выход из подчиненного раба не поврежден.
Да, потому что вы теряете отправку и получение одновременно, полный дуплекс.

Стивестронг
Вторник 13 декабря 2016 г. 12:11
Hextank написал:...Ток -источник в GitHub не будет работать правильно, как SPI Slave...
...Настройка SPI_SW_SLAVE заставляет плату вести себя правильно...

Hextank
Вт 13 декабря 2016 г. 12:39
Закрыть, spi_sw_slave | SPI_SOFT_SS установлен в Spiclass: UpdateSettings () Ни один из них не установлен в Spiclass :: BeginSlave ().

Единственное изменение, которое действительно повлияет на работу, а не на работу, - это применение SPI_SW_SLAVE в Spiclass: BeginSlave.

UpdateSettings () также использует _currentsetting->DataSize, а не SPI_DFF_8_BIT, который я также изменил в BERNINSLAVE (), это не повлияет на пренебрежение SS, но, тем не менее, является несоответствием.

Стивестронг
Вторник 13 декабря 2016 12:52
HM, извините, но я не вижу здесь никаких расхождений, размер данных (DFF) и SSM, кажется, не имеет ничего общего.
И Я сейчас использую SPI Slave Application, где я устанавливаю ssm = 0. И работает, потому что я применяю сигнал SS от мастера к SS -штифту раба.

Hextank
Вт 13 декабря 2016 г., 13:06
Размер будет влиять только в том случае, если вы решите использовать 16 -битную передачу данных, что редко.

Это здорово, это работает для вас, сколько у вас рабов? У меня есть на заказ устройство с собственным рабом SPI (SD -карта), и у меня есть разрыв для дополнительных рабов SPI, а также мастер -SS, который я подключаюсь к Maple Mini, так что два раба, он не работает правильно, как SS игнорируется.

Я забрал данные через Saleae, устройство на заказ контролирует SS, если у меня нет установки SPI_SW_SLAV Когда SS высок.

Если вы тестируете только с одним рабом SPI в сети SPI, тест неверен.

Кроме того, чтобы уточнить, не работая, я имею в виду, что в автобусе SPI есть споры, поэтому, когда я разговариваю с другим рабом SPI, они оба активны в автобусе.

Стивестронг
Вторник 13 декабря 2016 г. 14:03
Хорошо, так что все становится более четко: у вас есть один мастер и два раба.

Что еще неясно, так это то, может ли Master SPI также читать данные из MM или только передает MM?
В моем случае я передаю данные только от одного мастера в один раб, поэтому я могу использовать Rxonly (выход отключен).

Кстати, функциональность штифта NSS в подчиненном режиме подробно описана на RM0008 страницах 697 и 694.
Страница 697: 4. В аппаратном режиме (см. Управление SLAVE SELECT (NSS) на стр. 694),
PIN NSS должен быть подключен к сигналу низкого уровня во время полной передачи байта
последовательность. В программном режиме NSS установите бит SSM и очистите бит SSI в SPI_CR1
зарегистрировать.
На самом деле это объясняет, что то, что вы делаете, - это программный режим (SSM = 1, SSI = 0), а также должно работать, как и ожидалось.
Я был ранее неправ, потому что я предложил SSI быть установленным на 1, но это будет означать «невыразивность». Так что правильно SSI должен быть 0 для постоянный активный выбор. Это также объясняет, почему ваш MM всегда активный на автобусе...

И на стр. 697: • Программное обеспечение NSS Management (SSM = 1)
Информация о выборе подчинений проникает внутри по цене бита SSI в
SPI_CR1 Регистр. Внешний штифт NSS остается бесплатным для других приложений.
• Аппаратное управление NSS (SSM = 0)
Возможны две конфигурации в зависимости от конфигурации вывода NSS (бит SSOE
в регистрации spi_cr2).
- Включен выход NSS (ssm = 0, ssoe = 1)
Эта конфигурация используется только тогда, когда устройство работает в главном режиме. А
Сигнал NSS приводит к низкому управлению, когда мастер запускает связь и сохраняется
низкий, пока SPI не отключен.
- Вывод NSS отключен (ssm = 0, ssoe = 0)
Эта конфигурация обеспечивает возможность мультимастера для устройств, работающих в мастер -
режим. Для устройств, установленных в качестве рабов, PIN NSS действует как классический вход NSS:
раб выбран, когда NSS низкий и отпущен, когда NSS High.
Это то, что я использую, управление аппаратным обеспечением (ssm = 0, [ssi = x], ssoe = 0): когда входной штифт ss низкий, тогда мой рабов выбирается и получает передаваемые данные.

Hextank
Вторник 13 декабря 2016 г., 14:32
Да, мастер оба отправляются и получают (в основном он получает данные от MM, так как я использую их в качестве виртуальной SD -карты, которая фактически впрыскивает данные с ПК - который в настоящее время работает благодаря консультам последовательных вопросов - спасибо тоже - спасибо этого :) ), это для мультиплекса данных, так что это быстрее.

Хорошо, это работает, потому что это должно, но в программном обеспечении. Я бы предпочел, чтобы это было оборудованием, и я даже не уверен, как я оказался тем, что я сделал, это могло быть случай, когда я увидел прокомментированный SPI_CR1_SSI и SPI_SW_SLAV. :)

Правильно, так что SPI_SW_SLAVE не активен, а SSI - 0 означает, что именно там произошло утверждение, потому что это всегда было живым? Хорошо, это имеет смысл. Так что это означает, что правильная вещь, которую нужно было сделать, было бы установить spi_cr1_ssi? (В настоящее время я переписал свой эскиз в данный момент, так что пока еще не в состоянии проверить)

Спасибо за помощь, кстати, очень ценится. Он действительно задает вопрос о том, следует ли менять библиотеку SPI.

Стивестронг
Вт 13 декабря 2016 г. 15:05
Ваша проблема с программным управлением SPI, устанавливая сигнал SS, всегда активен на программное обеспечение, заключается в том, что вы непрерывно зарезервируете/блокируете шину SPI, противоречащий другим рабам.

Если Master может иметь возможность читать данные из рабов, не устанавливайте PIN SPI_RXONLY PIN.

Поскольку раб обычно не знает, когда именно мастер хочет общаться с ним, я настоятельно бы предложил использовать управление выводами HW SS, установив SPI_SW_SLAV Мастер -контроль потребности.
Мастер должен выборочно выбрать того или другого раба, как вы уже знаете, но только один в то время.

До сих пор я не могу понять, зачем изменить программное обеспечение SPI, ваши потребности могут быть удовлетворены в целом фактическим программным обеспечением.
Или вы чувствуете, что чего -то не хватает?

Hextank
Вторник 13 декабря 2016 г. 15:20
О, чувак, так что это был на самом деле случай удаления SPI_SW_SLAVE | Spi_soft_ss от spiclass: updatestiting () и оставить spiclass :: beginslave ()? Я только что попробовал это, и оба рабовладельца играют хорошо, хотя, как вы можете себе представить, у меня мало веры. :)

Что касается класса SPI, было бы неплохо установить, является ли это программным обеспечением / HW Slave в самом классе, а не пытаться переопределить его снаружи в классе.

Стивестронг
Вторник 13 декабря 2016 г., 16:02
Hextank написал:... Хотя, как вы можете себе представить, у меня мало веры. :)

Hextank
Вторник 13 декабря 2016 г. 16:16
Ну, я многое знал, и я думаю, что главная проблема заключается в том, почему обновления наступают, так как это главная часть, мне нужно получить мне Stlink, чтобы помочь мне отладить эти вещи.

Но при догадании, как я использую SPI1 с
SPI.setModule(1); SPI.beginSlave(); spi_irq_enable(SPI.dev(), SPI_RXNE_INTERRUPT);

Стивестронг
Ср 14 декабря 2016 г. 9:36 утра
Действительно, SPI автоматически настраивается в главном режиме при включении SPI.H в эскизе.
Таким образом, вы должны перепрограммировать его в рабыню, и призыв BeginsLave () должен сделать перепрограммирование.
setModule () необходим только тогда, когда вы используете SPI2.