搜索
bottom↓
回复: 4

STM32硬件SPI读写SST25VF016B读到的数据全是FF?

[复制链接]

出0入0汤圆

发表于 2014-1-13 11:30:12 | 显示全部楼层 |阅读模式
求大神指点,一下是相关的程序代码,读ID读到的全是0xFFFFFF,读其他的内存地址也是ff,不只是哪里出了故障,还请大神们帮助分析分析:
#define CE_Low()                GPIO_ResetBits(GPIOC,GPIO_Pin_12);      //PB12/SPI2NSS 选中片选使能
#define CE_High()                GPIO_SetBits(GPIOC,GPIO_Pin_12);         //PB12/SPI2NSS 片选失能
#define ENABLE_WP()        GPIO_ResetBits(GPIOC,GPIO_Pin_11);   //  PB11/WP 低电平写保护
#define DISABLE_WP()       GPIO_SetBits(GPIOC,GPIO_Pin_11);                 //  PB11/WP 低电平写保护

/*
****************************************************************************
*函数名称:void  SPIInit(void)
*函数功能:初始化SPI
*入口参数:
*出口参数:无
*日期:2013 12 10
*版本:V1.0
*作者:yrj
****************************************************************************
*/
//PB11/WP  PB12/SPI2NSS  PB13/SPI2CLK  PB14/SPI2MISO  PB15/SPI2MOSI
void  SPIInit(void)
{  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
  GPIO_InitTypeDef GPIO_InitStructure;
  //PB14 (MISO)浮空输入
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  //PB15 MOSI PB13 SCK 复用推挽输出(外设总线用)
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  //PB12 NSS,PB11 WP写保护普通推挽输出  本实验用软件控制NSS(主从设备的选择控制端)
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);

  CE_High();//失能

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//SPI1与SPI2的时钟频率源不同
  SPI_InitTypeDef SPI_InitStructure;
  SPI_I2S_DeInit(SPI2);
  SPI_Cmd(SPI2,DISABLE);//在改变CPOL/CPHA位之前必须清除SPE位将SPI禁止
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主模式
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//时钟悬空低
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获与第1个时钟沿
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//软件控制NSS信号
  SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//比特率预分频值为8。最大18MHz
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前
  SPI_InitStructure.SPI_CRCPolynomial = 7;//定义用于CRC值计算的多项式 7
  SPI_Init(SPI2, &SPI_InitStructure);
  SPI_Cmd(SPI2,ENABLE);
     
////////////// SST 写保护初始化                       
//// [WP=0;BPL=1 NOT Allowed] ;[WP=0;BPL=0 Allowed];[WP=1;BPL=x Allowed]  
//// 进入保护状态 begin
        CE_Low();                       
        Send_Byte(0x06);        // 写使能
        CE_High();
        //////
        CE_Low();                       
        Send_Byte(0x50);        // 使能写状态寄存器
        CE_High();       
        ///////
        DISABLE_WP() ;    //  拉高 低电平写保护
        CE_Low();                       
        Send_Byte(0x01);  // 写状态寄存器
        Send_Byte(0x9C);  //写状态寄存器使芯片全区保护状态寄存器:BPL AAI BP3 BP2 BP1 BP0 WEL BUSY
        CE_High();                       
        ENABLE_WP() ;     //  置低 低电平写保护
//// 进入保护状态  end
}
////SPI读写数据函数
uint8 spi_write(uint8 data)
{
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  SPI_I2S_SendData(SPI2, data);//发送数据
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET); //等待数据发送完毕
        return SPI_I2S_ReceiveData(SPI2);
}

/************************************************************************
** 函数名称:SSTF016B_RdID                                                                                                                                                                                                               
** 函数功能:SST25VF016B的读ID函数,可选择读ID和读数据操作                               
Jedec_ID:BFH 25H 41H  十进制为:12526913
************************************************************************/
uint8 SSTF016B_RdID(idtype IDType, uint32* RcvbufPt)
{
        uint32 temp=0;
        uint32 t[3]={0};  //测试用,用后即删
        if (IDType == Jedec_ID)
        {
                CE_Low();                       
                spi_write(0x9F);                                  // 发送读JEDEC ID命令(9Fh),
    temp = (temp | spi_write(0x00)) << 8;// 接收数据 字节1制造商ID BF
    t[0]=temp;  //测试用,返回第一字节
                temp = (temp | spi_write(0x00)) << 8;// 接收数据 16位器件ID 字节2 25 字节3 41
    t[1]=temp; //测试用,返回第2字节
                temp = (temp | spi_write(0x00));        
    t[2]=temp; //测试用,返回第3字节
    // 在本例中,temp的值应为0xBF2541  十进制:12526913
                CE_High();                       
                *RcvbufPt = temp;
                return (OK);
        }
}

void main(void)
{
    SPIInit();       //SST的SPI总线初始化
    SysDOInit();    //测试任务切换用 开关量输出管脚初始化
    uint32 Rcvbuf[2]={0x00}; //测试读芯片ID用   
    while(1)
    {
      CtrlDOData(0x08);   //用于指示任务是否运行的LED
      SSTF016B_RdID(Jedec_ID, Rcvbuf); //读取芯片ID
     }         
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-1-13 15:55:08 | 显示全部楼层
会不会是我的芯片挂掉了呢?

出0入0汤圆

发表于 2019-1-19 14:22:02 | 显示全部楼层
用逻辑分析仪采一下

出0入0汤圆

发表于 2019-1-19 17:51:32 | 显示全部楼层
建议先用烧录器读写,没问题了再调试代码

出0入362汤圆

发表于 2019-1-19 19:06:21 来自手机 | 显示全部楼层
sst25vf我用过,读写命令和w25/gd25之类稍微有点不一样,仔细看看datasheet吧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-24 20:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表