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
Со 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сек (эксклюзивные накладные расходы)..
Вы не получите точное 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 против 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 () и делать другие вещи после этого ..
Не уверен, как функция uint8 dmatransfer (uint8 *dersmitbuf, uint8 *cretebuf, uint16 длина); на самом деле работает - как это кажется из времени, он блокирует.
Я понимаю, что вы разберили данные через SPI.dmatransfer () и делать другие вещи после этого ..
STM32_Discoverer
Солнце 01 января 2017 г. 15:41
Большое спасибо за информацию
Стивестронг
Солнце 01 января 2017 16:39
Даниэфф написал:Я не знаю, почему это не называется SPI.Передача (буфер, размер), как в ссылке Arduino.