Suwmiarka/Soft/Suwmiarka/spi.c

77 lines
2.1 KiB
C

#include "pio.h"
#include "error.h"
#include "hardware.h"
#include "stm32f10x.h"
#include <stdint.h>
uint8_t InBuffer[SPI_BSIZE];
int8_t SPI_Initialize(void)
{
GPIO_InitTypeDef GPIO_Conf;
SPI_InitTypeDef SPI_Conf;
DMA_InitTypeDef DMA_Conf;
/* Zegar GPIOA,SPI1 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);
//MOSI,SCK,CS - wyjście PER
GPIO_Conf.GPIO_Pin=MOSI1|SCK1;
GPIO_Conf.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Conf);
//MISO - wejście
GPIO_Conf.GPIO_Pin=MISO1;
GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_Conf);
//Konfuiguracja portu
SPI_Conf.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_Conf.SPI_Mode = SPI_Mode_Slave;
SPI_Conf.SPI_DataSize = SPI_DataSize_8b;
SPI_Conf.SPI_CPOL = SPI_CPOL_Low; //mode 01
SPI_Conf.SPI_CPHA = SPI_CPHA_2Edge; //mode 01
SPI_Conf.SPI_NSS = SPI_NSS_Hard ;
SPI_Conf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_Conf.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Conf.SPI_CRCPolynomial = 0;
SPI_Init(port, &SPI_Conf);
//CS wyłączony
SPI_SSOutputCmd(port,DISABLE);
//bez CRC
SPI_CalculateCRC(port,DISABLE);
//skonfiguruj DMA
//odbiór przez DMA - kanał 4
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_DeInit(DMA1_Channel4);
DMA_Conf.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_Conf.DMA_M2M = DMA_M2M_Disable;
DMA_Conf.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_Conf.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Conf.DMA_MemoryBaseAddr = (uint32_t)InBuffer;
DMA_Conf.DMA_BufferSize = SPI_BSIZE;
DMA_Conf.DMA_Mode=DMA_Mode_Circular;
DMA_Conf.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
DMA_Conf.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_Conf.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Conf.DMA_Priority = DMA_Priority_VeryHigh;
DMA_Init(DMA1_Channel4,&DMA_Conf);
DMA_Cmd(DMA1_Channel4, ENABLE);
//włącz DMA
SPI_I2S_DMACmd(port,SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx,ENABLE);
//Włącz SPI
SPI_Cmd(port, ENABLE);
}
int8_t SPI_State(void);
int8_t SPI_Poll(uint8_t *measure,uint8_t length);