Associate II
February 10, 2021
Question
How to set up SPI? STM32h743ZI
- February 10, 2021
- 6 replies
- 2002 views
I'm still beginner to programming STM32. I haven't been able to configure SPI for two weeks and don't understand what I am doing wrong. I dug up all the forums looking for an answer, but nothing helped to solve my problem. I checked the MOSI and SCK pin with an oscilloscope and there are no signals on these pins. I tried different ways to configure SPI but still nothing helped. Tried configuring for SPI1, SPI2, SPI3, SPI4, SPI5 etc, same problem. Everything works in HAL, but I want to understand what I am doing wrong using CMSIS. Please give me at least a little hint what I'm setting up wrong. I'm using STM32H743ZI debug board. I really hope for your help, thank you.
#include "main.h"
#define cs_set() GPIOC->BSRR |= GPIO_BSRR_BR11;
#define cs_reset() GPIOC->BSRR |= GPIO_BSRR_BS11;
void SPIinit (void);
void Settings7219 (void);
void SPITransmit (uint8_t adress, uint8_t data);
int main (void) {
SPIinit();
Settings7219();
GPIOB->BSRR |= GPIO_BSRR_BS0;
while(1){
}
}
void SPITransmit (uint8_t adress, uint8_t data)
{
SPI3->CR1 |= SPI_CR1_CSTART;
uint8_t tx_buffer[1] = {0};
while (!(SPI3->SR & SPI_SR_TXP));
cs_set(); // SS enable
tx_buffer[0] = adress;
SPI3->TXDR = tx_buffer[0];
tx_buffer[0] = data;
SPI3->TXDR = tx_buffer[0];
cs_reset(); // SS disable
SPI3->CR1 &= ~SPI_CR1_CSTART;
}
void Settings7219 (void)
{
SPITransmit(0x09, 0x00); // no decoding
SPITransmit(0x0a, 0x01); // brightness
SPITransmit(0x0b, 0x07); // scan limit = 8 LEDs
SPITransmit(0x0c, 0x01); // power down =0,normal mode = 1
SPITransmit(0x0f, 0x01); // no display test
}
/*__________________________SPI_Conf____________________*/
void SPIinit (void){
/*_______________________RCC_________________________*/
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOCEN;
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOBEN;
RCC->APB1LENR |= RCC_APB1LENR_SPI3EN;
/*_______________________SET_MODE_____________________*/
GPIOC->MODER &= ~GPIO_MODER_MODE12;
GPIOC->MODER &= ~GPIO_MODER_MODE11;
GPIOC->MODER &= ~GPIO_MODER_MODE10;
GPIOC->MODER |= GPIO_MODER_MODE12_1 | GPIO_MODER_MODE11_0 | GPIO_MODER_MODE10_1;
GPIOB->MODER &= ~GPIO_MODER_MODE0;
GPIOB->MODER |= GPIO_MODER_MODE0_0;
/*_____________________SET_AF_________________________*/
GPIOC->AFR[1] |= GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL10_2; // MOSI AF6
GPIOC->AFR[1] |= GPIO_AFRH_AFSEL12_1 | GPIO_AFRH_AFSEL12_2; // SCK AF6
/*_____________________SET_SPI________________________*/
SPI3->CFG1 |= SPI_CFG1_MBR_1;
//SPI3->CFG1 |= SPI_CFG1_CRCEN;
//SPI3->CFG1 |= SPI_CFG1_FTHLV_0;
SPI3->CFG2 |= SPI_CFG2_MASTER;
SPI3->CFG2 |= SPI_CFG2_COMM_0;
SPI3->CFG2 |= SPI_CFG2_CPOL;
//SPI3->CFG2 |= SPI_CFG2_SSOE;
//SPI3->CFG2 |= SPI_CFG2_SSM;
//SPI3->CFG2 |= SPI_CFG2_SSOM;
//SPI3->CR2 |= SPI_CR2_TSIZE;
//SPI3->CR2 |= SPI_CR2_TSER;
//SPI3->IER |= SPI_IER_TXPIE;
//SPI3->CR1 |= SPI_CR1_SSI;
//SPI3->IER |= SPI_IER_TXTFIE;
SPI3->CR1 |= SPI_CR1_SPE;
NVIC_EnableIRQ(SPI3_IRQn);
}