Loading...
Searching...
No Matches
sensors.c
1/***********************************************************************************
2 * @file sensors.c *
3 * @author Matt Ricci *
4 * *
5 * @todo Move initialisation of SPI interface to individual devices initialising *
6 * relevant registers and peripherals. *
7 ***********************************************************************************/
8
9#include "sensors.h"
10
11void configure_SPI1_Sensor_Suite(void) {
12 GPIOA->MODER &= (~(GPIO_MODER_MODE5_Msk | GPIO_MODER_MODE6_Msk | GPIO_MODER_MODE7_Msk));
13 GPIOA->MODER |= ((0x2 << GPIO_MODER_MODE5_Pos) | (0x2 << GPIO_MODER_MODE6_Pos) | (0x2 << GPIO_MODER_MODE7_Pos));
14 GPIOA->AFR[0] &= (~(0xFFF00000)); // clears AFRL 5, 6 and 7
15 GPIOA->AFR[0] |= (0x55500000); // sets ports 5,6,7 to AF5
16
17 GPIOA->OTYPER &= (~(GPIO_OTYPER_OT5 | GPIO_OTYPER_OT6 | GPIO_OTYPER_OT7)); // configure as push pull
18 GPIOA->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED5_Msk | GPIO_OSPEEDR_OSPEED6_Msk | GPIO_OSPEEDR_OSPEED7_Msk)); // clears OSPEED
19 GPIOA->OSPEEDR |= (0x2 << GPIO_OSPEEDR_OSPEED5_Pos | 0x2 << GPIO_OSPEEDR_OSPEED6_Pos | 0x2 << GPIO_OSPEEDR_OSPEED7_Pos); // sets as high speed
20 // pins PC2, PC3, PC4 need to be set to interrupt pins
21 //
22 // pins PA2, PA4, PA1, PB0 need to set as general purpose outputs
23 GPIOA->MODER &= (~(GPIO_MODER_MODE1_Msk | GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk | GPIO_MODER_MODE4_Msk));
24 GPIOA->MODER |= ((0x1 << GPIO_MODER_MODE1_Pos) | (0x1 << GPIO_MODER_MODE2_Pos) | (0x1 << GPIO_MODER_MODE3_Pos) | (0x1 << GPIO_MODER_MODE4_Pos));
25 GPIOA->OTYPER &= (uint32_t)(~(GPIO_OTYPER_OT1 | GPIO_OTYPER_OT2 | GPIO_OTYPER_OT3 | GPIO_OTYPER_OT4)); // sets 0xboth as push-pull
26 GPIOA->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED1_Msk | GPIO_OSPEEDR_OSPEED2_Msk | GPIO_OSPEEDR_OSPEED3_Msk | GPIO_OSPEEDR_OSPEED4_Msk)); // clears Port 14 and 15 section
27 GPIOA->OSPEEDR |= ((0x2 << GPIO_OSPEEDR_OSPEED1_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED2_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED3_Pos) | (0x2 << GPIO_OSPEEDR_OSPEED4_Pos)); // sets slew rate as high speed
28 // PA2 Gryo Chip Select - set to high for default
29 // PA1 Accel 1 Chip Select - set to high for default
30 // PA4 Mag - chip select - set to high for dafault
31
32 GPIOA->ODR |= (GPIO_ODR_OD1 | GPIO_ODR_OD2 | GPIO_ODR_OD3 | GPIO_ODR_OD4); // sets to high to disable chip select
33
34 GPIOB->MODER &= (~(GPIO_MODER_MODE0_Msk));
35 GPIOB->MODER |= (0x1 << GPIO_MODER_MODE0_Pos);
36 GPIOB->OTYPER &= (~(GPIO_OTYPER_OT0));
37 GPIOB->OSPEEDR &= (~(GPIO_OSPEEDR_OSPEED0_Msk));
38 GPIOB->OSPEEDR |= (0x2 << GPIO_OSPEEDR_OSPEED0_Pos);
39
40 // PB0 Accel 1 Chip Select - set to high for default
41 GPIOB->ODR |= (GPIO_ODR_OD0);
42
43 // Clear the First Control register of the SPI peripheral.
44 SPI1->CR1 &= 0xFFFF0000;
45
46 // Configure the SCLK to be divide by 8,
47 SPI1->CR1 |= (0x02 << SPI_CR1_BR_Pos) | (1 << SPI_CR1_CPOL_Pos) | (1 << SPI_CR1_CPHA_Pos) | (0 << SPI_CR1_DFF_Pos);
48
49
50 // Set to full duplex, master mode.
51 // In full duplex, both the MISO and MOSI pins are required.
52 SPI1->CR1 &= ~(SPI_CR1_BIDIMODE);
53 SPI1->CR1 &= ~(SPI_CR1_RXONLY);
54
55 // Set the slave select - software management.
56 SPI1->CR1 |= (SPI_CR1_SSM | SPI_CR1_SSI);
57
58 // Specify master operation.
59 SPI1->CR1 |= SPI_CR1_MSTR;
60
61 // Manually raise the chip select.
62 GPIOA->ODR |= (1 << GPIO_ODR_OD4_Pos) | (1 << GPIO_ODR_OD3_Pos) | (1 << GPIO_ODR_OD2_Pos) | (1 << GPIO_ODR_OD1_Pos);
63
64 // Enable the SPI peripheral
65 SPI1->CR1 |= SPI_CR1_SPE;
66
67
68
69}