SST25VF016读取器件ID程序调试问题求教

2019-10-15 19:20发布

各位大侠,这个应该是很常规的器件了,估计大家都用过,读ID时序如下,其实就是发命令,然后发三个字节的地址00,然后再发一个字节使能时钟,回读SPI数据寄存器就可以了,我现在发送到第5个字节,回读回来的应该是0x41,现在回来的居然是0xBF!更奇葩的是,单步调试的时候会得出正确结果0x41,全速运行后得出的就是0xBF。服了,帮忙分析下,到底问题出哪了,代码如下:
static uint8_t SST25_READ_ID(void)
{
uint8_t RDID;
HAL_GPIO_WritePin(SPI_FLASH_CS_GPIO_Port, SPI_FLASH_CS_Pin, GPIO_PIN_RESET);//片选
SPI2->CR1 = ((SPI2->CR1)|0x40);          //启用SPI2;
SPI2->DR = SST25_RDID;                   //读ID命令,0x90
  while((SPI2->SR&0x02) == RESET){}      //等待发送缓冲区空。
SPI2->DR = 0x00;                         //发送地址第一个字节
   while((SPI2->SR&0x02) == RESET){}    //等待发送缓冲区空
SPI2->DR = 0x00;                         //发送地址第二个字节
    while((SPI2->SR&0x02) == RESET){}  //等待发送缓冲区空
SPI2->DR = 0x00;                         //发送地址第三个字节
    while((SPI2->SR&0x02) == RESET){}  //等待发送缓冲区空
SPI2->DR = 0x00;                         //发送第四个空字节,目的是使能时钟,以回读器件DO引脚的数据
    while((SPI2->SR&0x02) == RESET){}  //等待发送缓冲区空
RDID = SPI2->DR;                         //读SPI输入数据寄存器,回读数值应该为0xBF
     SPI2->DR = 0x00;                 //发送第五个空字节,目的是使能时钟,以回读器件DO引脚的数据
    while((SPI2->SR&0x02) == RESET){}//等待发送缓冲区空
RDID = SPI2->DR;                        //读SPI输入数据寄存器,回读数值应该为0xBF
SPI2->CR1 &= 0xFFBF;                    //关闭SPI2。
HAL_GPIO_WritePin(SPI_FLASH_CS_GPIO_Port, SPI_FLASH_CS_Pin, GPIO_PIN_RESET);//取消片选
return RDID;//返回RDID值
}
捕获.PNG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。