This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

SPI Program(for STM32f407) in Keil RTX5

SPI Program for STM32F407 Disco Board.

I write SPI program using direct register. But i failed to communicate the SPI.
Please can anyone find, where i did the mistake.


/*----------------------------------------------------------------------------
 * CMSIS-RTOS 'main' function template
 *---------------------------------------------------------------------------*/

#include "RTE_Components.h"
#include  CMSIS_device_header
#include "cmsis_os2.h"

#define SPI_CRCPR_CRCPOLYNOMIAL_7     ((uint16_t)0x0007U)

#ifdef RTE_Compiler_EventRecorder
#include "EventRecorder.h"
#endif


void GPIOB_init();
void SPI2_init();
void GPIOD_init();
void SPI2_writ(uint16_t);

osThreadId_t spi2_id1;
osThreadId_t ledblink_id1;
osThreadId_t ledblink_id2;
osThreadId_t ledblink_id3;
osThreadId_t ledblink_id4;

/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
void app_main (void *argument) {

  // ...
  for (;;) {}
}

void led_blink1()
{
        while(1)
        {
                GPIOD->ODR ^= 0x8000;
                osDelay(500);
        }
}

void led_blink2()
{
        uint16_t tmp[] = {0x41, 0x42, 0x43, 0x44, 0x45,0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D};
        uint16_t i=0;
        while(1)
        {
                GPIOD->ODR ^= 0x4000;
                osDelay(10);
                for(i=0;i<13;i++){
                SPI2_writ(tmp[i]);
                }
        }
}

void led_blink3()
{
        while(1)
        {
                GPIOD->ODR ^= 0x2000;
                osDelay(800);
        }
}

void led_blink4()
{
        while(1)
        {
                GPIOD->ODR ^= 0x1000;
                osDelay(800);
        }
}


int main (void) {

  // System Initialization
  SystemCoreClockUpdate();
#ifdef RTE_Compiler_EventRecorder
  // Initialize and start Event Recorder
  EventRecorderInitialize(EventRecordError, 1U);
#endif
  // ...

        GPIOD_init();
        GPIOD->ODR = 0xF000;
        GPIOB_init();
        SPI2_init();

  osKernelInitialize();                 // Initialize CMSIS-RTOS
  osThreadNew(app_main, NULL, NULL);    // Create application main thread
        ledblink_id1 = osThreadNew(led_blink1, NULL, NULL);
        ledblink_id2 = osThreadNew(led_blink2, NULL, NULL);
        ledblink_id3 = osThreadNew(led_blink3, NULL, NULL);
        ledblink_id4 = osThreadNew(led_blink4, NULL, NULL);
//      osThreadSuspend(ledblink_id2);
        osThreadSuspend(ledblink_id3);
        osThreadSuspend(ledblink_id4);
  osKernelStart();                      // Start thread execution
  for (;;) {}
}



void GPIOD_init()  {   //  LED Initialize
        RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;         //Enable GPIO port D clock
        GPIOD->MODER = GPIO_MODER_MODE12_0 | GPIO_MODER_MODE13_0 | GPIO_MODER_MODE14_0 | GPIO_MODER_MODE15_0;
        GPIOD->PUPDR |= GPIO_PUPDR_PUPD12_1 | GPIO_PUPDR_PUPD13_1 | GPIO_PUPDR_PUPD14_1 | GPIO_PUPDR_PUPD15_1;    //  Pull-down
        GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12_0 | GPIO_OSPEEDER_OSPEEDR13_0 | GPIO_OSPEEDER_OSPEEDR14_0 | GPIO_OSPEEDER_OSPEEDR15_0;
}

