春风知意 发表于 2023-11-23 14:54

SPI配置问题

我按照官方例程修改了ping脚和软件片选,调试过程测认为应该是SPI都没初始化成功,麻烦各位帮忙看下是哪部分造成SPI初始化没成功,判断没初始化成功是因为我再main里一直调发送接口,但是实测没有波形下面是spi.c的配置
#include "./flash/spi.h"

void spi_gpio_init(void)
{
    GPIO_InitType GPIO_InitStructure;

    RCC_Pclk2_Config(RCC_HCLK_DIV2);

    RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA|RCC_AHB_PERIPH_GPIOB);
    //RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
    GPIO_Structure_Initialize(&GPIO_InitStructure);

    // SPI_MISOPA9 AF1||SPI_CLKPA10 AF6 ||SPI_MOSI   PB1 AF2 ||SPI_CSPA15||
    GPIO_InitStructure.Pin            = SPI_MISO;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF1_SPI2;
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);


    GPIO_InitStructure.Pin            = SPI_MOSI;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF2_SPI2;
    GPIO_Peripheral_Initialize(GPIOB, &GPIO_InitStructure);

    /* If CLKPOL is HIGH, set SPI_SCK GPIO to GPIO_PULL_UP, otherwise set to GPIO_PULL_DOWN */
    GPIO_InitStructure.Pin            = SPI_CLK;   
    GPIO_InitStructure.GPIO_Pull      = GPIO_PULL_DOWN;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF6_SPI2;
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);

    GPIO_Structure_Initialize(&GPIO_InitStructure);

    GPIO_InitStructure.Pin          = SPI_CS;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT_PP;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);

}


void spi_init(void)
{
    SPI_InitType SPI_InitStructure;

    RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_SPI2);

    spi_gpio_init();

    SPI_Initializes_Structure(&SPI_InitStructure);
    SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX | SPI_DIR_SINGLELINE_RX;
    SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
    SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
    SPI_InitStructure.CLKPOL      = SPI_CLKPOL_LOW;
    SPI_InitStructure.CLKPHA      = SPI_CLKPHA_FIRST_EDGE;
    SPI_InitStructure.NSS         = SPI_NSS_SOFT;
    /* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
    SPI_InitStructure.BaudRatePres= SPI_BR_PRESCALER_8;
    SPI_InitStructure.FirstBit      = SPI_FB_MSB;
    SPI_InitStructure.CRCPoly       = 7;
    SPI_Initializes(SPI2, &SPI_InitStructure);
    SPI_SS_Output_Enable(SPI2);
    /* Enable SPI_MASTER */
    SPI_ON(SPI2);

    SPI_CS_HIGH();
}


uint8_t spi_transmit(uint8_t data)
{
   uint8_t brxbuff;

   SPI_I2S_Data_Transmit(SPI2, data);
   while(SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_TE) == RESET);
   brxbuff = SPI_I2S_Data_Get(SPI2);
   while(SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_BUSY) != RESET) ;
   return brxbuff;
}
spi.h的配置是

#ifndefSPI_H_
#defineSPI_H_
#include "n32g430.h"
#define SPI_CS_HIGH()   GPIO_Pins_Set(GPIOA,GPIO_PIN_15);
#define SPI_CS_LOW()    GPIO_Pins_Reset(GPIOA,GPIO_PIN_15);
//PA
#define SPI_MISO    GPIO_PIN_9
#define SPI_CLK   GPIO_PIN_10
#define SPI_CS      GPIO_PIN_15
//PB
#define SPI_MOSI    GPIO_PIN_1

void spi_init(void);
uint8_t spi_transmit(uint8_t data);
#endif // ! SPI_H_




技术工程师 发表于 2023-11-23 17:16

SPI_MISO应该配置成input吧

qintian0303 发表于 2023-11-24 11:57

例程里都是重映射?重映射可就换引脚了,你看一下是多有引脚都没有输出吗?CS呢

春风知意 发表于 2023-11-27 10:23

