Какой лучший способ написать драйверы, которые могут использовать как SPI1, так и SPI2?

victor_pv
Вт 16 июня 2015 г., 16:03
У нас есть как минимум 2 порта SPI в MCU STM32F1 (и то же самое касается I2C), но большинство библиотек написаны для Just Spi.

Как бы лучший способ сделать библиотеки совместимым с обоими портами, и облегчить выбор, какой из них использовать?

Очевидный простой способ - заменить SPI.Передача и т. д. для чего -то вроде SPI_DISPLAY.Передача, в значительной степени то, что все делают с серийным.Печать, отладка.Печать и т. Д., И иметь #Define в верхней части файла заголовка, но определенно не самый элегантный. что -то такое, как:
#define spi_display spi
или
#define spi_display spi2

Какие еще простые, в основном у нас есть способы, чтобы библиотеки совместимы с обоими портами SPI, в то же время не изменяя их настолько, что существующие наброски или примеры должны сильно изменить. Любой?

Martinayotte
Вт 16 июня 2015 г., 17:19
Привет, Виктор,

Это большой вопрос ...
Другая ветка ViewTopic.PHP?f = 13&t = 53&начало = 30, который обсуждал о глобальной экземпляре и #ifdef, приносят один и тот же вопрос.
В моем случае, в моем NetDuino2plus у меня есть 3 SPIS, один для SDCARD, для ENC28J60, а третий - свободно использовать на контактах с заголовком.
Я предложил Роджеру начать еще одну ветку об этой потенциальной "банке червей".
В то же время, я думаю, что мы не имеем большого выбора настраивать основные файлы в соответствии с нашими потребностями.

Mrburnette
Вт 16 июня 2015 г., 17:27
Martinayotte написал:...
Я предложил Роджеру начать еще одну ветку об этой потенциальной "банке червей".
В то же время, я думаю, что мы не имеем большого выбора настраивать основные файлы в соответствии с нашими потребностями.

Martinayotte
Вт 16 июня 2015 г., 17:40
Привет, Рэй,

