Fast SPI на STM32F103CBT6

STM32_Discoverer
Солнце 01 января 2017 г. 10:59
Привет, ребята, я читал, что SPI STM32F104CBT6 может работать с частотой 36 МГц, но стандартная инициализация режима SPI в Arduino IDE обеспечивает только 18 МГц скорость. Этот процессор имеет 2 аппаратного интерфейса SPI, но, как я понимаю, только один из них работает со скоростью 36 МГц.Вот стандартный код инициации от Arduino IDE - STM32F1 Библиотека.Есть ли настройки SPI для работы со скоростью 36 МГц ?Я использую Arduino IDE 1.6.5. #include #define SPI1_NSS_PIN PA4 //SPI_1 Chip Select pin is PA4. You can change it to the STM32 pin you want. #define SPI2_NSS_PIN PB12 //SPI_2 Chip Select pin is PB12. You can change it to the STM32 pin you want. SPIClass SPI_2(2); //Create an instance of the SPI Class called SPI_2 that uses the 2nd SPI Port byte data; void setup() { // Setup SPI 1 SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI.setClockDivider(SPI_CLOCK_DIV2); // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed) pinMode(SPI1_NSS_PIN, OUTPUT); // Setup SPI 2 SPI_2.begin(); //Initialize the SPI_2 port. SPI_2.setBitOrder(MSBFIRST); // Set the SPI_2 bit order SPI_2.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI_2.setClockDivider(SPI_CLOCK_DIV2); // Use a different speed to SPI 1 pinMode(SPI2_NSS_PIN, OUTPUT); }

Пито
Солнце 01 января 2017 11:56 утра
http: // www.STM32duino.com/viewtopic.PHP?T = 1495#P19393

Со SPI1 SPI.setClockDivider(SPI_CLOCK_DIV2); // (72 MHz / 2 = 36MHz)

STM32_Discoverer
Солнце 01 января 2017 12:22
Хорошо, я пытаюсь сделать некоторый тест на это, и что у нас есть? void loop() { duration=micros(); for (int i=0;i<1000;i++){ data = SPI.transfer(0xFF); } duration=micros()-duration; Serial.println(duration); }

Пито
Солнце 01 января 2017 12:25
Вы должны вычесть время for_loop.. Также призыв к трансферной функции занимает некоторое время.
Вы не получите точное 2 -кратное ускорение, конечно.
Лучше всего посмотреть на часы SPI с LA или O'Scope.
Кстати, чтобы перевести 1000bytes @ 36 МГц, займет около 250сек (эксклюзивные накладные расходы)..

STM32_Discoverer
Солнце 01 января 2017 12:35
Как насчет SPI с DMA.Может это увеличить скорость передачи?

STM32_Discoverer
Солнце 01 января 2017 12:43
На самом деле, мы должны перенести 1000 байт 1312 микросекунд, я думаю, что это слишком много

Пито
Солнце 01 января 2017 13:05
К вашему сведению - с вашим кодом выше
Spi12 trx vs clk.jpg
SPI12 TRX против CLK.JPG (69.82 киб) просмотрено 1146 раз

STM32_Discoverer
Солнце 01 января 2017 13:23
Спасибо за визуальное представление, но как ускорить передачу SPI1, по крайней мере, до 2x

Пито
Солнце 01 января 2017 13:38
: идея:
1. Используйте DMA
2. Оптимизируйте SPI.Transfer () [т.е. Разверните петлю, используйте SPI FIFO, если доступно, и т. Д.]
3. Используйте F407+

Даниэфф
Солнце 01 января 2017 13:48
STM32_Discoverer написал:Спасибо за визуальное представление, но как ускорить передачу SPI1, по крайней мере, до 2x

Пито
Солнце 01 января 2017 14:06
Обновленная таблица со SPI.написать (buf, размер).

STM32_Discoverer
Солнце 01 января 2017 14:20
Но как активировать передачу DMA на SPI1?

Пито
Солнце 01 января 2017 14:21
Обновленная таблица со SPI.Dmatransfer (Buft, Bufr, 1000) :)
uint8 bfs[1000]; uint8 bfr[1000]; void loop() { uint32 duration = micros(); // for (int i = 0; i < 1000; i++){ // data = SPI.transfer(0xFF); // } // SPI.write(bfs, 1000); SPI.dmaTransfer(bfs, bfr, 1000); duration = micros() - duration; Serial.println(duration); }

STM32_Discoverer
Солнце 01 января 2017 14:26
Пито написал:Обновленная таблица со SPI.Dmatransfer (Buft, Bufr, 1000) :)

STM32_Discoverer
Солнце 01 января 2017 г. 15:05
Bufs и Buft в SPI.Dmatransfer должен быть такого же размера?

Пито
Солнце 01 января 2017 г. 15:29
SPI отправляет и получает параллельно, поэтому буферы должны быть такого же размера.

Не уверен, как функция uint8 dmatransfer (uint8 *dersmitbuf, uint8 *cretebuf, uint16 длина); на самом деле работает - как это кажется из времени, он блокирует.
Я понимаю, что вы разберили данные через SPI.dmatransfer () и делать другие вещи после этого ..

STM32_Discoverer
Солнце 01 января 2017 г. 15:41
Большое спасибо за информацию ;)

Стивестронг
Солнце 01 января 2017 16:39
Даниэфф написал:Я не знаю, почему это не называется SPI.Передача (буфер, размер), как в ссылке Arduino.

SPI DMA функции