
void SPI1_init (void)
{

  GPIOB->MODER   |= GPIO_MODER_MODER5_1|GPIO_MODER_MODER3_1;           // PB3,5 (CLK,DAT) - Alternate function mode
  GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5|GPIO_OSPEEDER_OSPEEDR3;     // PB3,5 (CLK,DAT) - High speed
  
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;    //включить тактирование SPI1
  //RCC->AHBENR  |= RCC_AHBENR_CRCEN;      //включить тактирование CRC

  SPI1->CR1 = 0x0000;
  SPI1->CR2 = 0x0000;
  
  SPI1->CR1 |= SPI_CR1_BR_2|SPI_CR1_BR_1|SPI_CR1_BR_0;         // скорость обмена fclk/256
 
  SPI1->CR1 |= SPI_CR1_MSTR;                                   // мастер
  
  //SPI1->CR1 |= SPI_CR1_CPHA;                                 //Фаза тактового сигнала
  //SPI1->CR1 |= SPI_CR1_CPOL;                                 //Полярность тактового сигнала
  
  SPI1->CR1 |= SPI_CR1_BIDIOE;
  SPI1->CR1 |= SPI_CR1_BIDIMODE;
  
  //SPI1->CR1 |= SPI_CR1_SSI;
  //SPI1->CR1 |= SPI_CR1_SSM;
  //SPI1->CR2 |= SPI_CR2_NSSP;
  
  SPI1->CR2 |= SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0;   // 8 bit
  SPI1->CR2 |= SPI_CR2_SSOE;                                 //Вывод NSS - выход управления

  SPI1->CR1 |= SPI_CR1_SPE;                                  //разрешить работу модуля SPI
  
  
}

void SPI_Send(uint16_t Data) {
  while (!(SPI1->SR &= SPI_SR_TXE));
  SPI1->DR = Data;
}







// программный SPI
/*
#define   SPI_CLK_HI       GPIOB->BSRR = GPIO_BSRR_BS_3
#define   SPI_CLK_LO       GPIOB->BSRR = GPIO_BSRR_BR_3

#define   SPI_DAT_HI       GPIOB->BSRR = GPIO_BSRR_BS_5
#define   SPI_DAT_LO       GPIOB->BSRR = GPIO_BSRR_BR_5



void SPI1_init (void)
{
  GPIOB->MODER   |= (GPIO_MODER_MODER3_0|GPIO_MODER_MODER5_0);           // PB3,5 - General purpose output mode
  GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR3|GPIO_OSPEEDER_OSPEEDR3);     // PB3,5 - High speed
  GPIOB->PUPDR   |= (GPIO_PUPDR_PUPDR3_0|GPIO_PUPDR_PUPDR5_0);           // PB3,5 - Pull-up
};

void SPI_Send(unsigned char d)
{
   unsigned long i;
 
   // отправить 1 байт
   for(i=0; i<8; i++)
   {
 
      // проверить старш бит = 1
      if (d & 0x80)
      {
         SPI_DAT_HI; // передать 1
      }
      else
      {
         SPI_DAT_LO; // передать 0
      }
 
      SPI_CLK_HI; // синхроимпульс
      d <<= 1;     // сдвиг для передачи след бита
      //NOP();
      //NOP();
      SPI_CLK_LO; // синхроимпульс
   }
}
*/
