void SPI2_InitDriver(void) {     uint16 dir = SPI_Direction_2Lines_FullDuplex;     uint16 mode = SPI_Mode_Master;     uint16 datasz = SPI_DataSize_8b;     uint16 cpol = SPI_CPOL_High;     uint16 cpha = SPI_CPHA_2Edge;     uint16 nss = SPI_NSS_Soft;     uint16 baudrate = SPI_BaudRatePrescaler_8;     uint16 firstb = SPI_FirstBit_MSB;     uint16 polynominal = 7;     SPI_InitTypeDef  t_spi;     GPIO_InitTypeDef t_gpio;     sSPI_BUS         spi2;     spi2.pSPIx = SPI2;     spi2.pGPIO = SPI2_PORT;     spi2.NSS   = SPI2_NSS;     spi2.SCK   = SPI2_SCK;     spi2.MISO  = SPI2_MISO;     spi2.MOSI  = SPI2_MOSI;     DebugPrintf("");     t_gpio.GPIO_Pin   = spi2.MOSI | spi2.MISO | spi2.SCK;     t_gpio.GPIO_Speed = GPIO_Speed_50MHz;     t_gpio.GPIO_Mode  = GPIO_Mode_AF_PP;     GPIO_Init(spi2.pGPIO, &t_gpio);     t_gpio.GPIO_Pin   = spi2.NSS;     t_gpio.GPIO_Speed = GPIO_Speed_50MHz;     t_gpio.GPIO_Mode  = GPIO_Mode_Out_PP;     GPIO_Init(spi2.pGPIO, &t_gpio);     SPI_I2S_DeInit(spi2.pSPIx);         // Configure SPI     t_spi.SPI_Direction         = dir;     t_spi.SPI_Mode              = mode;     t_spi.SPI_DataSize          = datasz;     t_spi.SPI_CPOL              = cpol;     t_spi.SPI_CPHA              = cpha;     t_spi.SPI_NSS               = nss;     t_spi.SPI_BaudRatePrescaler = baudrate;     t_spi.SPI_FirstBit          = firstb;     t_spi.SPI_CRCPolynomial     = polynominal;     SPI_Init(spi2.pSPIx, &t_spi);     SPI_COM2_DISABLE(); } /* SPI_InitDriver */ void SPI3_InitDriver(void) {     uint16 dir = SPI_Direction_2Lines_FullDuplex;     uint16 mode = SPI_Mode_Master;     uint16 datasz = SPI_DataSize_8b;     uint16 cpol = SPI_CPOL_High;     uint16 cpha = SPI_CPHA_2Edge;     uint16 nss = SPI_NSS_Soft;     uint16 baudrate = SPI_BaudRatePrescaler_8;     uint16 firstb = SPI_FirstBit_MSB;     uint16 polynominal = 7;     SPI_InitTypeDef  t_spi;     GPIO_InitTypeDef t_gpio;     sSPI_BUS         spi3;     spi3.pSPIx = SPI3;     spi3.pGPIO = SPI3_PORT;     spi3.NSS   = SPI3_NSS;     spi3.SCK   = SPI3_SCK;     spi3.MISO  = SPI3_MISO;     spi3.MOSI  = SPI3_MOSI;     t_gpio.GPIO_Pin   = spi3.MOSI | spi3.MISO | spi3.SCK;     t_gpio.GPIO_Speed = GPIO_Speed_50MHz;     t_gpio.GPIO_Mode  = GPIO_Mode_AF_PP;     GPIO_Init(spi3.pGPIO, &t_gpio);     t_gpio.GPIO_Pin   = spi3.NSS;     t_gpio.GPIO_Speed = GPIO_Speed_50MHz;     t_gpio.GPIO_Mode  = GPIO_Mode_Out_PP;     GPIO_Init(spi3.pGPIO, &t_gpio);     SPI_I2S_DeInit(spi3.pSPIx);     // Configure SPI     t_spi.SPI_Direction         = dir;     t_spi.SPI_Mode              = mode;     t_spi.SPI_DataSize          = datasz;     t_spi.SPI_CPOL              = cpol;     t_spi.SPI_CPHA              = cpha;     t_spi.SPI_NSS               = nss;     t_spi.SPI_BaudRatePrescaler = baudrate;     t_spi.SPI_FirstBit          = firstb;     t_spi.SPI_CRCPolynomial     = polynominal;     SPI_Init(spi3.pSPIx, &t_spi);     SPI_COM3_DISABLE(); } /* SPI_InitDriver */ /************************************************************************************************************* ************************************************************************************************************** * GLOBAL FUNCTIONS ************************************************************************************************************** *************************************************************************************************************/ /*********************************************************************************************************//** * @retval None * @brief Initialize the SPI device driver. *************************************************************************************************************/ /*********************************************************************************************************//** * @param[in] comn : SPI channel *            txb : Data to be transmit * @retval None * @brief Transmit data in SPI master mode. *************************************************************************************************************/ // ************************************ SPI2 ************************************// void TMC5xxx_WriteRegister(uint08 rega, uint32 regd) {     uint08  cmdw;     SPI2_NSS_LOW();     asm("nop");     asm("nop");     cmdw = rega | 0x80;     Tmc_ByteWrite(cmdw);     asm("nop");     Tmc_ByteWrite(((regd>>24)&0xFF));        // Word data3     asm("nop");     Tmc_ByteWrite(((regd>>16)&0xFF));        // Word data2     asm("nop");     Tmc_ByteWrite(((regd>>8)&0xFF));         // Word data1     asm("nop");     Tmc_ByteWrite(((regd)&0xFF));            // Word data0     asm("nop");     asm("nop");     SPI2_NSS_HIGH();     asm("nop");     asm("nop"); } /* WriteRegister */ uint32 TMC5xxx_ReadRegister(uint08 rega) {     uint32 rdata;     uint08 i, rxData[5];    //addr,     SPI2_NSS_LOW();     asm("nop");     Tmc_ByteWrite(rega);     for (i=0; i<4; i++)     {         rxData[i] = Tmc_ByteWrite(0x00);         asm("nop");     }     asm("nop");     SPI2_NSS_HIGH();     asm("nop");     asm("nop");     SPI2_NSS_LOW();     asm("nop");     Tmc_ByteWrite(rega);     for (i=0; i<4; i++)     {         rxData[i] = Tmc_ByteWrite(0x00);     }     asm("nop");     SPI2_NSS_HIGH();     rdata = (rxData[0]<<24)|(rxData[1]<<16)|(rxData[2]<<8)|(rxData[3]);     return rdata; } uint8_t Tmc_ByteWrite(uint8_t wData) {     unsigned char read_data = 0;     while (!(SPI2->SR & SPI_I2S_FLAG_TXE));     SPI2->DR = wData;     while (!(SPI2->SR & SPI_I2S_FLAG_RXNE));     while ((SPI2->SR & SPI_I2S_FLAG_BSY));     read_data = SPI2->DR;     return read_data; } // ************************************ SPI3 ************************************// void TMC5xxx_WriteRegister_1(uint08 rega, uint32 regd) {     uint08  cmdw;     SPI3_NSS_LOW();     asm("nop");     asm("nop");     cmdw = rega | 0x80;     Tmc_ByteWrite_1(cmdw);     asm("nop");     Tmc_ByteWrite_1(((regd>>24)&0xFF));        // Word data3     asm("nop");     Tmc_ByteWrite_1(((regd>>16)&0xFF));        // Word data2     asm("nop");     Tmc_ByteWrite_1(((regd>>8)&0xFF));         // Word data1     asm("nop");     Tmc_ByteWrite_1(((regd)&0xFF));            // Word data0     asm("nop");     asm("nop");     SPI3_NSS_HIGH();     asm("nop");     asm("nop"); } /* WriteRegister */ uint32 TMC5xxx_ReadRegister_1(uint08 rega) {     uint32 rdata;     uint08 i, rxData[5];    //addr,     SPI3_NSS_LOW();     asm("nop");     Tmc_ByteWrite_1(rega);     for (i=0; i<4; i++)     {         rxData[i] = Tmc_ByteWrite_1(0x00);         asm("nop");     }     asm("nop");     SPI3_NSS_HIGH();     asm("nop");     asm("nop");     SPI3_NSS_LOW();     asm("nop");     Tmc_ByteWrite_1(rega);     for (i=0; i<4; i++)     {         rxData[i] = Tmc_ByteWrite_1(0x00);     }     asm("nop");     SPI3_NSS_HIGH();     rdata = (rxData[0]<<24)|(rxData[1]<<16)|(rxData[2]<<8)|(rxData[3]);     return rdata; } uint8_t Tmc_ByteWrite_1(uint8_t wData) {     unsigned char read_data = 0;     while (!(SPI3->SR & SPI_I2S_FLAG_TXE));     SPI3->DR = wData;     while (!(SPI3->SR & SPI_I2S_FLAG_RXNE));     while ((SPI3->SR & SPI_I2S_FLAG_BSY));     read_data = SPI3->DR;     return read_data; }