Спойлер
Код: Выделить всё
#include "stm32f4xx.h"
#define AAFRL (*(uint32_t *) 0x40020020)
#define SPI1EN 12
#define CPHA (1<<0) // Phase
#define CPOL (1<<1) // Polarity
#define MSTR (1<<2) // Master
#define BR0 (1<<3) // BitRate
#define BR1 (1<<4) // BitRate
#define BR2 (1<<5) // BitRate
#define SPE (1<<6) // on/off
#define LSBFIRST (1<<7) // Poryadok peredachi (0 - MSBFIRST)
#define SSI (1<<8) // Soft NSS (1 - vibran)
#define SSM (1<<9) // Soft (1)/Hard (0) NSS
#define RXONLY (1<<10) // Only read, no write (2-wire mode)
#define DFF (1<<11) // 0 - 8bit, 1 - 16bit frame
#define CRCNEXT (1<<12) //
#define CRCEN (1<<13) //
#define BIDIOE (1<<14) // 1 - translate, 0 - read (for 2-ware mode)
#define BIDIMODE (1<<15) // mode 2-ware translate.
#define SSOE (1<<2) // Slave output enable
//Button PA0
//LEDs PD12-PD15
//SPI PA5-PA7 (A6 - in)
//Int & CS PE0, PE1, PE3 (E3 - out)
void Init_ports (void);
void SPI_init (void);
void Write_SPI (char, char);
char Read_SPI (char);
unsigned long delay=0, i=0;
int main (void)
{
char XXX=0;
Init_ports ();
SPI_init();
for (i=0; i<500; i++) {};
XXX = Read_SPI (0x0F);
if (XXX == 0x3b){
GPIOD->BSRRL = (1<<12) | (1<<13) | (1<<14) | (1<<15);}
while (1);
}
void Init_ports (void)
{
RCC->AHB1ENR |= 0x19;
GPIOE->MODER = 0x40;
GPIOE->OTYPER = 0;
GPIOE->OSPEEDR = 0xFFFFFFFF;
GPIOE->BSRRL = (1<<3);
GPIOA->MODER |= 0xA800;
GPIOA->MODER &= ~0x5400;
GPIOA->OTYPER &= ~(0xA0);
GPIOA->OSPEEDR |= 0xCC00;
//GPIOA->AFR |= 0x55500000;
AAFRL |= 0x55500000;
GPIOD->MODER = 0x55000000;
GPIOD->OTYPER = 0;
GPIOD->OSPEEDR = 0xFFFFFFFF;
}
void SPI_init (void)
{
RCC->APB2ENR |= 1<<SPI1EN;
SPI1->CR1 = 0;
SPI1->CR1 |= BR0 | BR1 | BR2;
SPI1->CR1 |= CPOL;
SPI1->CR1 |= SSI | SSM;
//SPI1->CR2 = SSOE;
SPI1->CR2 = 0;
SPI1->CR1 |= SPE | MSTR;
}
void Write_SPI (char addres, char znachenie)
{
GPIOE->BSRRH = (1<<3);
addres &= 0x3F;
while (!(SPI1->SR & (1<<1)));
SPI1->DR = addres;
while (!(SPI1->SR & (1<<1)));
SPI1->DR = znachenie;
while (!(SPI1->SR & (1<<1)));
GPIOE->BSRRL = (1<<3);
}
char Read_SPI (char addres)
{
GPIOE->BSRRH = (1<<3);
addres |= 0x80;
while (!(SPI1->SR & (1<<1)));
SPI1->DR = addres;
while (!(SPI1->SR & (1<<1)));
SPI1->DR = 0x00;
while (!(SPI1->SR & (1<<1)));
GPIOE->BSRRL = (1<<3);
return SPI1->DR;
}


