各位大侠,这个应该是很常规的器件了,估计大家都用过,读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值
}
一周热门 更多>