采用stm8s的spi发送中断里接收数据,数据接收不对,求原因

2019-03-23 18:53发布

在用stm8s的spi发送中断方式来与flash存储器配合读写数据,在接收数据时,第一个接收到的字节总是莫名为0xff?有时候还会漏收字节?请大家指正是哪里有问题? spi的发送中断里,完成发送和接收数据的处理: @far @interrupt void SPI_IRQHandler(void)
{    
    if (SPI->SR & SPI_FLAG_RXNE)   {
      if(SPI_pointer_Tx > SPI_Order_Len)
     {
       tempbuffer_rx[SPI_pointer_Rx++] = (u8)SPI->DR;
       //while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET); 
     }
  }
    if (SPI->SR & SPI_FLAG_TXE)
  {
     if (SPI_pointer_Tx < SPI_TDLen)
     {
            SPI->DR = tempbuffer[SPI_pointer_Tx++];
           if(SPI_pointer_Tx==SPI_TDLen)
           {
              GPIO_WriteHigh(GPIOG, GPIO_PIN_0);//置高CS           }     
        }
    else
    {            SPI_ITConfig(SPI_IT_TXE, DISABLE);//缓冲区数据发送完成后,关闭中断,再次发送时打开      
     }
  } 
}   其中这句if (SPI->SR & SPI_FLAG_RXNE) 有的话,就会出现漏收,如果去掉的话就会漏收的字节出现了,但是会重复收到2次。     初始化程序如下:   void SPI_Initial(void)
{     
  
  /*push pull output for CLK, MOSI, pull up input for MISO */
 GPIO_Init  (GPIOC, GPIO_PIN_6 | GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_SLOW);   
 GPIO_Init  (GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_IT );//FL不进SPI中断
 GPIO_Init  (GPIOG, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_SLOW );
 GPIO_Init  (GPIOG, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_SLOW );
  /* SPI config */
  SPI_DeInit();
 /* Initialize SPI in Slave mode  */
  SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_16, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_HIGH,SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,(u8)0);//为1edge,flash不回。  SPI_Cmd(ENABLE);   
  
} 应用时: 比如我向flash里写如16个数据: 0x05 0x06 0x07 0x08 ........0x14 0x015 但是读回来的数据就是: 0xff 0x06 0x07 0x07b 0x08 x09 .................0x12 0x13  从读回来的数据里就可以看出,第一个字节多了一个0xff,但是却没有读到0x05,然后0x07读了2遍(if (SPI->SR & SPI_FLAG_RXNE) 有的话)。   其他命令时SPI也是表现多一个0xff,没分析出来是怎么回事?   看到spi的数据寄存器只有一个SPI_DR,是不是这个原因导致收的不及时?另外在通信时,我一直在用示波器监测数据,从示波器波形看,flash回的数据的波形正确,时序也是对的,看来就是芯片在接收时出现的问题,请大家帮助分析分析,到底是怎么回事? 挺着急的,肯请大家来分析!!指正!!!       此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。