/* * Soft_SPI.c * * Created on: Nov 26, 2019 * Author: Adcis * * SCK_Pin, MOSI_Pin, MISO_Pin, CS0_Pin and CS1_Pin required to define in project * * Software SPI library for use with STM32 MCUs */ #include "main.h" #include "Soft_SPI.h" //#include "main.c" void SOFT_Power(int,int); void SOFT_SCK(unsigned int); //rizeni SCK pinu void SOFT_SPI(unsigned int); //rizeni MOSI pinu void SOFT_SPI_Send(unsigned int); //odeslani zpravy po SPI int SOFT_SPI_Receive(unsigned int); //prijem zpravy po SPI void SOFT_CS(unsigned int); //chip select - 0 = DA prevodnik, 1 = AD prevodnik, cokoliv jineho = nezvoleno nic void SOFT_SPI_CLK(unsigned int); //1 puls _|-|_ na SCK int SOFT_Power(int x, int y){ if (y == 0){ return 1; } else if (y % 2 == 0){ return SOFT_Power(x, y / 2) * SOFT_Power(x, y / 2); } else{ return x * SOFT_Power(x, y / 2) * SOFT_Power(x, y / 2); } } /** * @brief Controls SCK * * @param var = set state of SCK * * @retval None */ void SOFT_SCK(unsigned int state){ if(state == 1){ GPIOB->BSRR = SCK_Pin; } else{ GPIOB->BRR = SCK_Pin; } } /** * @brief Controls MOSI * * @param var = set state of MOSI * * @retval None */ void SOFT_SPI(unsigned int var){ if(var!=0){ GPIOB->BSRR = MOSI_Pin; } else{ GPIOB->BRR = MOSI_Pin; } } /** * @brief SPI CS control * * @param cs = what cs pin to use * * @retval None */ void SOFT_CS(unsigned int cs){ if(cs == 0){ GPIOB->BSRR = CS1_Pin; GPIOB->BRR = CS0_Pin; } else if(cs == 1){ GPIOB->BSRR = CS0_Pin; GPIOB->BRR = CS1_Pin; } else{ GPIOB->BSRR = CS0_Pin; GPIOB->BSRR = CS1_Pin; } } /** * @brief Sends SPI message * * @param value = what byte to send * * @retval None */ void SOFT_SPI_Send(unsigned int value){ unsigned int valueBin[] = {0,0,0,0,0,0,0,0}; if(value >= 128){ valueBin[0] = 1; value = value % 128; } if(value >= 64){ valueBin[1] = 1; value = value % 64; } if(value >= 32){ valueBin[2] = 1; value = value % 32; } if(value >= 16){ valueBin[3] = 1; value = value % 16; } if(value >= 8){ valueBin[4] = 1; value = value % 8; } if(value >= 4){ valueBin[5] = 1; value = value % 4; } if(value >= 2){ valueBin[6] = 1; } valueBin[7] = value % 2; SOFT_SCK(0); SOFT_SPI(valueBin[0]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[1]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[2]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[3]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[4]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[5]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[6]); SOFT_SCK(0); SOFT_SCK(1); SOFT_SPI(valueBin[7]); SOFT_SCK(0); SOFT_SCK(1); GPIOB->BRR = MOSI_Pin; SOFT_SCK(0); } /** * @brief Recieves SPI message * * @param bits = how long will received mesage be * * @retval uint16_t */ int SOFT_SPI_Receive(unsigned int bits){ uint8_t arr_bts[bits]; uint8_t sumarr[bits]; uint16_t sum; for(int i=0; i