1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-10 14:42:08 +03:00
Commit Graph

29 Commits

Author SHA1 Message Date
77451d6ec9 Hardware SPI BREAKING: unswap mode 2 and 3 for portability (#5948)
* Hardware SPI BREAKING: unswap mode 2 and 3 for portability
use SPI.restoreEsp8266LegacyMode2And3() for former behaviour
2019-04-06 01:13:09 +02:00
8c01516f8a Allow unaligned input/output to SPI::transferBytes (#5709)
* Allow unaligned input/output to SPI::transferBytes

Fixes #4967

Support any alignment of input and output pointers and transfer lengths
in SPI::transferBytes.  Use 32-bit transfers and FIFO as much as
possible.

* Refactor misaligned transfer, avoid RMW to FIFO

The SPI FIFO can't properly do RMW (i.e. bytewise updates) because when
you read the FIFO you are actually reading the SPI read data, not what
was written into the write FIFO.

Refactor the transferBytes to take account of this.  For aligned input
and outputs, perform as before (but handle non-x4 sizes properly).  For
misaligned inputs, if it's unidirectional then do bytewise until the
direction data pointer is aligned and then do 32b accesses.  Fod
bidirectional and misaligned inputs, copy the output data to an aligned
buffer, do the transfer, then copy the read back data from temp aligned
buffer to the real input buffer.

* Fix comments, clean condition checks, save stack

Add more comments and adjust naming to be more informative in
transferBytes_ and *aligned_.  Save 64bytes of stack in double
misaligned case.

* Optimize misaligned transfers, reduce code size

On any misaligned input or output, always use a temp buffer.  No need
for special casing and bytewise ::transfer().  This should be faster as
bytewise ::transfer involves a significant number of IO register
accesses and setup.  Thanks to @devyte for the suggestion.
2019-02-03 12:17:06 -03:00
3cc12b1e08 arduino API's SPI::transfer(void*, size) (optimized) (#4925)
* SPI::transfer(void*, size) (optimized)

* spi: transfer(): fix checking size

* spi: transferBytes_: 32bits miso transfer

* spi: transferBytes_: fix declaration

* spi: transferBytes: add comments, reduce diff
2018-07-27 10:44:02 -04:00
559cb35025 spi: use const for output buffers (#4552) 2018-03-23 13:39:20 -03:00
40c159fcf5 Remove a number of extui instructions
Using a uint8_t for the loop counter resulted
in a number of 8-bit extract (extui) instructions.
Using a uint32_t prevents this.
2017-06-06 23:23:09 -05:00
00815f2db4 Manually manage FIFO volatility
Replace volatile with properly placed __sync_synchronize

SPI1W0 is volatile, but when writing multiple words
to the FIFO (which is really just a piece of SRAM),
we don't need to worry about write ordering. We only
need worry about write ordering such that all FIFO
words are written completely before HSPI is told to
use FIFO by setting SPI1CMD |= SPIBUSY;
2017-06-06 23:23:09 -05:00
c07c8dc88e Small cleanup to SPI write16 and write32 for big-endian
Merge a common line.
2017-06-06 23:23:09 -05:00
af0f5ed956 Issue #1062: Implement support for HSPI overlap mode. 2017-05-08 03:04:11 -05:00
18297458be allows global object instances be switch off with defines (#2344) 2016-08-01 11:21:50 +08:00
8ffe1aa2e2 Speed up writePattern() a bit more 2016-04-18 01:26:03 +03:00
a64a694f6d Speed up SPI.writePattern() 2016-04-16 20:02:06 +03:00
bda212552c Fix SPI.transfer16() using wrong endianness 2016-04-04 22:10:36 -07:00
66b68d4ada add CPOL setting 2016-03-16 17:28:24 +08:00
6ab3c76e03 register and clock changes 2015-06-02 00:11:20 +03:00
2eea25873d fix SPI speed calculation @160Mhz Clock 2015-05-15 13:42:30 +02:00
e0c1b47937 add some notes to the SPI functions (aligned to 32Bit)
- Fatal exception (9)
2015-05-13 19:03:21 +02:00
27f45a205a SD:
- optimize SPI usage 148% write speed (24kB/s -> 37kB/s) and 127% read speed (121kB/s -> 155kB/s) at 8MHz
 - add clock frequency as parameter for begin(csPin, frequency)
 - SD @80MHz write: 84kB/s read: 231kB/s

SPI add functions:
 - void write32(uint32_t data);
 - void write32(uint32_t data, bool msb);
 - void transferBytes(uint8_t * out, uint8_t * in, uint32_t size);

Adafruit_ILI9341:
 - code clean
2015-05-10 17:34:16 +02:00
070f2b3a14 many speed optimizations in Adafruit_ILI9341 lib (3x times faster)
add new SPI function:

  void write(uint8_t data);
  void write16(uint16_t data);
  void write16(uint16_t data, bool msb);
  void writeBytes(uint8_t * data, uint32_t size);
  void writePattern(uint8_t * data, uint8_t size, uint32_t repeat);

Adafruit_ILI9341:
| Benchmark                 | Old (ms) | New (ms) | Speedup     |
| ------------------------- | -------- | -------- | ----------- |
| Screen fill 				| 1248369  | 278707   |  +347,91%   |
| Text 						| 86102    | 53785    |  +60,09%    |
| Lines 					| 825400   | 536374   |  +53,89%    |
| Horiz/Vert Lines 			| 101875   | 24653    |  +313,24%   |
| Rectangles (outline) 		| 65720    | 17295    |  +279,99%   |
| Rectangles (filled) 		| 2592250  | 579157   |  +347,59%   |
| Circles (filled) 			| 411475   | 179454   |  +129,29%   |
| Circles (outline) 		| 360002   | 233584   |  +54,12%    |
| Triangles (outline)		| 261772   | 170118   |  +53,88%    |
| Triangles (filled) 		| 866951   | 246237   |  +252,08%   |
| Rounded rects (outline) 	| 154131   | 81570    |  +88,96%    |
| Rounded rects (filled) 	| 2828112  | 660983   |  +327,86%   |
|                           |          |          |             |
| Total                     | 9802159  | 3061917  |  +220,13%   |
2015-05-09 16:19:32 +02:00
dcc899a1b5 some speed optimizations 2015-05-08 15:33:48 +02:00
7c33efc3d8 fix SPI run on system clock 2015-05-08 15:30:27 +02:00
d7a88c3ea3 use a function to calculate best match clock register for SPI
TEST:

Frequency: 1000000  -> [0x009C1001] EQU: 0	 Pre: 39     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 1000000
Frequency: 4000000  -> [0x00001001] EQU: 0	 Pre: 0	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 40000000
Frequency: 2000000  -> [0x00041001] EQU: 0	 Pre: 1	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 20000000
Frequency: 1600000  -> [0x00004002] EQU: 0	 Pre: 0	     N: 4	 H: 0	 L: 2	 - Back Calculated Frequency: 16000000
Frequency: 1610000  -> [0x00004002] EQU: 0	 Pre: 0	     N: 4	 H: 0	 L: 2	 - Back Calculated Frequency: 16000000
Frequency: 1000000  -> [0x000C1001] EQU: 0	 Pre: 3	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 10000000
Frequency: 8000000  -> [0x00101001] EQU: 0	 Pre: 4	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 8000000
Frequency: 5000000  -> [0x001C1001] EQU: 0	 Pre: 7	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 5000000
Frequency: 4000000  -> [0x00241001] EQU: 0	 Pre: 9	     N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 4000000
Frequency: 2000000  -> [0x004C1001] EQU: 0	 Pre: 19	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 2000000
Frequency: 1000000  -> [0x009C1001] EQU: 0	 Pre: 39	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 1000000
Frequency: 500000   -> [0x013C1001] EQU: 0	 Pre: 79	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 500000
Frequency: 250000   -> [0x027C1001] EQU: 0	 Pre: 159	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 250000
Frequency: 125000   -> [0x04FC1001] EQU: 0	 Pre: 319	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 125000
Frequency: 6666666  -> [0x00141001] EQU: 0	 Pre: 5	 	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 6666666
Frequency: 6000000  -> [0x00181001] EQU: 0	 Pre: 6	 	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 5714285
Frequency: 3000000  -> [0x00202001] EQU: 0	 Pre: 8	 	 N: 2	 H: 0	 L: 1	 - Back Calculated Frequency: 2962962
Frequency: 100	    -> [0x7FFFF020] EQU: 0	 Pre: 8191	 N: 63	 H: 0	 L: 32	 - Back Calculated Frequency: 152
Frequency: 125000   -> [0x04FC1001] EQU: 0	 Pre: 319	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 125000
Frequency: 16457    -> [0x25F81001] EQU: 0	 Pre: 2430	 N: 1	 H: 0	 L: 1	 - Back Calculated Frequency: 16454
2015-05-08 00:48:08 +02:00
7f4a10062b update README
add some docu and todo
2015-05-07 20:48:59 +02:00
ee5def9c8c add CPHA support for SPI
- tested with logic analyzer
2015-05-07 19:48:55 +02:00
163858dc44 fix use SPI.beginTransaction crash 2015-05-07 19:25:25 +02:00
6599a9f52a add SPIClass::transfer16 (needed by some display libs) 2015-05-04 18:11:46 +02:00
fbec557ddb Importing my changes 2015-04-30 20:48:50 +03:00
dfbc499627 Fix slashes in SPI library 2015-04-03 08:18:23 +03:00
4626a9df80 Initial ESP8266 HW SPI implementation
ILI9341 lib as a client for SPI lib
2015-04-01 07:10:31 +03:00
ee762f3150 Add WIP SPI library 2015-01-21 04:19:04 +03:00