std/spi — SPI master¶
import std/spi
Blocking master-mode SPI. The module configures the hardware SPI peripheral as a master and exchanges single bytes, busy-waiting on the transfer-complete flag.
SPI0¶
- @spi_init_master_raw()¶
Initialise the SPI peripheral in master mode with a default configuration (“raw”: no chip-select management or mode/clock options beyond enabling master mode). Drive any chip-select line yourself with the GPIO module.
- @spi_transfer($data: u8) -> u8¶
Shift
$dataout over MOSI while simultaneously shifting a byte in over MISO; block until the exchange completes and return the received byte. SPI is full-duplex, so every transfer both sends and receives.
Additional SPI instance¶
Devices with a second SPI peripheral expose the same two calls on the spi1
module:
@spi1_init_master_raw()@spi1_transfer($data: u8) -> u8
Example¶
target atmega328p
import std/spi
import std/gpio
@main {
@pin_mode_b(2, 1) # PB2 = chip-select line, configured as output
@spi_init_master_raw() # bring SPI up in master mode
@digital_write_b(2, 0) # pull CS low to select the slave
# 0x9F is a device-specific command (here a common "read ID"); the value
# to send comes from your slave's datasheet, not from SPI itself.
ram imut $resp: u8 = @spi_transfer(0x9F) # send the byte, capture the reply
@digital_write_b(2, 1) # raise CS to deselect
}