网站建设属于技术活吗,wordpress 导入数据库结构,网站整体运营,wordpress 不用插件代码高亮W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到
能够正确的读到ID#xff0c;但是读到的数据不正确
1.1 打印的寄存器的值 0x2 BUSY #xff1a;只读#xff0c; 指令正在执行 WEL (1) 但是读到的数据不正确
1.1 打印的寄存器的值 0x2 BUSY 只读 指令正在执行 WEL (1) 只读写使能锁定在写禁止后清零 BP0 - 3区块保护位 TB 顶层/底层块保护 0x7e 0b0111 1110 CMP CMP设置为1时先前由TB、BP3、BP2、BP1和BP0设置的阵列保护将被反转也就是说原本被保护的现在不保护了不保护的被保护了 SRP1, SRP0 状态寄存器保护 SUS 只读暂停状态位是状态寄存器 在执行擦除/程序暂停(75h)指令后被设置为1。通过Erase/Program Resume (7Ah)指令以及下电、上电周期SUS状态位被清除为0。 LB1 - 3 安全寄存器锁位为安全寄存器提供写保护控制和状态LB3-1默认状态为0安全寄存器未锁定。LB3-1可以通过Write Status Register指令单独设置为1。LB3-1是一次可编程(OTP)一旦设置为1相应的256字节安全寄存器将永久变为只读。 EQ QSPI使能位想要从非qspi的模式转化位spi时在切换模式之前一定要先将标志位置一否则切换模式的命令将会被忽略当在QSPI模式下不能将QE从0改为1 警告:如果/WP或/HOLD引脚直接连接到电源或地面标准SPI或双SPI操作QE位不应该设置为1 0x61 0b0110 0001 ADS 只读表示当前设备运行在哪种地址模式下当ADS0时设备为3字节地址模式当ADS1时设备为4字节地址模式。 ADP 用于确定设备上电或复位时的初始地址模式。该位仅在上电或设备复位初始化期间使用并且只能由非易失性的Write Status序列(06h 11h)写入。当ADP0(出厂默认值)时设备将启动到3字节地址模式扩展地址寄存器必须用于访问超过128Mb的内存区域。当ADP1时设备将直接进入4字节地址模式 WPS 写保护选择位WPS位用于选择应该使用哪种写保护方案。当WPS0时设备将使用CMP, TB, BP[3:0]位的组合来保护存储器阵列的特定区域。当WPS1时设备将使用单个块锁来保护任何单个扇区或块, 当在设备上电或复位后所有单独块锁位的默认值为1。 DRV1, DRV2 输出驱动强度(DRV1, DRV0) -易失性/非易失性可写DRV1和DRV0位用于确定Read操作的输出驱动程序强度。 1.2 可能原因
写保护被使能导致不能修改
经过检查发现所有的地址都被保护了起来不能修改、也不能擦除
1.3 解决办法
查看寄存器手册得知只要将寄存器2的CMP位改成0或者将寄存器1的BP0-BP3改为0就可以
我选择将CMP改为0将整片的Flash的写保护都给去掉 看到数据手册上说要写易变状态寄存器位必须在写状态寄存器指令(状态寄存器位WEL保持0)之前执行(50h)指令 因为初始化的时候将WEL置1了所以先将WEL置0
QSPI_Send_CMD(0x04,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//禁止写使能使WEL位为0
W25QXX_Wait_Busy(); //等待命令执行完毕要向W25Q256先写入50h表示要修改状态寄存器中的易失状态位
QSPI_Send_CMD(0x50,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//写指令50h
W25QXX_Wait_Busy(); //等待命令执行完毕写入31h表示要修改状态寄存器2紧接着发送想要发送的数值
QSPI_Send_CMD(0x31,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_4_LINES);
QSPI_Transmit(temp,1);//发送1个字节
W25QXX_Wait_Busy();//等待命令执行完毕1.4 用到的函数
//QSPI发?命 ?
void QSPI_Send_CMD(uint32_t Instruction,uint32_t Address,uint32_t DummyCycles,uint32_t InstructionMode ,uint32_t AddressMode , uint32_t AddressSize ,uint32_t DataMode)
{QSPI_CommandTypeDef CmdHandler;CmdHandler.InstructionInstruction;//指令CmdHandler.AddressAddress;//地址CmdHandler.DummyCyclesDummyCycles;//设置空指令周期数CmdHandler.InstructionModeInstructionMode;//指令模式CmdHandler.AddressModeAddressMode;//地址模式CmdHandler.AddressSizeAddressSize;//地址长度CmdHandler.DataModeDataMode;//数据模式CmdHandler.SIOOModeQSPI_SIOO_INST_EVERY_CMD;//每次都发指令CmdHandler.AlternateByteModeQSPI_ALTERNATE_BYTES_NONE;//无交替字 ?CmdHandler.DdrModeQSPI_DDR_MODE_DISABLE;//关闭DDR模式CmdHandler.DdrHoldHalfCycleQSPI_DDR_HHC_ANALOG_DELAY;// QSPI_HandleTypeDef QSPI_CommandTypeDef TimeoutHAL_QSPI_Command(hqspi1,CmdHandler,5000);
}uint8_t QSPI_Transmit(uint8_t*buf,uint32_t datalen)
{//DLR数据长度寄存 ?hqspi1.Instance-DLRdatalen-1; //配置数据长度if(HAL_QSPI_Transmit(hqspi1,buf,5000)HAL_OK){return 0;//发?数 ?,发?buf数组中的数据 ?}else{return 1;}
}//等待空闲
void W25QXX_Wait_Busy(void)
{while((W25QXX_ReadSR(1)0x01)0x01); // 等待BUSY位清空
}