STM32_Examples/Soft_SPI.c
2021-07-01 14:12:44 +02:00

211 lines
4.6 KiB
C

/*
* 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<bits;i++){
SOFT_SCK(1);
if(HAL_GPIO_ReadPin(GPIOB, MISO_Pin) == 1){
arr_bts[i] = 1;
}
else{
arr_bts[i] = 0;
}
#ifndef FAST_SPI
sumarr[i] = arr_bts[i] * power(2 , bits - i - 1);
#endif
SOFT_SCK(0);
}
#ifdef FAST_SPI
for(int i = 0; i < bits; i++){
sumarr[i] = arr_bts[i] * SOFT_Power(2 , bits - i - 1);
}
#endif
//receive string
if(bits==12){
sum = sumarr[0]+sumarr[1]+sumarr[2]+sumarr[3]+sumarr[4]+sumarr[5]+sumarr[6]+sumarr[7]+sumarr[8]+sumarr[9]+sumarr[10]+sumarr[11];
}
else if(bits==16){
sum = sumarr[0]+sumarr[1]+sumarr[2]+sumarr[3]+sumarr[4]+sumarr[5]+sumarr[6]+sumarr[7]+sumarr[8]+sumarr[9]+sumarr[10]+sumarr[11]+sumarr[12]+sumarr[13]+sumarr[14]+sumarr[15];
}
else if(bits==8){
sum = sumarr[0]+sumarr[1]+sumarr[2]+sumarr[3]+sumarr[4]+sumarr[5]+sumarr[6]+sumarr[7];
}
else{
sum = 0;
}
return sum;
}
/**
* @brief SPI clk
*
* @param cycles = how many cycles to make
*
* @retval None
*/
void SOFT_SPI_CLK(unsigned int cycles){
for(int i=0;i<cycles;i++){
SOFT_SCK(1);
for(int j=0;j<1;j++);
SOFT_SCK(0);
}
}