Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- **
- ** Main.c
- **
- **
- **********************************************************************/
- /*
- Last committed: $Revision: 00 $
- Last changed by: $Author: $
- Last changed date: $Date: $
- ID: $Id: $
- **********************************************************************/
- #include "stm32f30x_conf.h"
- #include "30021_io.h"
- void init_SPI3(){
- // Enable Clocks
- RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOCEN; // Enable Clock for GPIO Banks A and B
- RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; // Enable Clock for SPI2
- // Connect pins to SPI2
- GPIOC->AFR[1] &= ~(GPIO_AFRH_AFRH2); // Clear alternate function for PC10
- GPIOC->AFR[1] |= (6 << 4*2); // Set alternate 5 function for PC10 - SCLK
- GPIOC->AFR[1] &= ~(GPIO_AFRH_AFRH3); // Clear alternate function for PC11
- GPIOC->AFR[1] |= (6 << 4*3);
- GPIOC->AFR[1] &= ~(GPIO_AFRH_AFRH4); // Clear alternate function for PC12
- GPIOC->AFR[1] |= (6 << 4*4);
- GPIOA->AFR[1] &= ~(GPIO_AFRH_AFRH7); // Clear alternate function for PA15
- GPIOA->AFR[1] |= (6 << 4*7);
- // Configure pins PB13 and PB15 for 10 MHz alternate function
- GPIOC->OSPEEDR &= ~ (GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12); // Clear speed register
- GPIOC->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR10_0 | GPIO_OSPEEDER_OSPEEDR11_0 | GPIO_OSPEEDER_OSPEEDR12_0); // set speed register (0x01 - 10 MHz, 0x02 - 2 MHz, 0x03 - 50 MHz)
- GPIOC->OTYPER &= ~ (GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_12); // Clear output type register
- GPIOC->MODER &= ~ (GPIO_MODER_MODER10 | GPIO_MODER_MODER11 | GPIO_MODER_MODER12);// Clear mode register
- GPIOC->MODER |= ((GPIO_MODER_MODER10_1) | (GPIO_MODER_MODER11_1) | (GPIO_MODER_MODER12_1)); // Set mode register (0x00 - Input, 0x01 - Output, 0x02 - Alternate Function, 0x03 - Analog in/out)
- GPIOC->PUPDR &= ~((GPIO_PUPDR_PUPDR10) | (GPIO_PUPDR_PUPDR11) | (GPIO_PUPDR_PUPDR12)); // Clear push/pull register
- GPIOC->PUPDR |= ((GPIO_PUPDR_PUPDR10_1) | (GPIO_PUPDR_PUPDR11_1) | (GPIO_PUPDR_PUPDR12_1));
- GPIOA->OSPEEDR &= ~ (GPIO_OSPEEDER_OSPEEDR15);
- GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR15_0);
- GPIOA->OTYPER &= ~ (GPIO_OTYPER_OT_15);
- GPIOA->MODER &= ~ (GPIO_MODER_MODER15);
- GPIOA->MODER |= (GPIO_MODER_MODER15_0);
- GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR15);
- GPIOA->PUPDR |= (GPIO_PUPDR_PUPDR15_1);
- GPIOA->ODR |= GPIO_ODR_15; // CS = 1
- // Configure SPI3
- SPI3->CR1 &= 0x3040; // Clear CR1 Register
- SPI3->CR1 |= 0x0000; // Configure direction (0x0000 - 2 Lines Full Duplex, 0x0400 - 2 Lines RX Only, 0x8000 - 1 Line RX, 0xC000 - 1 Line TX)
- SPI3->CR1 |= 0x0104; // Configure mode (0x0000 - Slave, 0x0104 - Master)
- SPI3->CR1 |= 0x0002; // Configure clock polarity (0x0000 - Low, 0x0002 - High)
- SPI3->CR1 |= 0x0001; // Configure clock phase (0x0000 - 1 Edge, 0x0001 - 2 Edge)
- SPI3->CR1 |= 0x0200; // Configure chip select (0x0000 - Hardware based, 0x0200 - Software based)
- SPI3->CR1 |= 0x0028; // Set Baud Rate Prescaler (0x0000 - 2, 0x0008 - 4, 0x0018 - 8, 0x0020 - 16, 0x0028 - 32, 0x0028 - 64, 0x0030 - 128, 0x0038 - 128)
- SPI3->CR1 |= 0x0000; // Set Bit Order (0x0000 - MSB First, 0x0080 - LSB First)
- SPI3->CR2 &= ~0x0F00; // Clear CR2 Register
- SPI3->CR2 |= 0x0700; // Set Number of Bits (0x0300 - 4, 0x0400 - 5, 0x0500 - 6, ...);
- SPI3->I2SCFGR &= ~0x0800; // Disable I2S
- SPI3->CR2 &= ~0x1000;
- SPI3->CR2 |= 0x1000; // Configure RXFIFO return at (0x0000 - Half-full (16 bits), 0x1000 - Quarter-full (8 bits))
- SPI3->CR1 |= SPI_CR1_SPE; // Enable SPI3
- }
- void spi3_transmit_byte(uint8_t data) {
- GPIOA->ODR &= ~GPIO_ODR_15; // CS = 0 - Start Transmission
- while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) != SET) { }
- SPI3->DR = data;
- while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) != SET) { }
- //for (int i=0;i<10000;i++);
- GPIOA->ODR |= GPIO_ODR_15; // CS = 1 - End Transmission
- }
- int main(void){
- init_usb_uart(115200);
- init_SPI3();
- // init_spi_lcd();
- while(1){
- printf("Hello world!\n");
- for (int i=0;i<100000;i++){
- }
- spi3_transmit_byte(0b00110100);
- //lcd_transmit_byte('G');
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement