SPI STM32中具有读取Rx缓冲区的问题

问题描述 投票:2回答:1

我在STM32 SPI中读取Rx缓冲区时没有什么问题。在我的示波器中发送或接收信号时,我可以观看信号。但是我永远无法在我的接收缓冲区中获得任何数据。我只是为此项目使用coocox软件。

对于该项目,我使用STM32F103和LoRa模块(SX1278)。我将全双工通信用于SPI配置。 LoRa模块中有2个周期读取寄存器状态。第一个周期是写地址,第二个周期是读/写寄存器。我的问题是在LoRa模块中读取寄存器。

这是我读取寄存器的简单代码。

  void SPI2_IRQHandler(void)
  {
       RxSPIBuff = &Buffer_Rx[0];
       if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)
       {
          /* Store the I2S2 received data in the relative data table */
          //Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI2);
         //if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_FLAG_RXNE)==SET)
            USART_SendData(USART1, SPI_I2S_ReceiveData(SPI2));
       }
  }

 void InitSPI_Lora(void)
 {
SPI_InitTypeDef SPI_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

// RCC Peripheral Configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

// GPIO Configuration
GPIO_InitStructure.GPIO_Pin = MOSI_LoRa | SCLK_LoRa;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_LoRa, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = NSS_LoRa;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PeriphNSS_LoRa, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = MISO_LoRa;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_LoRa, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Reset_LoRa;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PeriphRst_LoRa, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = DIO0_LoRa;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PeriphDI0_LoRa, &GPIO_InitStructure);

// SPI Configuration
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32; // 7us every 8 bit data
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;

// NVIC Configuration
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* SPI1 IRQ Channel configuration */
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

SPI_I2S_DeInit(SPI2);

/* Enable the I2S1 RxNE interrupt */
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);

SPI_Init(SPI2, &SPI_InitStruct);
SPI_Cmd(SPI2, ENABLE);
 }

 void SendSPI_Lora(unsigned short val, unsigned char status)
 {
SPI_I2S_SendData(SPI2, val);
while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_FLAG_TXE)==SET);
SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_TXE);
 }


 void AccessSPI(unsigned char Cmd, unsigned short *ptrBuff, unsigned char    Operation)
 {
unsigned short m, temp;

NSS_LO_LoRa;
SendSPI_Lora(Cmd, kWriteSPI);       // Send Command
if (Operation==kWriteSPI)
{
    temp=*ptrBuff;
    SendSPI_Lora(temp, Operation);
}
else
{
    RxIdx=0;
    SendSPI_Lora(0, Operation);
    ptrBuff = RxSPIBuff;
}
Delay(2);
NSS_HI_LoRa;
 }

 // Main Sequence
 void test(void)
 {
unsigned char statusLoRa,buff,irqFlags,newData,newOpMode;
unsigned char size = 0;

AccessSPI(R_REGISTER|RegVersion, &newOpMode, kReadSPI);
 }

enter image description here图1.在MOSI引脚中写入信号

enter image description here图2. MISO引脚中的读取信号

我认为我的问题是关于通过SPI传输数据后接收数据的延迟。但是我无法解决此问题,因为我应该传输数据以接收。有什么解决办法吗?

c stm32 spi coocox
1个回答
0
投票
  1. 我不确定这一点,但我认为MISO也应配置为备用模式。至少那对我有用。
  2. 您已经配置了RXNE中断,但也将TXE用作中断。使用SPI_I2S_GetFlagStatus代替SPI_I2S_GetITStatus
  3. while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_FLAG_TXE)==SET);是错误。 Reference manual for STM32F103,第710页:

    当数据从Tx缓冲区传输到移位寄存器时,TXE标志(Tx缓冲区为空)置位。它指示内部Tx缓冲区已准备好与下一个数据一起加载。

    所以应该是while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);

  4. 随着RXNE中断,您还将在发送第一个字节(寄存器addess)后发送到USART。>

    [Here是用于类似传输的CMSIS代码(“第一个周期用于写地址,第二个周期用于读/写寄存器。”,但不使用中断,并且将STM32F4与SPI配置如下:

    //af5, afrl
    GPIOB->AFR[0] |= ( GPIO_AFRL_AFSEL3_2 | GPIO_AFRL_AFSEL3_0 |
                       GPIO_AFRL_AFSEL5_2 | GPIO_AFRL_AFSEL5_0 );
    GPIOA->AFR[0] |= ( GPIO_AFRL_AFSEL6_2 | GPIO_AFRL_AFSEL6_0 );
    //B3 SCK
    //A6 MISO
    //B5 MOSI
    //B6 SS
    GPIOA->MODER |= ( GPIO_MODER_MODE6_1 );
    GPIOB->MODER |= ( GPIO_MODER_MODE3_1 |
                      GPIO_MODER_MODE5_1 |
                      GPIO_MODER_MODE6_0 ); //alternate, 6 output
    
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD6_Msk ); // no pull
    GPIOB->PUPDR |= GPIO_PUPDR_PUPD3_1;
    
  5. 您正在使用纳米板吗?如果是,您将MISO插入哪个连接器?我花了一周的时间,因为我将它插入了连接到其他外围设备而不是Morpho连接器的Arduino连接器。

© www.soinside.com 2019 - 2024. All rights reserved.