Я полностью согласен, и речь идет не только о основных файлах, но и библиотеках тоже.
Например, как мы можем получить SD Lib и Ethernet LIB на отдельных SPI одновременно, если оба используют один и тот же глобальный экземпляр SPI ?
Ссылка, которую вы предоставляете, просто показывает, что мы можем изменить булавки, но ничего не упоминается о кратных экземплярах.
Это действительно «банка червей», с которой сталкивается даже сообщество Arduino, но никаких реальных ответов на вопрос. :(
Это уверен, что мы можем скопировать/вставить либера.
Я хочу иметь все элементы управления в самом эскизе, но я не знаю, сможем ли мы этого добиться.

victor_pv
Вт 16 июня 2015 г., 17:52
Mrburnette написал:Martinayotte написал:...
Я предложил Роджеру начать еще одну ветку об этой потенциальной "банке червей".
В то же время, я думаю, что мы не имеем большого выбора настраивать основные файлы в соответствии с нашими потребностями.

Рик Кимбалл
Вт 16 июня 2015 г. 18:36
Мы могли бы посмотреть на порт Energia для вдохновения. Им пришлось решить многие из этих проблем с первого дня. Это началось с другой архитектуры с самого начала, а затем переехал на кору коры позже.

В Energia они добавили SPI.Метод setModule () для плат коры Arm Cortex-M4F. Этот метод позволяет переключаться между массивом устройств SPI. У них есть таблица, которая отображает номера штифтов платы на различные выводы SPI. Так Spi.SetModule (0); выбирает Spi1, spi.SetModule (1); выбирает SPI2. Я не смотрел детали и не использовал их.

-рик

Martinayotte
Вт 16 июня 2015 г. 18:51
Привет, Рик,

Как вы думаете, это может быть выполнимо в контексте того, чтобы все было сделано в эскизе и вообще не прикасается ?

Рик Кимбалл
Вт 16 июня 2015 г. 18:56
Я думаю, что намерение в том, что вы называете SPI.SetModule (x), прежде чем вы позвоните в что -то, что использует вызовы SPI. Какой бы модуль SPI был установлен, будет использоваться тем, что делает вызовы метода SPI.

Martinayotte
Вт 16 июня 2015 г., 19:16
Я понимаю, что в контексте вызова в Setup () или Loop ().
Но как в контексте глобального конструктора, такого как SD2Card, например, ?
(Хотя это может работать, если все будет сделано в начале () вызове Setup (), если ничего не сделано в самом конструкторе, верно ? ...)

Рик Кимбалл
Вт 16 июня 2015 г., 19:21
Martinayotte написал:Я понимаю, что в контексте вызова в Setup () или Loop ().
Но как в контексте глобального конструктора, такого как SD2Card, например, ?
(Хотя это может работать, если все будет сделано в начале () вызове Setup (), если ничего не сделано в самом конструкторе, верно ? ...)

Martinayotte
Вт 16 июня 2015 г., 19:39
:ржу не могу:
Но существующие либера : o

Mrburnette
Вт 16 июня 2015 г., 8:36 вечера
Martinayotte написал::ржу не могу:
Но существующие либера : o

victor_pv
Вт 16 июня 2015 г., 20:54
Рик Кимбалл написал:Я думаю, что намерение в том, что вы называете SPI.SetModule (x), прежде чем вы позвоните в что -то, что использует вызовы SPI. Какой бы модуль SPI был установлен, будет использоваться тем, что делает вызовы метода SPI.

Рик Кимбалл
Вт 16 июня 2015 г. 20:57
Да, я думаю, так это должно работать. Я был очень активен с Energia, когда он был на MSP430 и ранней коре Arm Cortex-M4. После этого я в основном проигнорировал это, и я не пробовал на самом деле пробовал эту функцию SPI. Я просто знаю, что это была проблема в ту минуту, когда у плат TI было несколько устройств SPI, и именно так они и это касались.

0rick

Rogerclark
Вт 16 июня 2015 г. 22:46
Ребята,

Я только что заметил эту ветку. (Мне трудно отслеживать, какие темы тратить время на чтение, поэтому, если есть важная ветка, по вашему мнению, я должен прочитать, пожалуйста, не стесняйтесь написать мне в личку)

Глобальная экземпляра обсуждалась несколько раз раньше, и нет хорошего решения.

Добавление материала CS PIN (Dueeddended Finationaltion) - это мечовый меч. Я не думал, что существующие SPI Libs на AVR вообще контролировали PIN -код CS.
Может кто -нибудь подтвердить это ?


Мы не можем использовать аппаратный штифт NSS, так как в оборудовании STM32 есть ошибка / функция, которая означает, что он обычно не используется.

Мы могли бы поместить дополнительный код в SPI :: Transfer, чтобы установить и сбросить назначенный вывод, но, поскольку передача является байтом за раз, это значительно замедляет передачу и просто наличие оператора if, чтобы проверить, следует ли нам контролировать PIN также замедлит ситуацию заметно .

Re: spi :: setModule ()

Это было бы немного медленно.

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

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

Это, вероятно, все еще сохранит скорость в SPI :: Transfer, но мне нужно было посмотреть на код, чтобы убедиться

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

Martinayotte
Ср 17 июня 2015 г. 12:33
Rogerclark написал:Я только что заметил эту ветку. (Мне трудно отслеживать, какие темы тратить время на чтение, поэтому, если есть важная ветка, по вашему мнению, я должен прочитать, пожалуйста, не стесняйтесь написать мне в личку)

Rogerclark
Ср 17 июня 2015 г. 12:50
Мартин

Re: медлительность

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

Я согласен.

Если мы реализуем
#include // Core graphics library #include // Hardware-specific library #include // For the breakout, you can use any 2 or 3 pins // These pins will also work for the 1.8" TFT shield #define TFT_CS PA4 #define TFT_RST PA3 // you can also connect this to the Arduino reset // in which case, set this #define pin to 0! #define TFT_DC PA2 // Option 1 (recommended): must use the hardware SPI pins // (for UNO thats sclk = 13 and sid = 11) and pin 10 must be // an output. This is much faster - also required if you want // to use the microSD card (see the image drawing example) Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // Option 2: use any pins but a little slower! #define TFT_SCLK 5 // set these to be whatever pins you like! #define TFT_MOSI 7 // set these to be whatever pins you like! //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); float p = 3.1415926; void setup(void) { //Serial.begin(9600); //Serial.print("Hello! ST7735 TFT Test"); // Use this initializer if you're using a 1.8" TFT tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab // Use this initializer (uncomment) if you're using a 1.44" TFT //tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, black tab //Serial.println("Initialized"); uint16_t time = millis(); tft.fillScreen(ST7735_BLACK); time = millis() - time; //Serial.println(time, DEC); delay(500); // large block of text tft.setTextSize(3); tft.fillScreen(ST7735_BLACK); testdrawtext("Hello World, Name: Sagar Saste, Email: [email protected], mob-8689823449,", ST7735_RED); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); }

Рик Кимбалл
Ср 17 июня 2015 г. 1:14
Я думаю, ты переживаешь это думать об этом ...

Вот что они делают:

https: // github.com/energia/energia/blob ... Пик.CPP#226

Martinayotte
Ср 17 июня 2015 г. 1:21
Привет, Роджер,

Re: булавки и шипы,
Это уже члены класса SPI, так что это не проблема, хотя он также должен стать массивом (в зависимости от реализации, поскольку текущий класс SPI может стать классом Spiport, а класс SPI может стать родителем с массив шипора)
Для потребления оперативной памяти, возможно, есть способы не выделять их до фактического SPI.begin () был вызван для конкретного номера порта, который также оставляет возможность для обратной Compatibilty, если Spi.setModule () никогда не называется, он всегда будет использовать Spidev [0].

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

Я не могу понять, что такой мозговой штурм никогда не стал плодотворным для таких досок, как Mega или Deady, проблема существует с многих лет. :?

Как сказал Виктор в первом посте, В значительной степени то, что все делают с серийным.Печать, отладка.печать, Сколько раз мы столкнулись.
Недавно, лично, чтобы отладить SD Lib в соответствии с NetDuino2plus, мне пришлось заменить все серийные.printf в serialusb.printf (но не совершайте их) ...
Итак, если наш рецепт работает для SPI, мы можем даже применить то же самое к серийному ... Но это еще один ... ;)

Martinayotte
Ср 17 июня 2015 г. 1:24
Привет, Рик,
Рик Кимбалл написал:Я думаю, ты переживаешь это думать об этом ...

Вот что они делают:

https: // github.com/energia/energia/blob ... Пик.CPP#226

Rogerclark
Ср 17 июня 2015 г. 1:31
Они используют массив структур / поставки
Adafruit_ST7735::Adafruit_ST7735(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160) { _cs = cs; _dc = dc; _rst = rst; hwSPI = true; SPI.begin(); _sid = _sclk = -1; }

Martinayotte
Ср 17 июня 2015 г., 1:51
Может быть, я падаю спать, я вижу только множество базовых адресов здесь ... :(

Хорошо знать, что вы, кажется, день, который легко сделать. :)

Rogerclark
Ср 17 июня 2015 г. 1:57
ммм

Похоже на несколько массивов
/*************************************************** This is a library for the Adafruit 1.8" SPI display. This library works with the Adafruit 1.8" TFT Breakout w/SD card ----> http://www.adafruit.com/products/358 The 1.8" TFT shield ----> https://www.adafruit.com/product/802 The 1.44" TFT breakout ----> https://www.adafruit.com/product/2088 as well as Adafruit raw 1.8" TFT display ----> http://www.adafruit.com/products/618 Check out the links above for our tutorials and wiring diagrams These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional) Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution ****************************************************/ #include // Core graphics library #include // Hardware-specific library #include // For the breakout, you can use any 2 or 3 pins // These pins will also work for the 1.8" TFT shield #define TFT_CS PA4 #define TFT_RST PA2 // you can also connect this to the Arduino reset // in which case, set this #define pin to 0! #define TFT_DC PA3 // Option 1 (recommended): must use the hardware SPI pins // (for UNO thats sclk = 13 and sid = 11) and pin 10 must be // an output. This is much faster - also required if you want // to use the microSD card (see the image drawing example) Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // Option 2: use any pins but a little slower! #define TFT_SCLK 5 // set these to be whatever pins you like! #define TFT_MOSI 7 // set these to be whatever pins you like! //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); float p = 3.1415926; void setup(void) { //Serial.begin(9600); //Serial.print("Hello! ST7735 TFT Test"); // Use this initializer if you're using a 1.8" TFT SPI.begin(); tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab // Use this initializer (uncomment) if you're using a 1.44" TFT //tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, black tab //Serial.println("Initialized"); uint16_t time = millis(); tft.fillScreen(ST7735_BLACK); time = millis() - time; //Serial.println(time, DEC); delay(500); // large block of text tft.setTextSize(2); tft.fillScreen(ST7735_BLACK); testdrawtext("This is demo for ST7735 TFT display bla bla :) ", ST7735_RED); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST7735_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); } tft.fillScreen(ST7735_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); } tft.fillScreen(ST7735_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); } tft.fillScreen(ST7735_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST7735_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST7735_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST7735_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST7735_BLACK); int color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST7735_BLACK); int color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST7735_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST7735_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST7735_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST7735_BLACK); tft.setTextColor(ST7735_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST7735_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST7735_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST7735_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST7735_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST7735_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN); }

Martinayotte
Ср 17 июня 2015 г., 2:33
Я не уверен, что наша проблема лежит в этих определениях контактов, так как она уже обрабатывается.
Я думаю, что вывод до сих пор (но не заключается ?

Rogerclark
Ср 17 июня 2015 г., 3:11
У класса SPI есть переменная, которая является указателем на структуру аппаратного устройства.

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

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

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

Когда вы звоните, он должен установить порядок битов, разделитель и т. Д., Поскольку они являются частью регистра управления для аппаратного обеспечения.

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

Потому что в основном Spiclass: Begin () - это то, что делает инициализация на оборудовании.

Я думаю, по крайней мере, для начала, это проще использовать класс / структуру Spisettings для хранения данных (или структуру, которая содержит указатель на структуру устройства SPI и INT для битузаторного, переключения часов и режима SPI)

Изначально мы могли бы дублировать SPI и назвать его SPI_STM.H, а затем мы можем провести независимое тестирование.
(Обратите внимание, что я мог бы поместить это в ветвь репо, но я нахожу, что большинство людей не используют GIT на своих машинах и просто загружают ZIP, поэтому добавление новой папки Tempoarary New SPI Class легче тестировать)

victor_pv
Ср 17 июня 2015 г. 13:46
Rogerclark написал:=

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

Когда вы звоните, он должен установить порядок битов, разделитель и т. Д., Поскольку они являются частью регистра управления для аппаратного обеспечения.

Рик Кимбалл
Ср 17 июня 2015 г., 16:23
Думаю, я совершенно не знаю, как работает Energia SetModule .. Я только что потратил немного времени, глядя на код более глубоко. Это действительно вызывает начало () каждый раз, и это кажется излишним и будет убийцей производительности.

Однако я думаю, что мы могли бы реализовать что -то подобное, не выполняя начало () каждый раз. Так же, как объяснил @victor_pc.Класс SPI просто должен иметь концепцию текущего периферийного устройства SPI. SetModule (x) просто изменит в настоящее время активное устройство SPI. ... Мне придется поиграть с этим, чтобы увидеть, насколько хорошо это может работать. Хех .. И да, мы должны привязать поддержку транзакций, для тех людей, использующих устройства Mulitple SPI на одном периферийном устройстве SPI.

-рик

Rogerclark
Чт 18 июня 2015 г. 1:04
Виктор

Извини. Я думаю, что не очень хорошо объяснил свои проблемы.

Да. Порядок битов и т. Д. Хранится в реестре управления SPI.

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

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

Глядя на описание того, что Spi :: begin () делает (согласно Arduino.Страница CC)
Инициализируют шину SPI, установив SCK, MOSI и SS на выходы, вытягивая SCK и MOSI Low, и SS High Что не говоря уже о том, что он также настроит делитель часов по умолчанию, а также режим по умолчанию и заказ бита по умолчанию.

Таким образом, нам нужно было бы хранить эти значения в классе SPI, чтобы их можно было использовать в Begin ()

Ну, то есть, если мы не сможем установить эти значения в конструкторе SPI, не включив SPI на . (что мы, вероятно, можем)

Но на данный момент мы не можем сделать что -то в конструкторе из -за карты пин -карты в выпуске RAM (которую у меня все еще не было времени, чтобы работать)

Если мы зафиксируем PIN_MAP на Flash, мы можем настроить по умолчанию по умолчанию для разделителя, порядка битов и режима в конструкторе, не включая устройство SPI (или активируя контакты в виде SPI, а не GPIO)

Тогда нам не нужно хранить эти VAR, так как мы можем изменить SetbitOder () и т. Д., Чтобы просто обновить биты CR, которые необходимо обновить, а не обновлять весь CR в Begin ()

Это будет означать, что то, что мы делаем в begin (), нужно изменить, чтобы не изменить порядок бита и т. Д .


Что касается использования SetModule (). Я думаю, что мы говорим, что нам нужно позвонить в SetModule, если вы использовали отдельные библиотеки, которые использовали SPI, и были жестко кодированы для использования SPI без способа установить другое устройство.

Я думаю, что это все еще может быть относительно проблематичным, если какой -либо из этих LIBS вызывает сетебийт и т. Д. В своем конструкторе. Но на данный момент либера. И независимо от того, в каком способе мы делаем что -то, это было бы проблемой, потому что порядок, в котором называются конструкторы, не определяется, и мы не знали бы состояние битузатора, которое остался с SPI1.

В любом случае, в стороне.

Я думаю, что использование setModule () стоит попробовать.

Martinayotte
Чт 18 июня 2015 г. 1:19
Привет, Роджер,
Таким образом, нам нужно было бы хранить эти значения в классе SPI, чтобы их можно было использовать в Begin () Я думаю, что это уже сделано с помощью члена Spisettings. Несмотря на то, что я не уверен, что это сделано рано, и это должны иметь значения «по умолчанию» в случае, если эндосеры никогда не устанавливают их.
Я думаю, что использование setModule () стоит попробовать. Да ! :)
Изначально мы могли бы дублировать SPI и назвать его SPI_STM.H, а затем мы можем провести независимое тестирование. Я тоже согласен с этим ! ... И как только мы обнаруживаем, что новая LIB будет обратно совместима, мы можем просто сделать переключатель.

Rogerclark
Чт 18 июня 2015 г. 12:37
Я быстро взглянул на изменение класса SPI, и, похоже, это не сложно сделать, но я сделал несколько чрезмерных поисков и заменяет, и я думаю, что мне нужно начать все сначала (завтра)

Но основной принципал, кажется, имеет множество ссоров, а также указатель на текущую настройку. Добавьте SPI_D в Spisettings и измените код, который использует SPI_D и т. Д
_currentsetting->spi_d
и т. д

Затем добавьте несколько методов SetModule (int num)
что делает

_currentsetting = &_settings [num];

Возможно, мне придется поиграть с Dereferencing E.g указатели, но я думаю, что основной принцип должен быть в порядке.

Я буду держать вас в курсе.

victor_pv
Чт 18 июня 2015 г. 14:11
Роджер, если вы создаете новую структуру, есть ли шанс, что мы можем иметь каналы TX и RX DMA для каждого порта в этой структуре?
Таким образом, функции DMASEND могут получить канал TX и RX оттуда и иметь возможность выполнять DMA для обоих портов, вместо того, чтобы в жестких кодировках SPI1 -каналах, как сейчас.

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

Я собирался использовать класс Spisettings, который уже определен в SPI.час,

И... Да, я могу добавить VAR для этих. они доска ?

Rogerclark
Чт 18 июня 2015 г., 22:39
Виктор и @all

Я начал работу, чтобы добавить SetModule () в SPI, и это как бы работает.

Хорошо. Я изменил весь код, чтобы использовать настройки в классе Spisettings (я.E struct), а SD -карта работает нормально.

Однако... Как ни странно, на моей испытательной установке с vs1053 MP3 (SPI) прикреплена к каналу SPI 2 (где я передаю указатель SPI 2 IT уже).
Он сбои полностью, как только я звоню, начинается в классе VS1053.

Я попытался сменить перемещение VS1053 на использование SPI1 (хотя и SD -карта также находится на этом канале), и она все еще вылетает (ну, возможно, она застрянет в цикле в начале () в классе VS1003

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

Rogerclark
Солнце 12 июля 2015 г. 6:37
Я опубликовал в разделе объявлений, что SPI SetModule готов к тестированию

Видеть ViewTopic.PHP?f = 16&t = 423

я.E Это работает с SD Lib, но я думаю, что мы также получаем больше проблем из -за того, что карта PIN -карты не инициализируется достаточно рано, так что это должно быть следующим, что мне нужно, чтобы попасть в репо

victor_pv
Солнце 12 июля 2015 г. 15:00
Rogerclark написал:Я опубликовал в разделе объявлений, что SPI SetModule готов к тестированию

Видеть ViewTopic.PHP?f = 16&t = 423

я.E Это работает с SD Lib, но я думаю, что мы также получаем больше проблем из -за того, что карта PIN -карты не инициализируется достаточно рано, так что это должно быть следующим, что мне нужно, чтобы попасть в репо

Таймер прерывает анализа