SPI (Serial Peripheral Interface) is a synchronous serial protocol consisting of a master and a slave.
The standard 4-wire mode consists of 4 wires: SCK (SCLK), CS (chip select), MOSI, MISO.
On the K210, SPI has the following characteristics:
- There are 4 SPI devices, of which SPI0, SPI1, and SPI3 can only work in master mode, and SPI2 can only work in slave mode. On MaixPy, SPI3 has been used to connect SPI Flash. It is temporarily reserved. It is necessary to consider the open interface and SPI Flash time-sharing multiplexing.
- Supports 1/2/4 / 8-wire full-duplex mode. In MaixPy, currently only supports standard (Motorola) 4-wire full-duplex mode (ie, SCK, MOSI, MISO, CS four pins)
- Maximum transmission rate of 45M
- Support DMA
- 4 configurable hardware chip select
class machine.SPI (id, mode = SPI.MODE_MASTER, baudrate = 500000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB, sck, mosi, miso, cs0, cs1, cs2, cs3)
Create a new SPI object with the specified parameters
id
: SPI ID, value range [0,3], currently only supports 0 and 1, and can only be master mode, 2 can only be used as slave, currently not implemented, 3 reservedmode
: SPI mode,MODE_MASTER
orMODE_MASTER_2
orMODE_MASTER_4
orMODE_MASTER_8
orMODE_SLAVE
, currently only supportsMODE_MASTER
baudrate
: SPI baud rate (frequency)polarity
: Polarity, the value is 0 or 1, which indicates the polarity of the SPI at idle, 0 represents low level, 1 represents high levelphase
: phase, value bit 0 or 1, which means to collect data at the first or second edge of the clock, 0 means the first, 1 means the secondbits
: data width, default value is 8, value range [4,32]firstbit
: Specify whether to transmit in MSB or LSB order. The default is SPI.MSB.sck
: SCK (Clock) pin, which can directly transmit the pin value. The value range is [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.mosi
: MOSI (host output) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.miso
: MISO (host input) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.cs0
: CS0 (chip select) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.cs1
: CS1 (chip select) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.cs2
: CS2 (chip select) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.cs3
: CS3 (chip select) pin, which can directly pass the pin value, value range: [0,47]. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.d0 ~ d7
: Data pins, used in non-standard 4-wire mode, currently reserved. Instead of setting it, use [fm] (../ builtin_py / fm.md) to manage the pin mapping uniformly.
Constructor-like
SPI.init (id, mode = SPI.MODE_MASTER, baudrate = 500000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB, sck, mosi, miso, cs0)
Same as constructor
no
Read data
SPI.read (nbytes, write = 0x00, cs = SPI.CS0)
nbytes
: the length to readcs
: Select chip select pins. Pins have been set forcs0
~cs3
during initialization. Here you only need to selectSPI.CS0
~SPI.CS3
. The default isSPI. .CS0
write
: Because it is full duplex, set the value of theMOSI
pin when reading. The default is0x00
, which is always low.
bytes
data
Read the data and put it into the specified variable
SPI.readinto (buf, write = 0x00, cs = SPI.CS0)
buf
:bytearray
type, which defines the length, and the data is saved here after readingcs
: Select chip select pins. Pins have been set forcs0
~cs3
during initialization. Here you only need to selectSPI.CS0
~SPI.CS3
. The default isSPI. .CS0
write
: Because it is full duplex, set the value of theMOSI
pin when reading. The default is0x00
, which is always low.
no
send data
SPI.write (buf, cs = SPI.CS0)
buf
:bytearray
type, which defines the data and lengthcs
: Select chip select pins. Pins have been set forcs0
~cs3
during initialization. Here you only need to selectSPI.CS0
~SPI.CS3
. The default isSPI. .CS0
no
Send data while reading data to a variable, that is, full duplex
SPI.write (write_buf, read_buf, cs = SPI.CS0)
write_buf
:bytearray
type, which defines the data and length to be sentread_buf
:bytearray
type, which defines where the received data is storedcs
: Select chip select pins. Pins have been set forcs0
~cs3
during initialization. Here you only need to selectSPI.CS0
~SPI.CS3
. The default isSPI. .CS0
no
Log out of SPI, release hardware, shut down SPI clock
SPI.deinit ()
no
no
spi.deinit ()
or
del spi
SPI0
: SPI 0SPI1
: SPI 1SPI2
: SPI 2MODE_MASTER
: as master modeMODE_MASTER_2
: as master modeMODE_MASTER_4
: as master modeMODE_MASTER_8
: as master modeMODE_SLAVE
: as slave modeMSB
: MSB, that is, the high-order or high-order byte is sent firstLSB
: LSB, that is, send low-order or low-order byte firstCS0
: Chip Select 0CS1
: Chip Select 1CS2
: Chip Select 2CS3
: Chip Selection 3
from machine import SPI
spi1 = SPI (SPI.SPI1, mode = SPI.MODE_MASTER, baudrate = 10000000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB, sck = 28, mosi = 29, miso = 30, cs0 = 27)
w = b'1234 '
r = bytearray (4)
spi1.write (w)
spi1.write (w, cs = SPI.CS0)
spi1.write_readinto (w, r)
spi1.read (5, write = 0x00)
spi1.readinto (r, write = 0x00)