m0_66498354 2022-05-16 18:05 采纳率: 63.6%
浏览 19
已结题

STM32串行通信FLASH获取ID错误

STMF103xvet6串行FLASH实验中,获取FLash的ID错误

int main(void)
{
    uint32_t FLASH_ID;
    
    SPI_Confing();
    USART_Config();
    printf("\r\nSPI写入实验\r\n");
    FLASH_ID=SPI_FLASH_ReadID();
    printf("FLASH_ID=0x%x",FLASH_ID);
    printf("\r\n");
}
u32 SPI_FLASH_ReadID(void)
{
    u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;
    GPIO_ResetBits(GPIOC,GPIO_Pin_0); //打开片选
    SPI_FLASH_SENDByte(W25X_JedecDeviceID);//发送指令代码
    Temp0 = SPI_FLASH_SENDByte(Dummy_Byte);
    printf("%x\r\n",Temp0);
    Temp1 = SPI_FLASH_SENDByte(Dummy_Byte);
    printf("%x\r\n",Temp1);
    Temp2 = SPI_FLASH_SENDByte(Dummy_Byte);//每次返回的值不一样,千万不要把三个写在一起
    printf("%x\r\n",Temp2);
    GPIO_SetBits(GPIOC,GPIO_Pin_0);
    Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2;
    return Temp;
}
uint8_t SPI_FLASH_SENDByte(uint8_t byte)//发送并返回数据
{
    SPITIMEOUT=SPI_FLAG_TIMEOUT;
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET)//检查TX
    {
        if((SPITIMEOUT--)==0)
            return printf("超时1");
    }
    /*写入数据寄存器,把要写入的数据写入发送缓冲区*/
    SPI_I2S_SendData(SPI1, byte);
    SPITIMEOUT=SPI_FLAG_TIMEOUT;
    
    /* 等待接收缓冲区非空,RXNE 事件 */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查是否写入完成
    {
        if ((SPITIMEOUT--) == 0) 
        return     printf("超时2");
    }
    /* 读取数据寄存器,获取接收缓冲区数据 */
    return SPI_I2S_ReceiveData(SPI1);




![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/320363596256188.JPG "#left")

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 5月24日
    • 创建了问题 5月16日

    悬赏问题

    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记