SPI slave program to enable communication between the FPGA and the STM32L432 board.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }