请教下我把 qspi的程序移植到另外的一个板子上死活都不行

2019-12-30 19:23发布

本帖最后由 hpdell 于 2017-3-12 12:33 编辑


请教下,我把 qspi 的程序移植到另外的一个板子上,死活都不行,

qspi 的时钟等也都开启了,管脚也都配置了(移植前与移植后的管脚功能分配是一样的),管脚时钟也都开了,

移植后的程序可以读出 芯片 ID,但是不能够读写,

移植前与移植后的程序都是一样,所以现在迷茫了,

现在也找不出问题出在哪里了,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
wye11083
1楼-- · 2019-12-30 20:34
 精彩回答 2  元偷偷看……
hpdell
2楼-- · 2019-12-31 00:46
wye11083 发表于 2017-3-12 12:40
你确定硬件是支持的?qspi还要先写status reg 2,再发一条进入指令才行,你看rs2是不是0,0的话芯片没配好 ...

你好,硬件确定支持的,

芯片使用的 W25Q256A 这个 qspi的芯片,而且管脚也是参照之前的那个板子分配的,

读写程序也是 之前的那套程序

QSPI_StaticTypeDef QSPI_Quad_Enter(void)
{
  uint8_t _RegVal = 0;
  __IO uint32_t cnt = 0;  
  
  QSPI_Read_SR(QSPI_READ_STATUS_REG2_CMD, &_RegVal);   //先读出状态寄存器2的原始值
  if((_RegVal & 0x02) == 0)                            //QE位未使能
  {
    if (QSPI_WriteEnable(&QSPIHandle) != QSPI_OK)
    {
      return QSPI_ERROR;
    }  
    _RegVal |= 1 << 1;                                      //使能QE位
    QSPI_Write_SR(QSPI_WRITE_STATUS_REG2_CMD, _RegVal);    //写状态寄存器2
  }

  _RegVal = 0;  // 这个值无意义,只是配合下面的 发送 QSPI 指令 函数而已
  
  if(QSPI_SendCmdData(  QSPI_ENTER_QPI_MODE,      // 进入QSPI模式
                       QSPI_INSTRUCTION_1_LINE,
                       QSPI_ADDRESS_NONE,
                       QSPI_ADDRESS_8_BITS,
                       QSPI_DATA_NONE,
                       0,
                       0,
                       0,
                       &_RegVal,
                       QSPI_SEND_CMD
                  ) != QSPI_OK )
  {
    return QSPI_ERROR;
  }

  return QSPI_OK;  
}
wye11083
3楼-- · 2019-12-31 01:28
你查一下,在没进入QSPI模式时要用标准SPI模式去读写SR2,而且切记:写SR2之后务必等待芯片写入完成!否则不响应你的命令。写SR2一般要1ms以内。
hpdell
4楼-- · 2019-12-31 02:16
本帖最后由 hpdell 于 2017-3-12 19:32 编辑
wye11083 发表于 2017-3-12 13:17
你查一下,在没进入QSPI模式时要用标准SPI模式去读写SR2,而且切记:写SR2之后务必等待芯片写入完成!否则 ...


你好,终于找到问题所在了啊,

原来这个 stm32f7xx的单片机,里面有个 mpu 的设置,

吧读写 NAND flash 的区域取消就可以了,他奶奶的,折腾了好几天了啊

static void MPU_Set_Protection(uint32_t baseaddr,
                               uint32_t size,
                               uint32_t rnum,
                               uint32_t ap,
                               u8 sen,
                               u8 cen,
                               u8 ben)
{
        MPU_Region_InitTypeDef MPU_Initure;
       
        HAL_MPU_Disable();                                                                                      //配置MPU之前先关闭MPU,配置完成以后在使能MPU

        MPU_Initure.Enable           = MPU_REGION_ENABLE;                                  //使能该保护区域
        MPU_Initure.Number           = rnum;                                              //设置保护区域
        MPU_Initure.BaseAddress      = baseaddr;                              //设置基址
        MPU_Initure.Size             = size;                                                    //设置保护区域大小
        MPU_Initure.SubRegionDisable = 0x00;                            //禁止子区域
        MPU_Initure.TypeExtField     = MPU_TEX_LEVEL0;                  //设置类型扩展域为level0
        MPU_Initure.AccessPermission = (uint8_t)ap;                                  //设置访问权限,
        MPU_Initure.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;          //允许指令访问(允许读取指令)
        MPU_Initure.IsShareable      = sen;                            //是否允许共用
        MPU_Initure.IsCacheable      = cen;                            //是否允许cache
        MPU_Initure.IsBufferable     = ben;                             //是否允许缓冲
        HAL_MPU_ConfigRegion(&MPU_Initure);                           //配置MPU
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);                                          //开启MPU
   
}


//  下面的这个设置取消就 ,从此世界清静了,
        MPU_Set_Protection(0x80000000,
                     MPU_REGION_SIZE_2GB,     // 吧这个地方改成 256MByte 就可以了,或者取消不用也行
                     MPU_REGION_NUMBER3,
                     MPU_REGION_FULL_ACCESS,
                     MPU_ACCESS_NOT_SHAREABLE,
                     MPU_ACCESS_CACHEABLE,
                     MPU_ACCESS_BUFFERABLE);          //保护整个NAND FLASH区域,共2048M字节







一周热门 更多>