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; }
So what checking / investigation / testing / debugging have you done to find where you did the mistake?
www.avrfreaks.net/.../2418156