stm32f4 SPI读ID出错

2019-07-20 09:54发布

这些是SPI3模式下的初始化代码:
/************************************************ 函数功能:SPI端口初始化(内部调用) 参数:无 返回:无 备注:SPI3_SCK->C10      复用功能、推挽带下拉、50M响应速度 SPI3_MISO->C11  同上 SPI3_MOSI->C12 同上 SPI_CS->   PC9 推挽普通输出,不带,50M *************************************************/ static void SPI_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //开时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC ,ENABLE); //配置恢复缺省 GPIO_StructInit(&GPIO_InitStructure); /******配置SPI三个控制端*********/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); //端口映射 GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);   GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);   GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3); /******配置使能端***************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT ; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); } /************************************************ 函数功能:模式初始化(内部调用) 参数:无 返回:无 备注:无 *************************************************/ static void SPI_Mode_Configuration(void) { SPI_InitTypeDef  SPI_InitStructure; //开时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); // SPI_I2S_DeInit(SPI3); //全双工 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //8位数据模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //空闲模式下SCK为0 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //数据采样从第1个时间边沿开始 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //NSS软件管理 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //波特率 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                      //大端模式 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //CRC多项式 SPI_InitStructure.SPI_CRCPolynomial = 7; //主机模式 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI3, &SPI_InitStructure); //使能 SPI_Cmd(SPI3, ENABLE); } /************************************************ 函数功能:SPI初始化(外部调用) 参数:无 返回:无 备注:无 *************************************************/ void SPI_InitSet(void) { SPI_GPIO_Configuration(); SPI_Mode_Configuration(); } /************************************************ 函数功能:向SPI设备写入一字节(内部调用) 参数:byte->一字节参数 返回:Temp->返回的一字节 备注:无 *************************************************/ static uint8_t SPI_Flash_SendByte(uint8_t byte) { //等待发送寄存器清空 while( SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET); //发送一字节数据 SPI_I2S_SendData(SPI3,byte); //等待返回数据 while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET); //返回数据 return (uint8_t)SPI_I2S_ReceiveData(SPI3); }

使用的芯片是N25Q128
根据其描述:





其相应的代码应该如下:
/************************************************ 函数功能:读N25Q的器件ID(外部调用) 参数:无 返回:Temp->ID 备注:读ID有以下几点信息: 1、制造商ID,由JEDEC规定为->0x20 2、器件ID包含两部分:内存型号->0xba 内存容量->0x18   3、器件唯一ID包含只读的17字节: 数据长度->0x10 两字节的扩展ID 剩下的14字节全为0x00 4、读ID时序:先拉低CS,接着8位指令 *************************************************/ uint32_t SPI_Flash_ReadDeviceID(void) { uint32_t Temp; //拉低CS,使能N25Q N25Q_ENABLE; //发送读ID指令 Temp=SPI_Flash_SendByte(N25Q_ReadID); Temp<<=8; Temp|=SPI_Flash_SendByte(0xff); Temp<<=8; Temp|=SPI_Flash_SendByte(0xff); // SPI_I2S_SendData(SPI3,N25Q_ReadID); //返回数据 // Temp=SPI_I2S_ReceiveData(SPI3); // Temp<<=8; // //返回数据 // Temp|=SPI_I2S_ReceiveData(SPI3); // Temp<<=8; // //返回数据 // Temp|=(uint8_t)SPI_I2S_ReceiveData(SPI3); //拉高CS,失能N25Q N25Q_DISABLE; //返回ID return Temp; }

但是目前读出的ID都是:0x00ffffff

请大家帮我分析一下原因,谢谢!







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。