例程中的配置是这样的
void GPIO_Configuration(void)
{                              
    GPIO_InitType GPIO_InitStructure;

    GPIO_Structure_Initialize(&GPIO_InitStructure);
    /* Configure slave pins: NSS, SCK, MISO and MOSI */
    /* Confugure SPI pins as Input Floating */
    GPIO_InitStructure.Pin            = SPI_SLAVE_CLK_PIN | SPI_SLAVE_MISO_PIN | SPI_SLAVE_NSS_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = SPI_SLAVE_GPIO_ALTERNATE;
    GPIO_Peripheral_Initialize(SPI_SLAVE_GPIO, &GPIO_InitStructure);
   
    /* Configure master pins: NSS, SCK, MISO and MOSI */
    /* Confugure SPI pins as Alternate Function Push Pull */
    GPIO_InitStructure.Pin            = SPI_MASTER_MOSI_PIN | SPI_MASTER_CLK_PIN | SPI_MASTER_NSS_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
    GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_ALTERNATE;
    GPIO_Peripheral_Initialize(SPI_MASTER_GPIO, &GPIO_InitStructure);
    /* If CLKPOL is HIGH, set SPI_SCK GPIO to GPIO_PULL_UP, otherwise set to GPIO_PULL_DOWN */
    GPIO_InitStructure.Pin            = SPI_MASTER_CLK_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
    GPIO_InitStructure.GPIO_Pull      = GPIO_PULL_DOWN;
    GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_ALTERNATE;
    GPIO_Peripheral_Initialize(SPI_MASTER_GPIO, &GPIO_InitStructure);
}

春风知意 发表于 2023-11-27 10:23

/* SPI_MASTER configuration ------------------------------------------------------*/
    SPI_Initializes_Structure(&SPI_InitStructure);
    SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX;
    SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
    SPI_InitStructure.DataLen       = SPI_DATA_SIZE_16BITS;
    SPI_InitStructure.CLKPOL      = SPI_CLKPOL_LOW;
    SPI_InitStructure.CLKPHA      = SPI_CLKPHA_SECOND_EDGE;
    SPI_InitStructure.NSS         = SPI_NSS_HARD;
    /* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
    SPI_InitStructure.BaudRatePres= SPI_BR_PRESCALER_8;
    SPI_InitStructure.FirstBit      = SPI_FB_MSB;
    SPI_InitStructure.CRCPoly       = 7;
    SPI_Initializes(SPI_MASTER, &SPI_InitStructure);
    SPI_SS_Output_Enable(SPI_MASTER);

    /* SPI_SLAVE configuration ------------------------------------------------------*/
    SPI_InitStructure.SpiMode = SPI_MODE_SLAVE;
    SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX;
    SPI_Initializes(SPI_SLAVE, &SPI_InitStructure);

    /* Enable the master and slave SPI interrupts ----------------------------------*/
    SPI_I2S_Interrupts_Enable(SPI_MASTER, SPI_I2S_INT_TE);
    SPI_I2S_Interrupts_Enable(SPI_SLAVE, SPI_I2S_INT_RNE);

    /* Enable SPI_SLAVE */
    SPI_ON(SPI_SLAVE);      
    /* Enable SPI_MASTER */
    SPI_ON(SPI_MASTER);

qintian0303 发表于 2023-11-27 13:40

你能测到CS的波形吗?

qintian0303 发表于 2023-11-27 13:41

CS引脚是你字节控制的,有波形吗?

qintian0303 发表于 2023-11-27 13:45

uint8_t spi_transmit(uint8_t data)
{
   uint8_t brxbuff;

   SPI_I2S_Data_Transmit(SPI2, data);
   while(SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_TE) == RESET);
   brxbuff = SPI_I2S_Data_Get(SPI2);
   while(SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_BUSY) != RESET) ;
   return brxbuff;
}
你软件控制,首先拉低片选然后再发送啊,你这个发送里面也没有片选NSS的控制啊

春风知意 发表于 2023-11-27 13:52

qintian0303 发表于 2023-11-27 13:45
uint8_t spi_transmit(uint8_t data)
{
   uint8_t brxbuff;


这部分我在main里做的,大致是这样的
spi_cs_low();
spi_transmit(data);
spi_cs_high();

呐咯密密 发表于 2023-11-28 16:30

我来发言,既然你用的官方例程,一定要关注例程自带的IO口的初始化,PA9和PA10会在例程里被复用为串口。看看你的工程的文件夹:BSP下面有一个log.c,这里面会把PA9 PA10复用为串口,而初始化LOG在例程中是在你的SPI GPIO初始化后面。你的GPIO没生效。还有SPI这种发送接收的判断可能会卡在判断标志位的地方,注意debug查看

春风知意 发表于 2023-11-28 17:30

呐咯密密 发表于 2023-11-28 16:30
我来发言,既然你用的官方例程,一定要关注例程自带的IO口的初始化,PA9和PA10会在例程里被复用为串口。看 ...

您好是这样的,我把串口修改到三打印了,所以应该不会造成重复修改,判断标志位的话是能过的,前面我找到DAT寄存器,发现里面数值一直是0,我想会不会是跟这个有关系?

kzlzqi 发表于 2024-8-27 17:17

注意到GPIO_InitStructure.GPIO_Alternate在每次初始化时都进行了更改。
页: [1]
查看完整版本: SPI配置问题