Полный глупый вопрос о втором порту SPI

Мадиас
Вторник 5 мая 2015 г., 21:28
Хорошо, уже поздно, и я мгновенно запутался:
Как я могу настроить с библиотекой SPI второй порт SPI?
*стыд*

Мадиас
Вторник 5 мая 2015 г. 22:01
Хорошо, тем временем я не нашел свой вопрос «глупым»
Он должен быть настроен с помощью Spiclass (<порт>), но это не будет функционировать:
Попробуйте простой "Spiclass (1).начать »(= эквивалентно. к SPI.начать) разбить клен...

Rogerclark
Вторник 5 мая 2015 г. 22:16
Матиас

Я посмотрел на это некоторое время назад.

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

Я уверен, что искал метод (не уверен, что я, возможно, опубликовал в старой ветке форума Arduino)

В любом случае. Я думаю, что лучшее решение - просто дублировать SPI LIB и назвать его SPI2

эн.фон.

#включать <SPI2.час>

Но вопрос в том, должна ли глобальная переменная SPI должна быть названа SPI или мы должны назвать это SPI2

Я думаю, что называть это SPI2, вероятно, будет лучше, иначе у вас не может быть 2 канала SPI одновременно одновременно

В качестве альтернативы, у нас есть версия SPI, которая не имеет глобального конструктора, и вы должны вручную построить класс

Жаль, что Ардуино решил использовать глобальный конструктор.


Ах, я частично помню сейчас.

Я пытался поместить #IFDEF в SPI, чтобы остановить называться глобального конститутора, чтобы я мог вручную построить его в коде, но я не думаю, что это возможно

Если вы поместите #define no_global_constructors в эскиз, он не поднят библиотекой,

Либера

Это должен быть вариант меню, но это плохие новости.

Я не пытался включить еще один заголовок E.глин. #include no_global_constructors.h, который будет определять, no_global_constructors
Я думаю, это стоит пойти.

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

Мадиас
Вторник 5 мая 2015 г. 22:25
Роджер, спасибо за ответ,
ха -ха -ха...И я действительно думал, я злюсь :)
ОК: Я не вижу проблем в дублирующей библиотеке SPI2 (и думаю далее: SPI3), чтобы вы могли включить, легко разные настройки DMA
Я тестировал только все нуклео, так что я уверен, что я первый работаю с двумя отдельными портами SPI...Но (как часто я пишу ", но"?)
НО:
Практически у меня есть один сценарий для использования 2 портов SPI:
Экран TFT
SD-карта
Возможно, SD-карта слишком медленная с высокой тактовой частотой TFT, поэтому вы можете выбрать более медленную скорость для SD-карты, не замедляя все это и/или использовать разные настройки DMA.

Rogerclark
Вторник 5 мая 2015 г. 11:35
Матиас

Нет. ты не сходишь с ума ;-)

Я помню, что кто -то еще задал мне тот же вопрос

Возможно, мы сможем получить немного отзывов сообщества

эн.глин.
Должны ли мы иметь
#включать <SPI2.час>

который имеет глобальный VAR SPI2

#включать <SPI3.час>

который имеет глобальный VAR SPI3

Звучит как лучший вариант, хотя код будет дублироваться, что означает, что любое изменение в SPI1 должно быть скопировано в SPI2 и т. Д

victor_pv
Ср. 06 мая 2015 12:09
Мадиас я подумал в том же сценарии, SPI1 для TFT и SPI2 для SDCARD.

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

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

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

Это мои 2 цента.

Rogerclark
Ср. 6 мая 2015 г., 21:29
Я согласен, что мы могли бы сделать с библиотеками, которые не проводят глобальное экземпляр

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

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

Возможно, это вопрос для раздела программирования на форуме Arduino, но в прошлый раз я разместил тот же вопрос, люди считали, что это не ардуино, поэтому я не получил никаких полезных ответов

