簡體   English   中英

在 SPI STM32 中讀取 Rx 緩沖區的問題

[英]Problem with Reading Rx buffer in SPI STM32

在 STM32 SPI 中讀取 Rx 緩沖區時我有一點問題。 我可以在 scope 中發送或接收信號時觀察我的信號。 但我永遠無法在我的 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);
 }

在此處輸入圖像描述 圖 1. MOSI 引腳寫入信號

在此處輸入圖像描述 圖 2. MISO 引腳中的讀取信號

我認為我的問題是關於使用 SPI 傳輸數據后接收數據的延遲。 但我無法解決這個問題,因為我應該傳輸數據來接收。 有什么解決辦法嗎?

  1. 我不確定這個,但我認為 MISO 也應該配置為備用模式。 至少這對我有用。
  2. 您已經配置了 RXNE 中斷,但也使用 TXE 作為中斷。 使用SPI_I2S_GetFlagStatus而不是SPI_I2S_GetITStatus
  3. while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_FLAG_TXE)==SET); 是一個錯誤。 STM32F103 參考手冊,第 710 頁:

    當數據從 Tx 緩沖區傳輸到移位寄存器時,TXE 標志(Tx 緩沖區為空)置位。 它表示內部 Tx 緩沖區已准備好加載下一個數據。

    所以應該是while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);

  4. 使用 RXNE 中斷,您還將在發送第一個字節(寄存器地址)后發送到 USART

    是用於類似傳輸的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 插入了哪個連接器? 我花了一周時間,因為我已將其插入 Arduino 連接器,該連接器連接到其他外圍設備而不是 Morpho 連接器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM