2828#include "spi_drv.h"
2929#include "spi_drv_stm32f4.h"
3030
31- void spi_cs_off (void )
31+ void spi_cs_off (int pin )
3232{
33- GPIOE_BSRR |= (1 << SPI_FLASH_PIN );
34- while (!(GPIOE_ODR & (1 << SPI_FLASH_PIN )))
33+ GPIOE_BSRR |= (1 << pin );
34+ while (!(GPIOE_ODR & (1 << pin )))
3535 ;
3636}
3737
38- void spi_cs_on (void )
38+ void spi_cs_on (int pin )
3939{
40- GPIOE_BSRR |= (1 << (SPI_FLASH_PIN + 16 ));
41- while (GPIOE_ODR & (1 << SPI_FLASH_PIN ))
40+ GPIOE_BSRR |= (1 << (pin + 16 ));
41+ while (GPIOE_ODR & (1 << pin ))
4242 ;
4343}
4444
@@ -47,15 +47,28 @@ static void spi_flash_pin_setup(void)
4747{
4848 uint32_t reg ;
4949 AHB1_CLOCK_ER |= GPIOE_AHB1_CLOCK_ER ;
50- reg = GPIOE_MODE & ~ (0x03 << (SPI_FLASH_PIN * 2 ));
51- GPIOE_MODE = reg | (1 << (SPI_FLASH_PIN * 2 ));
52-
53- reg = GPIOE_PUPD & ~( 0x03 << ( SPI_FLASH_PIN * 2 ));
54- GPIOE_PUPD = reg | ( 0x01 << (SPI_FLASH_PIN * 2 ));
55-
56- reg = GPIOE_OSPD & ~( 0x03 << ( SPI_FLASH_PIN * 2 ) );
57- GPIOE_OSPD |= ( 0x03 << ( SPI_FLASH_PIN * 2 ));
50+ reg = GPIOE_MODE & ~ (0x03 << (SPI_CS_FLASH * 2 ));
51+ GPIOE_MODE = reg | (1 << (SPI_CS_FLASH * 2 ));
52+ reg = GPIOE_PUPD & ~( 0x03 << ( SPI_CS_FLASH * 2 ));
53+ GPIOE_PUPD = reg | ( 0x01 << ( SPI_CS_FLASH * 2 ));
54+ reg = GPIOE_OSPD & ~( 0x03 << (SPI_CS_FLASH * 2 ));
55+ GPIOE_OSPD |= ( 0x03 << ( SPI_CS_FLASH * 2 ));
56+ spi_cs_off ( SPI_CS_FLASH );
57+ }
5858
59+ static void spi_tpm2_pin_setup (void )
60+ {
61+ #ifdef WOLFTPM2_NO_WOLFCRYPT
62+ uint32_t reg ;
63+ AHB1_CLOCK_ER |= GPIOE_AHB1_CLOCK_ER ;
64+ reg = GPIOE_MODE & ~ (0x03 << (SPI_CS_TPM * 2 ));
65+ GPIOE_MODE = reg | (1 << (SPI_CS_TPM * 2 ));
66+ reg = GPIOE_PUPD & ~(0x03 << (SPI_CS_TPM * 2 ));
67+ GPIOE_PUPD = reg | (0x01 << (SPI_CS_TPM * 2 ));
68+ reg = GPIOE_OSPD & ~(0x03 << (SPI_CS_TPM * 2 ));
69+ GPIOE_OSPD |= (0x03 << (SPI_CS_TPM * 2 ));
70+ spi_cs_off (SPI_CS_TPM );
71+ #endif
5972}
6073
6174static void spi1_pins_setup (void )
@@ -98,8 +111,8 @@ static void spi_pins_release(void)
98111 GPIOB_PUPD &= ~ (0x03 << (SPI1_MISO_PIN * 2 ));
99112
100113 /* Release CS */
101- GPIOE_MODE &= ~ (0x03 << (SPI_FLASH_PIN * 2 ));
102- GPIOE_PUPD &= ~ (0x03 << (SPI_FLASH_PIN * 2 ));
114+ GPIOE_MODE &= ~ (0x03 << (SPI_CS_FLASH * 2 ));
115+ GPIOE_PUPD &= ~ (0x03 << (SPI_CS_TPM * 2 ));
103116
104117 /* Disable GPIOB+GPIOE clock */
105118 AHB1_CLOCK_ER &= ~(GPIOB_AHB1_CLOCK_ER | GPIOE_AHB1_CLOCK_ER );
@@ -136,13 +149,18 @@ void spi_write(const char byte)
136149
137150void spi_init (int polarity , int phase )
138151{
139- spi1_pins_setup ();
140- spi_flash_pin_setup ();
141- APB2_CLOCK_ER |= SPI1_APB2_CLOCK_ER_VAL ;
142- spi1_reset ();
143- SPI1_CR1 = SPI_CR1_MASTER | (5 << 3 ) | (polarity << 1 ) | (phase << 0 );
144- SPI1_CR2 |= SPI_CR2_SSOE ;
145- SPI1_CR1 |= SPI_CR1_SPI_EN ;
152+ static int initialized = 0 ;
153+ if (!initialized ) {
154+ initialized ++ ;
155+ spi1_pins_setup ();
156+ spi_flash_pin_setup ();
157+ spi_tpm2_pin_setup ();
158+ APB2_CLOCK_ER |= SPI1_APB2_CLOCK_ER_VAL ;
159+ spi1_reset ();
160+ SPI1_CR1 = SPI_CR1_MASTER | (5 << 3 ) | (polarity << 1 ) | (phase << 0 );
161+ SPI1_CR2 |= SPI_CR2_SSOE ;
162+ SPI1_CR1 |= SPI_CR1_SPI_EN ;
163+ }
146164}
147165
148166void spi_release (void )
0 commit comments