Мадиас
Ср. 06 мая 2015 г., 21:32
Я играю вокруг, чтобы заставить порт SPI#2 работал над моим нуклео, я думаю, что я не могу возражать на возрасте, поэтому я обязательно настрою библиотеку SPI:
Правильно ли настройка SPI2 только при изменении последней строки (544 трудно найти!) в SPI.CPP от xxx@wopr:~/Arduino/hardware/Arduino_STM32/tools$ file linux/* linux/45-maple.rules: ASCII text linux/49-stlinkv1.rules: ASCII text linux/49-stlinkv2-1.rules: ASCII text linux/49-stlinkv2.rules: ASCII text linux/dfu-util: directory linux/install.sh: POSIX shell script, ASCII text executable linux/jlink_upload: Bourne-Again shell script, ASCII text executable linux/maple_upload: Bourne-Again shell script, ASCII text executable linux/readme.txt: ASCII text, with no line terminators linux/serial_upload: Bourne-Again shell script, ASCII text executable linux/src: directory linux/stlink: directory linux/stlink_upload: Bourne-Again shell script, ASCII text executable linux/stm32flash: directory linux/upload-reset: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=dc8dc5ad6de94179a9d534b1a34aeb6d906640b1, not stripped linux/upload_router: Bourne-Again shell script, ASCII text executable xxx@wopr:~/Arduino/hardware/Arduino_STM32/tools$ file linux64/* linux64/45-maple.rules: ASCII text linux64/49-stlinkv1.rules: ASCII text linux64/49-stlinkv2-1.rules: ASCII text linux64/49-stlinkv2.rules: ASCII text linux64/dfu-util: directory linux64/install.sh: POSIX shell script, ASCII text executable linux64/maple_upload: Bourne-Again shell script, ASCII text executable linux64/readme.txt: ASCII text, with no line terminators linux64/serial_upload: Bourne-Again shell script, ASCII text executable linux64/src: directory linux64/stlink: directory linux64/stlink_upload: Bourne-Again shell script, ASCII text executable linux64/stm32flash: directory linux64/upload-reset: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=dc8dc5ad6de94179a9d534b1a34aeb6d906640b1, not stripped linux64/upload_router: Bourne-Again shell script, ASCII text executable xxx@wopr:~/Arduino/hardware/Arduino_STM32/tools$

Mrburnette
Ср. 6 мая 2015 г., 22:59
Мадиас написал:<...>

Edit2: Думание далее: ОК, равны, мы обрабатываем два (или более) порта SPI одновременно, всегда будет необходимость перенастроить используемые библиотеки, потому что все они связаны с «SPI». Так что, может быть, мы «объявляем» SPI2 как порт хранилища SPI (SD -карты, Flash Ram,....)?

Мадиас
Чт, 7 мая 2015 г., 6:07
Хорошо, я думаю, могут быть некоторые возможности:
Мы должны изучить «Energia» и «Chipkit», как они обрабатывают SPI с несколькими портами.

Rogerclark
Чт, 7 мая 2015 г., 6:57
Как они это делают ???

Мадиас
Чт, 7 мая 2015 г., 9:04
ОК, Chipkit использует отдельную библиотеку (DSPI), а Energia (на Stellaris/Tiva) использует параметр «Select Module»:
https: // github.com/energia/energia/дерево ... Спутники/SPI - Я не знаю, как/если мы получим выгоду от этого.

РЕДАКТИРОВАТЬ: Но Mabye это лучше использовать один порт SPI и использовать/реализовать транзакции:
https: // www.PJRC.com/teensy/td_libs_spi.HTML
#define LEDPIN PC13 bool isOn = true; // TestClass class myClass2 { public: myClass2(){}; ~myClass2(){}; uint8_t content = 0; //uint16_t content = 0; //uint32_t content = 0; }; class myClass { public: myClass(){}; ~myClass(){}; //uint8_t content = 0; //uint16_t content = 0; //uint32_t content = 0; myClass2 content; }; // GetFreeRAM #ifdef __arm__ // should use uinstd.h to define sbrk but Due causes a conflict extern "C" char* sbrk(int incr); #else // __ARM__ extern char *__brkval; #endif // __arm__ int getFreeRam() { char top; #ifdef __arm__ return (int)(&top - reinterpret_cast(sbrk(0))); #elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151) return &top - __brkval; #else // __arm__ return __brkval ? &top - __brkval : &top - __malloc_heap_start; #endif // __arm__ } uint32_t count; uint32_t count_max = 2000; myClass **classArray; void setup() { Serial.begin(115200); pinMode(LEDPIN,OUTPUT); Serial.println(F("Setup")); count = 1; delay(2000); } void loop() { // Check count max if (count >= count_max) { count = 0; // SoftwareReset Test #ifdef _LIBMAPLE_NVIC_H_ nvic_sys_reset(); #endif #ifdef __CORE_CM3_H_GENERIC NVIC_SystemReset(); #endif return; } // Report count Serial.print("Count: "); Serial.println(count); // Report Basic Size Serial.print("sizeof(myClass*): "); Serial.println(sizeof(myClass*)); Serial.print("sizeof(myClass): "); Serial.println(sizeof(myClass)); // Create the class array classArray = (myClass**)malloc(count * sizeof(myClass*)); for (uint32_t i = 0; i < count; i++) { classArray[i] = new myClass(); } // Report FreeRam Serial.print("CreateFreeRam: "); Serial.println(getFreeRam()); digitalWrite(LEDPIN, isOn); isOn = !isOn; // Clear the class array for (uint32_t i = 0; i < count; i++) { delete(classArray[i]); } free(classArray); // Report FreeRam Serial.print("ResetFreeRam: "); Serial.println(getFreeRam()); // Loop Delay delay(50); count+=10; }