From 8b2130484c055ebfe09862fd6df403b97faa64ca Mon Sep 17 00:00:00 2001 From: Michael Wiebusch Date: Tue, 7 Jan 2014 15:03:54 +0100 Subject: [PATCH] added delay_us function, spi1 working --- firmware/src/CB_functions.c | 8 +++- firmware/src/main.c | 3 +- firmware/src/misc_utils.c | 16 ++++++- firmware/src/misc_utils.h | 1 + firmware/src/spi1.c | 92 +++++++++++++++++++++++++++++++++++-- firmware/src/spi1.h | 7 ++- firmware/src/stm32f10x_it.c | 9 ++-- firmware/src/stm32f10x_it.h | 4 ++ 8 files changed, 126 insertions(+), 14 deletions(-) diff --git a/firmware/src/CB_functions.c b/firmware/src/CB_functions.c index e563b35..8f65567 100644 --- a/firmware/src/CB_functions.c +++ b/firmware/src/CB_functions.c @@ -10,6 +10,7 @@ #include "periph_conf.h" #include "stm32f10x_conf.h" #include "misc_utils.h" +#include "spi1.h" @@ -97,7 +98,12 @@ void decode_register(uint8_t addr) { uart_word_to_dac(((thisRegister&0xFFFF)>>4) | (6<<12)); case 0xF: //SPI Debug - uart_word_to_dac( (uint16_t) (thisRegister&0xFFFF)); +// uart_word_to_dac( (uint16_t) (thisRegister&0xFFFF)); +// CB_GPIO_Out_Lo(ADC_CONV0); +// spi_writeTwoBytes(((thisRegister&0xFF00)>>8),(thisRegister&0xFF)); + spi_writeWord(thisRegister); +// delay_us(1500); +// CB_GPIO_Out_Hi(ADC_CONV0); break; case 0x11: // LEDs diff --git a/firmware/src/main.c b/firmware/src/main.c index 2babe91..2146131 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -15,6 +15,7 @@ #include "CB_functions.h" #include "usart1.h" +#include "spi1.h" #include "spi2.h" #include "dac.h" #include "periph_conf.h" @@ -63,7 +64,7 @@ int main(int argc, char *argv[]) { // SysTick_Config(72000); // 1000 hz - + init_SPI1(); init_SPI2(); diff --git a/firmware/src/misc_utils.c b/firmware/src/misc_utils.c index e1d84c2..8af2bb3 100644 --- a/firmware/src/misc_utils.c +++ b/firmware/src/misc_utils.c @@ -19,6 +19,21 @@ void delay_ms(uint16_t time_ms) { counter = time_ms; SysTick_Config(72000); // 1000 hz while(counter != 0); + // disable SysTick interrupt + SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk); + +} + +void delay_us(uint16_t time_us) { + counter = time_us; + SysTick_Config(72); // 1 MHz + while(counter != 0); + // disable SysTick interrupt + SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk); } @@ -30,7 +45,6 @@ void SysTick_Handler(void) - // implementation of a ring buffer struct Buffer { uint8_t data[BUFFER_SIZE]; diff --git a/firmware/src/misc_utils.h b/firmware/src/misc_utils.h index 9172eb9..3d1a715 100644 --- a/firmware/src/misc_utils.h +++ b/firmware/src/misc_utils.h @@ -26,6 +26,7 @@ void SysTick_Handler(void); //void delay_us(uint32_t time_us); void delay_ms(uint16_t time_ms); +void delay_us(uint16_t time_us); uint8_t BufferIn(uint8_t byte); uint8_t BufferOut(uint8_t *pByte); diff --git a/firmware/src/spi1.c b/firmware/src/spi1.c index c7b6eca..d029a69 100644 --- a/firmware/src/spi1.c +++ b/firmware/src/spi1.c @@ -1,4 +1,6 @@ #include "spi1.h" +#include "CB_functions.h" +#include "periph_conf.h" #define BUFFER_SIZE 2 @@ -9,12 +11,17 @@ uint16_t CS_GPIO_Pin; uint8_t spiRxCounter; uint8_t spiTxCounter; uint8_t spiBusyFlag; -uint8_t spiDataBuffer[BUFFER_SIZE]; +uint16_t spiDataBuffer[BUFFER_SIZE]; + + +GPIO_InitTypeDef GPIO_InitStructure; +NVIC_InitTypeDef NVIC_InitStructure; +SPI_InitTypeDef SPI_InitStructure; -void spi_create(SPI_TypeDef * SPIx, GPIO_TypeDef * CS_GPIOx, uint16_t CS_GPIO_Pin_x){ +void spi_create(SPI_TypeDef * SPIx, GPIO_TypeDef * CS_GPIOx){ SPI_Module = SPIx; CS_GPIO = CS_GPIOx; - CS_GPIO_Pin = CS_GPIO_Pin_x; +// CS_GPIO_Pin = CS_GPIO_Pin_x; spiBusyFlag = 0; } @@ -27,11 +34,13 @@ void spi_disableTxInterrupt(void){ } void spi_chipSelect(void){ - GPIO_WriteBit(CS_GPIO, CS_GPIO_Pin, RESET); +// GPIO_WriteBit(CS_GPIO, CS_GPIO_Pin, RESET); + CB_GPIO_Out_Lo(ADC_CONV0); // spi nCS -> idle Hi } void spi_chipDeselect(void){ - GPIO_WriteBit(CS_GPIO, CS_GPIO_Pin, SET); +// GPIO_WriteBit(CS_GPIO, CS_GPIO_Pin, SET); + CB_GPIO_Out_Hi(ADC_CONV0); // spi nCS -> idle Hi } void spi_writeTwoBytes(uint8_t byte1, uint8_t byte0){ @@ -44,6 +53,17 @@ void spi_writeTwoBytes(uint8_t byte1, uint8_t byte0){ spi_chipSelect(); spi_enableTxInterrupt(); } + +void spi_writeWord(uint16_t word){ + while(spiBusyFlag){} + spiTxCounter = 1; + spiRxCounter = 1; + spiBusyFlag = 1; + spiDataBuffer[0] = word; + spi_chipSelect(); + spi_enableTxInterrupt(); + +} void spi_handleSPI1Interrupt(void){ if(SPI_I2S_GetFlagStatus(SPI_Module, SPI_I2S_FLAG_RXNE) == SET){ @@ -64,4 +84,66 @@ void spi_handleSPI1Interrupt(void){ spi_disableTxInterrupt(); } } +} + + + + + + + + + + + + + + +void init_SPI1(void){ + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + + // CS pin is already initialized by CB_functions +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; +// GPIO_Init(GPIOA, &GPIO_InitStructure); + +// GPIO_WriteBit(GPIOA, GPIO_Pin_8, SET); + + NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; + SPI_InitStructure.SPI_CRCPolynomial = 0; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_Init(SPI1, &SPI_InitStructure); + + SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); + + SPI_Cmd(SPI1, ENABLE); + + // on top :D + spi_create(SPI1, GPIOA); + } \ No newline at end of file diff --git a/firmware/src/spi1.h b/firmware/src/spi1.h index 24394b3..5ff1482 100644 --- a/firmware/src/spi1.h +++ b/firmware/src/spi1.h @@ -1,5 +1,8 @@ #include "stm32f10x_conf.h" -void spi_create(SPI_TypeDef * SPIx, GPIO_TypeDef * CS_GPIOx, uint16_t CS_GPIO_Pin); +void spi_create(SPI_TypeDef * SPIx, GPIO_TypeDef * CS_GPIOx); void spi_handleSPI1Interrupt(void); -void spi_writeTwoBytes(uint8_t byte1, uint8_t byte0); \ No newline at end of file +void spi_writeTwoBytes(uint8_t byte1, uint8_t byte0); +void spi_writeWord(uint16_t word); + +void init_SPI1(void); \ No newline at end of file diff --git a/firmware/src/stm32f10x_it.c b/firmware/src/stm32f10x_it.c index 0d7f1f8..0044363 100644 --- a/firmware/src/stm32f10x_it.c +++ b/firmware/src/stm32f10x_it.c @@ -28,7 +28,7 @@ /* custom includes for this project */ // #include "serial.h" -// #include "spi.h" +#include "spi1.h" /** @addtogroup STM32F10x_StdPeriph_Template @@ -50,9 +50,10 @@ /* from diller-tech */ -// void SPI1_IRQHandler(void){ -// spi_handleSPI1Interrupt(); -// } + +void SPI1_IRQHandler(void){ + spi_handleSPI1Interrupt(); +} diff --git a/firmware/src/stm32f10x_it.h b/firmware/src/stm32f10x_it.h index adb1f50..1e7a65e 100644 --- a/firmware/src/stm32f10x_it.h +++ b/firmware/src/stm32f10x_it.h @@ -48,6 +48,10 @@ void SysTick_Handler(void); //for spi with dma void spi_handleDMA1Ch4Interrupt(void); +//for spi1 + +void SPI1_IRQHandler(void); + #ifdef __cplusplus } -- 2.43.0