Page 1 of 1
How to set the maximum SPI speed for HAL-Core?
Posted: Thu Nov 05, 2020 5:29 pm
by blue-man
I want to use an ILI9341 display and i am glad that it directly works using this example:
https://create.arduino.cc/projecthub/te ... lay-78e1c3
But i wonder that the graphics are slower with an Blue-Pill than showed in the Video of the example for an Arduino:
https://www.youtube.com/watch?v=my83ggtQfiA
I tried to adjust the SPI-speed like in the example of this thread:
viewtopic.php?p=2823#p2823
Code: Select all
SPI.begin(); //Initialize the SPI_1 port
SPI.setClockDivider(SPI_CLOCK_DIV2); // High speed (72 / 2 = 36 MHz SPI_1 speed)
tft.begin();
but it seems to make no difference.
(It makes no difference if the SPI.setClockDivider is done before or after the tft.begin.)
What i am doing wrong?
Here's the complete example including the compiled output:
- ILI9341.zip
- SPI Display Test with ILI9341
- (84.21 KiB) Downloaded 557 times
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Thu Nov 05, 2020 5:36 pm
by blue-man
Here are the results of the benchmarks:
Code: Select all
Benchmark Time (microseconds)
Screen fill 3209532
Text 186241
Lines 1690966
Horiz/Vert Lines 267624
Rectangles (outline) 169832
Rectangles (filled) 6662453
Circles (filled) 795866
Circles (outline) 745934
Triangles (outline) 384408
Triangles (filled) 2190194
Rounded rects (outline) 340407
Rounded rects (filled) 6634961
Done!
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Thu Nov 05, 2020 7:56 pm
by GonzoG
No matter how you set SPI. This library has own settings and it's for Arduino AVR boards so it uses 8MHz for SPI speed.
Use this library:
https://github.com/Bodmer/TFT_eSPI
It's for STM32 (also) and you can set SPI speed.
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Fri Nov 06, 2020 8:55 am
by blue-man
Thank you for the hint!
This library is much better.
There is the same example (TFT_graphicstest_PDQ) with extended tests in it.
The results are now:
Code: Select all
#define SPI_FREQUENCY 55000000
Benchmark Time (microseconds)
HaD pushColor 1421621
Screen fill 77519
Text 89028
Pixels 1786829
Lines 1855724
Horiz/Vert Lines 41798
Rectangles (outline) 27787
Rectangles (filled) 808001
Circles (filled) 211429
Circles (outline) 286212
Triangles (outline) 108349
Triangles (filled) 372466
Rounded rects (outline) 130403
Rounded rects (filled) 863916
Done!
So a screen fill is now factor 41.4 faster and other operations like circles filled 3.8 faster.
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Fri Nov 06, 2020 9:35 am
by blue-man
What is the correct method to set the SPI speed when the TFT library is not used?
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Fri Nov 06, 2020 1:08 pm
by fpiSTM
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Fri Nov 06, 2020 4:20 pm
by blue-man
O.K. Thanks.
But how the parameters have to be set?
Syntax
SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))
Note: Best if all 3 settings are constants
SPISettings mySettting(speedMaximum, dataOrder, dataMode)
Note: Best when any setting is a variable''
Parameters
speedMaximum: The maximum speed of communication. For a SPI chip rated up to 20 MHz, use 20000000.
In ~/.arduino15/packages/STM32/hardware/stm32/1.9.0/libraries/SPI/src/utility/
spi_com.h i can find
Code: Select all
///@brief specifies the SPI speed bus in HZ.
#define SPI_SPEED_CLOCK_DEFAULT 4000000
#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)2)
#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)4)
#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)8)
#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)16)
#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)32)
#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)64)
#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)128)
#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)256)
so it is not clear if the settings should be 35000000 for a clock divided by 2 or if the definitions for the divider like SPI_SPEED_CLOCK_DIV2_MHZ are better used?
Re: How to set the maximum SPI speed for HAL-Core?
Posted: Fri Nov 06, 2020 4:23 pm
by blue-man
Is there another recommendation for a better SD library <SD.h> ?
I think here is the same problem setting the SPI-speed like in the TFT library.
Has someone tested this one ?
https://sparklogic.ru/working-ported-li ... t-dma.html
https://github.com/greiman/SdFat
The hardware interface to the SD card should not use a resistor based level shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal rise times that are too slow for the edge detectors in many newer SD card controllers when resistor voltage dividers are used.