void GPIOB_init() {
        GPIOD->ODR ^= 0x2000;
        RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;         //Enable GPIO port B clock
// osThreadResume(ledblink_id4);
        // PB12:SPI_SEL   // 14
        // PB13:SPI2_SCK  // 21
        // PB14:SPI2_MISO // 22
        // PB15:SPI2_MOSI // 23

//GPIOB->BSRR |= GPIO_BSRR_BR_8;
//GPIOB->BRR|= GPIO_BRR_BR_12;
GPIOB->MODER &= ~GPIO_MODER_MODE12;  //PB12 RESET
GPIOB->MODER |= GPIO_MODER_MODE12_0;  //PB12 General purpose output mode
GPIOB->ODR &= ~GPIO_ODR_OD12; //PB12 : cs LOW
GPIOB->MODER &= ~GPIO_MODER_MODE13; //PB13 Alternate Function
GPIOB->MODER |= GPIO_MODER_MODE13_1;
GPIOB->MODER &= ~GPIO_MODER_MODE14; //PB14 Alternate Function
GPIOB->MODER |= GPIO_MODER_MODE14_1;
GPIOB->MODER &= ~GPIO_MODER_MODE15; //PB15 Alternate Function
GPIOB->MODER |= GPIO_MODER_MODE15_1;

 GPIOB->PUPDR |= GPIO_PUPDR_PUPD12_1;    //  Pull-down for Slave Select PIN
 GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD13 | GPIO_PUPDR_PUPD14 | GPIO_PUPDR_PUPD15 );   //  No pull-up, pull-down for SPI2 Pins: SCK, MISO and MOSI
 GPIOB->OTYPER &= ~(GPIO_OTYPER_OT12 | GPIO_OTYPER_OT13 | GPIO_OTYPER_OT14 | GPIO_OTYPER_OT15 );  //  Output push-pull (reset state)
 GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12_0 | GPIO_OSPEEDER_OSPEEDR13_0 | GPIO_OSPEEDER_OSPEEDR14_0 | GPIO_OSPEEDER_OSPEEDR15_0;     //  Medium speed

//set alternate function AF0
    GPIOB->AFR[1] &= ~GPIO_AFRH_AFRH5; //PB13-CLK    alternate function RESET
                GPIOB->AFR[1] |= GPIO_AFRH_AFRH5_0 | GPIO_AFRH_AFRH5_2; //PB13-CLK       alternate function SET   PB13: SPI2_SCK //21

    GPIOB->AFR[1] &= ~GPIO_AFRH_AFRH6; //PB14-MISO    alternate function RESET
                GPIOB->AFR[1] |= GPIO_AFRH_AFRH6_0 | GPIO_AFRH_AFRH5_2; //PB14-MISO      alternate function SET   PB14:SPI2_MISO // 22

    GPIOB->AFR[1] &= ~GPIO_AFRH_AFRH7; //PB15-MOSI    alternate function RESET
                GPIOB->AFR[1] |= GPIO_AFRH_AFRH7_0 | GPIO_AFRH_AFRH7_2; //PB15-MOSI      alternate function SET   PB15:SPI2_MOSI // 23
}


void SPI2_init() {
//      osThreadResume(ledblink_id3);
        RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;  //Enable SPI2 clock
//      GPIOB_init(); // GPIO clock enable, digital pin definitions
        SPI2->CR1 &= ~(SPI_CR1_BIDIMODE | SPI_CR1_DFF | SPI_CR1_CPOL | SPI_CR1_LSBFIRST | SPI_CR1_CRCEN);    //  2Lines_FullDuplex, SPI_DataSize_8bit, CPOL_Low, FirstBit_MSB, No_CRC_ERROR(Disabled)
        SPI2->CR1 |= SPI_CR1_MSTR | SPI_CR1_CPHA | SPI_CR1_SSM | SPI_CR1_BR_0 | SPI_CR1_BR_2;    // SPI_Mode_Master, CPHA_2Edge, SPI_NSS_Soft, SPI_BaudRatePrescaler_64
        SPI2->CR2 &= ~(SPI_CR2_FRF | SPI_CR2_SSOE);   //  SPI Motorola mode(TI Mode Diabled),  SS output is disabled in master mode
        SPI2->CRCPR = SPI_CRCPR_CRCPOLYNOMIAL_7;       //   SPI CRC polynomial register:  Reset value: 0x0007
        SPI2->CR1 |= SPI_CR1_SPE;   //  SPI Communication Enable
        GPIOD->ODR ^= 0x1000;
}

 /* Transmit and Receive data in 8 Bit mode */
void SPI2_writ(uint16_t tmp1) {
        uint16_t tmp2;
        if(SPI2->SR & SPI_SR_TXE) {
                SPI2->DR = tmp1;
        }

        if(SPI2->SR & SPI_SR_RXNE) {
                tmp2 = SPI2->DR;
        }
  osDelay(1500);
        GPIOD->ODR ^= 0x1000;
}


Parents Reply Children
No data