打印

stm32f4 SPI下读FLASH ID出错

[复制链接]
6515|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
304301959|  楼主 | 2013-3-14 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这些是SPI3模式下的初始化代码:
/************************************************
                                        函数功能:SPI端口初始化(内部调用)
                                        参数:无
                                        返回:无
                                        备注:SPI3_SCK->PC10      复用功能、推挽带下拉、50M响应速度
                                                SPI3_MISO->PC11        同上
                                                SPI3_MOSI->PC12        同上
                                                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

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









沙发
cjhk| | 2013-3-14 20:59 | 只看该作者
帮你顶一个   这个没有玩过  呵呵   真的感觉自己的水平好菜   还要努力

使用特权

评论回复
板凳
B09011506| | 2014-10-9 10:38 | 只看该作者
是不是因为CS管脚没拉低的原因

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