====== SPI / I²S 1..6 ====== The SPI interface offers 2 main functions: SPI and I²S (audio protocol). \\ There are a total of 6 SPI controllers which can be configured and used independently. \\ \\ {{spi_complete.svg?700em}} \\ \\ ===== Features ===== * Full-duplex synchronous transfer (on 3 lines: MOSI, MISO, SCK). * Simplex synchronous transfer (on 2 lines: MOSI/MISO, SCK). * 8 or 16 bit data transfer width. * Master or slave mode. * Slave select either by hardware or software. * Interrupt, CRC and DMA support. \\ ===== Configuration Registers ===== ==== SPI_CR1 - Configuration register 1 ==== (not used in I²S mode) \\ {{spi_reg_cr1.svg}} \\ \\ |< 100% 5em 5em 15em 5em >| |MSTR|0|Slave mode (reset state)|| |:::|1|Master mode|| |BR|000|BR => fPCLK2 / 2 (reset state)|100|BR => fPCLK2 / 32| |:::|001|BR => fPCLK2 / 4|101|BR => fPCLK2 / 64| |:::|010|BR => fPCLK2 / 8|110|BR => fPCLK2 / 128| |:::|011|BR => fPCLK2 / 16|111|BR => fPCLK2 / 256| |SPE|0|SPI disabled (reset state)|| |:::|1|SPI enabled|| |LSBFIRST|0|MSB transmitted first (reset state)|| |:::|1|LSB transmitted first|| |SSM|0|Slave management by hw (reset state)|| |:::|1|Slave management by sw|| |DFF|0|Data frame: 8 bit (reset state)|| |:::|1|Data frame: 16 bit|| ==== SPI_CR2 - Configuration register 2 ==== \\ {{spi_reg_cr2.svg}} \\ \\ |< 100% 5em 5em >| |SSOE|0|Slave select disabled in master mode (reset state)| |:::|1|Slave select enabled in master mode (not for multi master setup)| |FRF|0|Motorolla frame format (reset state)| |:::|1|Texas Instruments frame format| |ERRIE|0|Error interrupt disabled (reset state)| |:::|1|Error interrupt enabled| |RXNEIE|0|RX not empty interrupt disabled (reset state)| |:::|1|RX not empty interrupt enabled| |TXEIE|0|TX empty interrupt disabled (reset state)| |:::|1|TX empty interrupt enabled| ==== SPI_CRCPR - CRC polynomial register ==== (not used in I²S mode) \\ {{spi_reg_crcpr.svg}} \\ \\ Contains polynomial used to calculate CRC. Reset value: ''0x0007''. \\ ==== SPI_RXCRCR - RX CRC register ==== (not used in I²S mode) \\ {{spi_reg_rxcrcr.svg}} \\ \\ Contains computed CRC value of received bytes. \\ ==== SPI_TXCRCR - TX CRC register ==== (not used in I²S mode) \\ {{spi_reg_txcrcr.svg}} \\ \\ Contains computed CRC value of transmitted bytes. \\ ==== SPI_I2SCFGR - I²S configuration register ==== (not used in SPI mode) \\ {{spi_reg_i2scfgr.svg}} \\ \\ ==== SPI_I2SPR - I²S prescaler register ==== (not used in SPI mode) \\ {{spi_reg_i2spr.svg}} \\ \\ ===== Data Register ===== ==== SPI_DR - Data register ==== \\ {{spi_reg_dr.svg}} \\ \\ Data received or to be transmitted. Split into 2 buffers: * Writing to DR writes to TX Buffer. * Reading from DR reads from RX Buffer. \\ ===== Programming Example ===== The code snippet bellow shows how to configure and use the SPI peripheral. #include "reg_stm32f4xx.h" RCC->AHBENR[0] |= (0x1 << 0u); /* Enable GPIOA clock */ RCC->APBENR[1] |= (0x1 << 12u); /* Enable SPI1 clock */ /* Configure GPIO pin A.4 to A.7 in alternate function mode. */ GPIOA->MODER &= ~(0xff << 8u); /* Clear existing mode bits 8 to 15. */ GPIOA->MODER |= (0xaa << 8u); /* Set pin 4..7 to alternate function mode. */ GPIOA->OSPEEDR &= ~(0xff << 8u); /* Clear existing output speed bits 8 to 15. */ GPIOA->OSPEEDR |= (0xff << 8u); /* Set pin 4..7 to high speed (100MHz) mode. */ GPIOA->AFR[0] &= ~(0xffff << 16u); /* Clear existing af bits 16 to 31. */ GPIOA->AFR[0] |= (0x5555 << 16u); /* Set pin 4..7 to AF5 (SPI1). */ /* Configure SPI1 in slave mode. */ SPI1->CR1 = 0u; /* Reset SPI1 configuration. */ SPI1->CR2 = 0u; /* Reset SPI1 configuration. */ SPI1->CR1 |= (0x1 << 3u) | /* Select 11,25MHz as baudrate (45 MHz / 4). */ (0x1 << 6u); /* Enable SPI. */ \\