/* p8_3.c: Using SPI1 to generate a sawtooth waveform on LTC1661 * * SPI1 is configured as master with software slave select. * Clock rate is set to 1 MHz. Polarity/Phase are 0, 0 * * PA7 MOSI * PA5 SCK * PA4 SS * * This program was tested with Keil uVision v5.23 with DFP v2.0.0. */ #include "stm32f0xx.h" void SPI1_init(void); void DAC_write(short data); int main(void) { short i; SPI1_init(); while(1) { for (i = 0; i < 1024; i++) { DAC_write(i); /* write the letter through SPI1 */ } } } /* enable SPI1 and associated GPIO pins */ void SPI1_init(void) { RCC->AHBENR |= 0x00020000; /* enable GPIOA clock */ RCC->APB2ENR |= 0x00001000; /* enable SPI1 clock */ /* PORTA 5, 7 for SPI1 MOSI and SCLK */ GPIOA->MODER &= ~0x0000CC00; /* clear pin mode */ GPIOA->MODER |= 0x00008800; /* set pin alternate mode */ GPIOA->AFR[0] &= ~0xF0F00000; /* clear alt mode */ /* PORTA4 as GPIO output for SPI slave select */ GPIOA->MODER &= ~0x00000300; /* clear pin mode */ GPIOA->MODER |= 0x00000100; /* set pin output mode */ SPI1->CR1 = 0x0314; /* set the Baud rate, 16-bit data frame */ SPI1->CR2 = 0x0F00; SPI1->CR1 |= 0x40; /* enable SPI1 module */ } /* This function enables slave select, writes one byte to SPI1, wait for transmit complete and deassert slave select. */ void DAC_write(short data) { while (!(SPI1->SR & 2)) {} /* wait until Transfer buffer Empty */ GPIOA->BSRR = 0x00100000; /* assert slave select */ SPI1->DR = 0x9000 | ((data << 2) & 0x0FFF); /* write command and data */ while (SPI1->SR & 0x80) {} /* wait for transmission done */ GPIOA->BSRR = 0x00000010; /* deassert slave select */ }