您现在的位置是:首页 >学无止境 >STM32-HAL-SPI-W25Q128FV简单读写测试(2)网站首页学无止境
STM32-HAL-SPI-W25Q128FV简单读写测试(2)
简介STM32-HAL-SPI-W25Q128FV简单读写测试(2)
文章目录
具体的配置接上文STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)
为了要进行芯片的读写操作,因此要先了解一下芯片的相关读写指令。
- 芯片相关的读写指令
0x50 | 允许写状态寄存器的命令 | 0x05 | 读状态寄存器命令 |
---|---|---|---|
0x01 | 写状态寄存器命令 | 0x9F | 读器件JEDEC ID命令 |
0x06 | 写使能命令 | 0x20 | 擦除扇区命令 |
0x03 | 读数据区命令 | 0xC7 | 批量擦除命令 |
0xA5 | 哑命令,可以为任意值,用于读操作 | 0x01 | 状态寄存器中的正在编程标志(WIP) |
一、Flash的基本读写操作
本次擦写测试非全片擦写,仅仅使用划定大小进行擦写
读写测试地址 | TEST_ADDR | 0 |
---|---|---|
读写测试划定大小 | TEST_SIZE | 4*1024 |
连续擦写起始地址 | 0x02 | |
读写一个数值地址 | 0x00 |
1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取
void falsh_Read_Write_Test(void)
向flash芯片写入一串不定长的数据
存储的时候类型都是以字符或者数字
代码示例
void falsh_Read_Write_Test(void)
{
uint8_t i;
uint8_t CMP_Flag = 1;
uint8_t Tx_Buffer[] = "HelloWorld";
const uint8_t BufferSize = sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]);//要写入的数据长度
uint8_t Rx_Buffer[BufferSize];//缓冲区的大小是待定的
/*擦除1个扇区 全部写为0xFF 即全部的bit刷为1*/
sf_EraseSector(0x00000000); /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*/
/*向目标地址写入数据*/
sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);
printf("写入的数据为:%s 写入数据的大小为:%d
", Tx_Buffer,BufferSize);
/*读出目标地址的数据*/
sf_ReadBuffer(Rx_Buffer,0x02,BufferSize);
printf("读出的数据为:%s
", Rx_Buffer);
/*比较目标地址和待读取地址数据*/
for(i=0;i<BufferSize;i++)
{
if(Tx_Buffer[i] != Rx_Buffer[i])
{
CMP_Flag = 0;
break;
}
}
if(CMP_Flag == 1)
printf("恭喜,Falsh芯片读写不定长数据测试成功!
");
else
printf("What?Falsh芯片读写不定长数据测试失败!
");
HAL_Delay(1000);
sfReadTest(); /* 读串行Flash数据,并打印出来数据内容 */
}
- 打印出来的数据:
[result]
FF FF 48 65 6C 6C 6F 57 6F 72 6C 64 00 FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
... ... (省略很多的FF)
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
数据长度: 4096字节, 读耗时: 3ms, 读速度: 1365333 Bytes/s
- 执行扇区擦写,全部擦写为
0xFF
,即将每一个比特位写入1,因此可以看到全部都是FF
- 执行写的地址是从
0x02
开始的,因此可以看到第三位的数据才改变 - 后面连续的
11字节
写入预设的字符串 - 但是最后一位补了