#include "Spi.h" #include "deca_device_api.h" void Spi_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); /* Enable SPI clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); /* SPI GPIO setup */ // SPIx SCK, MISO and MOSI pin setup GPIO_InitStructure.GPIO_Pin = SPIx_SCK | SPIx_MOSI | SPIx_MISO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPIx_GPIO, &GPIO_InitStructure); // SPIx CS pin setup GPIO_InitStructure.GPIO_Pin = SPIx_CS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPIx_CS_GPIO, &GPIO_InitStructure); // Set CS high GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS); SPI_I2S_DeInit(SPIx); // SPIx Mode setup SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPIx_CPOL; SPI_InitStructure.SPI_CPHA = SPIx_CPHA; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPIx_PRESCALER_SLOW; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPIx, &SPI_InitStructure); // Disable SPIx SS Output SPI_SSOutputCmd(SPIx, DISABLE); // Enable SPIx SPI_Cmd(SPIx, ENABLE); } void Spi_ChangePrescaler(uint16_t scaling_factor) { uint16_t tmpreg = 0; /* Get the SPIx CR1 value */ tmpreg = SPIx->CR1; /*clear the scaling bits*/ tmpreg &= 0xFFC7; /*set the scaling bits*/ tmpreg |= scaling_factor; /* Write to SPIx CR1 */ SPIx->CR1 = tmpreg; } /*! ------------------------------------------------------------------------------------------------------------------ * Function: writetospi() * * Low level abstract function to write to the SPI * Takes two separate byte buffers for write header and write data * returns 0 for success, or -1 for error */ int writetospi ( uint16_t headerLength, const uint8_t *headerBuffer, uint32_t bodylength, const uint8_t *bodyBuffer ) { int i = 0; decaIrqStatus_t stat ; stat = decamutexon() ; SPIx_CS_GPIO->BRR = SPIx_CS; for(i = 0; i < headerLength; i++) { SPIx->DR = headerBuffer[i]; while ((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); SPIx->DR ; } for(i = 0; i < bodylength; i++) { SPIx->DR = bodyBuffer[i]; while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); SPIx->DR ; } SPIx_CS_GPIO->BSRR = SPIx_CS; decamutexoff(stat) ; return 0; } // end writetospi() /*! ------------------------------------------------------------------------------------------------------------------ * Function: readfromspi() * * Low level abstract function to read from the SPI * Takes two separate byte buffers for write header and read data * returns the offset into read buffer where first byte of read data may be found, * or returns -1 if there was an error */ int readfromspi ( uint16_t headerLength, const uint8_t *headerBuffer, uint32_t readlength, uint8_t *readBuffer ) { int i = 0; decaIrqStatus_t stat ; stat = decamutexon() ; /* Wait for SPIx Tx buffer empty */ //while (port_SPIx_busy_sending()); SPIx_CS_GPIO->BRR = SPIx_CS; for(i = 0; i < headerLength; i++) { SPIx->DR = headerBuffer[i]; while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); readBuffer[0] = SPIx->DR ; // Dummy read as we write the header } for(i = 0; i < readlength; i++) { SPIx->DR = 0; // Dummy write as we read the message body while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); readBuffer[i] = SPIx->DR ;//port_SPIx_receive_data(); //this clears RXNE bit } SPIx_CS_GPIO->BSRR = SPIx_CS; decamutexoff(stat) ; return 0; } // end readfromspi()