请教下我把 qspi的程序移植到另外的一个板子上死活都不行
本帖最后由 hpdell 于 2017-3-12 12:33 编辑请教下,我把 qspi 的程序移植到另外的一个板子上,死活都不行,
qspi 的时钟等也都开启了,管脚也都配置了(移植前与移植后的管脚功能分配是一样的),管脚时钟也都开了,
移植后的程序可以读出 芯片 ID,但是不能够读写,
移植前与移植后的程序都是一样,所以现在迷茫了,
现在也找不出问题出在哪里了, 你确定硬件是支持的?qspi还要先写status reg 2,再发一条进入指令才行,你看rs2是不是0,0的话芯片没配好。 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;
}
你查一下,在没进入QSPI模式时要用标准SPI模式去读写SR2,而且切记:写SR2之后务必等待芯片写入完成!否则不响应你的命令。写SR2一般要1ms以内。
本帖最后由 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字节
本帖最后由 SCREA 于 2022-7-15 15:13 编辑
hpdell 发表于 2017-3-12 19:12
你好,终于找到问题所在了啊,
原来这个 stm32f7xx的单片机,里面有个 mpu 的设置,
(引用自5楼)
你这不科学啊, 有依据啊吗?手册哪里写了
SCREA 发表于 2022-7-15 15:03
你这不科学啊, 有依据啊吗?手册哪里写了
(引用自6楼)
是科学的,f7 的 读写nand ,对mpu 配置是有要求的
页:
[1]