void CMasterSPIHardware::init( SPI_TypeDef * hard_spi, const hard_SPI_config * config ) { SPI_InitTypeDef SPI_InitStructure; _spi = hard_spi; if (hard_spi == SPI1) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); else if (hard_spi == SPI2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); SPI_I2S_DeInit(hard_spi); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_DataSize = (config->num_of_bit - 1) << 8; SPI_InitStructure.SPI_CPOL = config->CPOL; SPI_InitStructure.SPI_CPHA = config->CPHA; SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; SPI_InitStructure.SPI_BaudRatePrescaler = config->prescaller; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(hard_spi, &SPI_InitStructure); SPI_SSOutputCmd(hard_spi, ENABLE); SPI_NSSPulseModeCmd(hard_spi, ENABLE); /* Initialize the FIFO threshold */ SPI_RxFIFOThresholdConfig(hard_spi, SPI_RxFIFOThreshold_QF); /* Enable the SPI peripheral */ SPI_Cmd(hard_spi, ENABLE); }
void initial_spi(void) { GPIO_InitTypeDef structGPIO; SPI_InitTypeDef structSPI; //NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF, ENABLE); //configure GPIO structGPIO.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7; //spi1 structGPIO.GPIO_Mode = GPIO_Mode_AF; structGPIO.GPIO_Speed = GPIO_Speed_50MHz; structGPIO.GPIO_OType = GPIO_OType_PP; structGPIO.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &structGPIO); structGPIO.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOB, &structGPIO); GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_5); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_5); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_5); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_5); structGPIO.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; //spi3 structGPIO.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &structGPIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_6); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_6); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_6); structGPIO.GPIO_Pin = GPIO_Pin_15; GPIO_Init(GPIOA, &structGPIO); GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_6); structGPIO.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; //spi2 structGPIO.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &structGPIO); structGPIO.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOF, &structGPIO); structGPIO.GPIO_Pin = GPIO_Pin_15; structGPIO.GPIO_Mode = GPIO_Mode_OUT; structGPIO.GPIO_OType = GPIO_OType_PP; structGPIO.GPIO_PuPd = GPIO_PuPd_UP; structGPIO.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &structGPIO); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_5); GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_5); //configure spi1 and spi3 SPI_StructInit(&structSPI); structSPI.SPI_Direction = SPI_Direction_1Line_Tx; structSPI.SPI_Mode = SPI_Mode_Master; structSPI.SPI_DataSize = SPI_DataSize_16b; structSPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4/*SPI_BaudRatePrescaler_32*/; structSPI.SPI_NSS = SPI_NSS_Hard; structSPI.SPI_CPOL = SPI_CPOL_Low; structSPI.SPI_CPHA = SPI_CPHA_1Edge; SPI_Init(SPI1, &structSPI); structSPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 /*SPI_BaudRatePrescaler_32*/; SPI_Init(SPI3, &structSPI); SPI_SSOutputCmd(SPI1, ENABLE); SPI_SSOutputCmd(SPI3, ENABLE); SPI_Cmd(SPI1, ENABLE); SPI_Cmd(SPI3, ENABLE); //configure spi2 GPIO_WriteBit(GPIOD, GPIO_Pin_15, Bit_SET); structSPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; structSPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_Init(SPI2, &structSPI); SPI_SSOutputCmd(SPI2, ENABLE); SPI_NSSPulseModeCmd(SPI2, DISABLE); SPI_Cmd(SPI2, ENABLE); return; }