打印
[N32G430]

SPI配置问题

[复制链接]
1084|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
春风知意|  楼主 | 2023-11-23 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照官方例程修改了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_MISO  PA9 AF1  ||SPI_CLK  PA10 AF6 ||SPI_MOSI   PB1 AF2 ||SPI_CS  PA15  ||
    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的配置是

#ifndef  SPI_H_
#define  SPI_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吧

使用特权

评论回复
评论
春风知意 2023-11-23 17:56 回复TA
例程里都是重映射。 
板凳
qintian0303| | 2023-11-24 11:57 | 只看该作者
例程里都是重映射?重映射可就换引脚了,你看一下是多有引脚都没有输出吗?CS呢

使用特权

评论回复
评论
春风知意 2023-11-27 10:22 回复TA
例程里用到是硬件片选具体我发在下面,麻烦您帮我看下是不是我哪里配置出了问题 
地板
春风知意|  楼主 | 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);
}

使用特权

评论回复
5
春风知意|  楼主 | 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);

使用特权

评论回复
6
qintian0303| | 2023-11-27 13:40 | 只看该作者
你能测到CS的波形吗?

使用特权

评论回复
7
qintian0303| | 2023-11-27 13:41 | 只看该作者
CS引脚是你字节控制的,有波形吗?

使用特权

评论回复
8
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的控制啊

使用特权

评论回复
9
春风知意|  楼主 | 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();

使用特权

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

使用特权

评论回复
11
春风知意|  楼主 | 2023-11-28 17:30 | 只看该作者
呐咯密密 发表于 2023-11-28 16:30
我来发言,既然你用的官方例程,一定要关注例程自带的IO口的初始化,PA9和PA10会在例程里被复用为串口。看 ...

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

使用特权

评论回复
12
kzlzqi| | 2024-8-27 17:17 | 只看该作者
注意到GPIO_InitStructure.GPIO_Alternate在每次初始化时都进行了更改。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

41

帖子

0

粉丝