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_
SPI_MISO应该配置成input吧 例程里都是重映射?重映射可就换引脚了,你看一下是多有引脚都没有输出吗?CS呢 例程中的配置是这样的
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);
} /* 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); 你能测到CS的波形吗? CS引脚是你字节控制的,有波形吗? 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的控制啊
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(); 我来发言,既然你用的官方例程,一定要关注例程自带的IO口的初始化,PA9和PA10会在例程里被复用为串口。看看你的工程的文件夹:BSP下面有一个log.c,这里面会把PA9 PA10复用为串口,而初始化LOG在例程中是在你的SPI GPIO初始化后面。你的GPIO没生效。还有SPI这种发送接收的判断可能会卡在判断标志位的地方,注意debug查看 呐咯密密 发表于 2023-11-28 16:30
我来发言,既然你用的官方例程,一定要关注例程自带的IO口的初始化,PA9和PA10会在例程里被复用为串口。看 ...
您好是这样的,我把串口修改到三打印了,所以应该不会造成重复修改,判断标志位的话是能过的,前面我找到DAT寄存器,发现里面数值一直是0,我想会不会是跟这个有关系? 注意到GPIO_InitStructure.GPIO_Alternate在每次初始化时都进行了更改。
页:
[1]