
SPI slave program to enable communication between the FPGA and the STM32L432 board.
SPI.cpp@9:9ed9dffd602a, 2019-03-07 (annotated)
- Committer:
- Zbyszek
- Date:
- Thu Mar 07 01:16:48 2019 +0000
- Revision:
- 9:9ed9dffd602a
- Parent:
- 1:6766e7f4f12f
- Child:
- 11:366f1186c121
Got the DMA working to some extent. Disabling the PINC bit solves the transmission problem to some extent but still facing problems such as getting 100% of the data to send properly.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Zbyszek | 0:8e367d6d8f03 | 1 | #include "SPI.h" |
Zbyszek | 0:8e367d6d8f03 | 2 | #include "mbed.h" |
Zbyszek | 0:8e367d6d8f03 | 3 | |
Zbyszek | 0:8e367d6d8f03 | 4 | /* |
Zbyszek | 0:8e367d6d8f03 | 5 | This SPI slave is written for the STM32L432 board as it has different pin layout to the |
Zbyszek | 0:8e367d6d8f03 | 6 | STM32F429. |
Zbyszek | 0:8e367d6d8f03 | 7 | */ |
Zbyszek | 0:8e367d6d8f03 | 8 | |
Zbyszek | 0:8e367d6d8f03 | 9 | int transfer_spi_slave(unsigned short send_val) |
Zbyszek | 0:8e367d6d8f03 | 10 | { |
Zbyszek | 0:8e367d6d8f03 | 11 | int16_t rx_data = 0; |
Zbyszek | 0:8e367d6d8f03 | 12 | |
Zbyszek | 0:8e367d6d8f03 | 13 | SPI1->DR=send_val; //Send data |
Zbyszek | 0:8e367d6d8f03 | 14 | while((SPI1->SR&0x01) != 1 && (SPI1->SR&0x02) != 1); //wait while BSY bit set and TXE bit sets, when BSY bit clears spi bus is no longer busy, when data is transmitted TXE bit sets |
Zbyszek | 0:8e367d6d8f03 | 15 | rx_data = SPI1->DR; //Save the read data to rx_data |
Zbyszek | 0:8e367d6d8f03 | 16 | |
Zbyszek | 0:8e367d6d8f03 | 17 | return rx_data; |
Zbyszek | 0:8e367d6d8f03 | 18 | } |
Zbyszek | 0:8e367d6d8f03 | 19 | |
Zbyszek | 0:8e367d6d8f03 | 20 | |
Zbyszek | 0:8e367d6d8f03 | 21 | void init_spi_slave(void) |
Zbyszek | 0:8e367d6d8f03 | 22 | { |
Zbyszek | 0:8e367d6d8f03 | 23 | |
Zbyszek | 0:8e367d6d8f03 | 24 | RCC->APB2ENR|=RCC_APB2ENR_SPI1EN; |
Zbyszek | 0:8e367d6d8f03 | 25 | //CONFIG GPIOS |
Zbyszek | 0:8e367d6d8f03 | 26 | GPIOA->MODER&=~((3u<<(2*CS_slave))); //clear GPIOA pin mode (in input mode when reset) |
Zbyszek | 0:8e367d6d8f03 | 27 | |
Zbyszek | 1:6766e7f4f12f | 28 | GPIOA->MODER&=~( //clear GPIOB |
Zbyszek | 0:8e367d6d8f03 | 29 | (3u<<(2*SCK_slave)) |
Zbyszek | 0:8e367d6d8f03 | 30 | |(3u<<(2*MISO_slave)) |
Zbyszek | 0:8e367d6d8f03 | 31 | |(3u<<(2*MOSI_slave)) |
Zbyszek | 0:8e367d6d8f03 | 32 | // |(3u<<(2*CS_pin)) |
Zbyszek | 0:8e367d6d8f03 | 33 | |0x03 |
Zbyszek | 0:8e367d6d8f03 | 34 | ); |
Zbyszek | 1:6766e7f4f12f | 35 | GPIOA->MODER|=( //reset GPIOA pins |
Zbyszek | 0:8e367d6d8f03 | 36 | (2u<<(2*SCK_slave)) |
Zbyszek | 0:8e367d6d8f03 | 37 | |(2u<<(2*MISO_slave)) |
Zbyszek | 0:8e367d6d8f03 | 38 | |(2u<<(2*MOSI_slave)) |
Zbyszek | 0:8e367d6d8f03 | 39 | // |(3u<<(2*CS_pin)) |
Zbyszek | 0:8e367d6d8f03 | 40 | |0x01 |
Zbyszek | 0:8e367d6d8f03 | 41 | ); |
Zbyszek | 0:8e367d6d8f03 | 42 | GPIOA->AFR[0]&=~( //clear alternate function selector bits |
Zbyszek | 0:8e367d6d8f03 | 43 | (0x0f<<(4*SCK_slave)) |
Zbyszek | 0:8e367d6d8f03 | 44 | |(0x0f<<(4*MISO_slave)) |
Zbyszek | 0:8e367d6d8f03 | 45 | |(15u<<(4*MOSI_slave)) |
Zbyszek | 0:8e367d6d8f03 | 46 | // |(0x0f<<(4*CS_pin)) |
Zbyszek | 0:8e367d6d8f03 | 47 | ); |
Zbyszek | 0:8e367d6d8f03 | 48 | GPIOA->AFR[0]|=( //reset alternate function selector bits to SPI1 |
Zbyszek | 0:8e367d6d8f03 | 49 | (5u<<(4*SCK_slave)) |
Zbyszek | 0:8e367d6d8f03 | 50 | |(5u<<(4*MISO_slave)) |
Zbyszek | 0:8e367d6d8f03 | 51 | |(5u<<(4*MOSI_slave)) |
Zbyszek | 0:8e367d6d8f03 | 52 | // |(5u<<(4*CS_pin)) |
Zbyszek | 0:8e367d6d8f03 | 53 | ); |
Zbyszek | 0:8e367d6d8f03 | 54 | |
Zbyszek | 9:9ed9dffd602a | 55 | //set_CS(); |
Zbyszek | 0:8e367d6d8f03 | 56 | |
Zbyszek | 0:8e367d6d8f03 | 57 | |
Zbyszek | 0:8e367d6d8f03 | 58 | //CONFIG SPI MODULE |
Zbyszek | 0:8e367d6d8f03 | 59 | RCC->APB2ENR|=RCC_APB2ENR_SPI1EN; |
Zbyszek | 0:8e367d6d8f03 | 60 | SPI1->CR1&=~( //module disabled, clear bad rate bits |
Zbyszek | 0:8e367d6d8f03 | 61 | SPI_CR1_SPE //SPE has to be disabled so that the SPI can be set to 16-bit mode |
Zbyszek | 0:8e367d6d8f03 | 62 | |SPI_CR1_MSTR //Bit cleared to put the board into slave mode. |
Zbyszek | 0:8e367d6d8f03 | 63 | |SPI_CR1_BR |
Zbyszek | 0:8e367d6d8f03 | 64 | |SPI_CR1_SSM |
Zbyszek | 0:8e367d6d8f03 | 65 | // |SPI_CR1_CPOL //Set clock polirty to 0 |
Zbyszek | 0:8e367d6d8f03 | 66 | // |SPI_CR1_CPHA //Set clock phase to 0 |
Zbyszek | 0:8e367d6d8f03 | 67 | ); |
Zbyszek | 0:8e367d6d8f03 | 68 | |
Zbyszek | 0:8e367d6d8f03 | 69 | SPI1->CR2 |=(0xF<<8); //Set the data frame to 16 bits STM32L432 only. |
Zbyszek | 0:8e367d6d8f03 | 70 | |
Zbyszek | 0:8e367d6d8f03 | 71 | SPI1->CR1|=( |
Zbyszek | 0:8e367d6d8f03 | 72 | SPI_CR1_SSI //set internal slave select |
Zbyszek | 0:8e367d6d8f03 | 73 | //|SPI_CR1_SSM //SS control set |
Zbyszek | 0:8e367d6d8f03 | 74 | //|SPI_CR1_MSTR //master mode |
Zbyszek | 0:8e367d6d8f03 | 75 | |(3u<<3) //baud rate bits set /16 giving 1MHz SCK frequency |
Zbyszek | 0:8e367d6d8f03 | 76 | |SPI_CR1_CPOL //Set clock polirty to 1 |
Zbyszek | 0:8e367d6d8f03 | 77 | |SPI_CR1_CPHA //Set clock phase to 1 |
Zbyszek | 0:8e367d6d8f03 | 78 | |SPI_CR1_SPE //SPI module enabled |
Zbyszek | 0:8e367d6d8f03 | 79 | ); |
Zbyszek | 1:6766e7f4f12f | 80 | |
Zbyszek | 0:8e367d6d8f03 | 81 | } |
Zbyszek | 0:8e367d6d8f03 | 82 | |
Zbyszek | 0:8e367d6d8f03 | 83 | void init_spi_ports(void) { |
Zbyszek | 0:8e367d6d8f03 | 84 | //Enable GPIOA clock on which the SPI1 pins are located |
Zbyszek | 0:8e367d6d8f03 | 85 | RCC->AHB2ENR|= (RCC_AHB2ENR_GPIOAEN); //GPIO A clock enable |
Zbyszek | 0:8e367d6d8f03 | 86 | init_spi_slave(); //Initialise SPI slave |
Zbyszek | 0:8e367d6d8f03 | 87 | } |
Zbyszek | 0:8e367d6d8f03 | 88 | |
Zbyszek | 0:8e367d6d8f03 | 89 | void init_spi1(void) |
Zbyszek | 0:8e367d6d8f03 | 90 | { |
Zbyszek | 0:8e367d6d8f03 | 91 | init_spi_ports(); |
Zbyszek | 0:8e367d6d8f03 | 92 | |
Zbyszek | 0:8e367d6d8f03 | 93 | } |