uint32 sector 是开始的 sector,uint32 cnt 是擦除的 sector 数目。
#define FLASH_WRITE_LEN_BYTE (1024*4)
#define FLASH_WRITE_CONTENT (0X10)
void flash_sector_rw_test(uint32 sector,uint32 cnt)
{
char* w_data=(char*)os_malloc(FLASH_WRITE_LEN_BYTE);
uint32 flash_operate=0;
uint32 i=0;
uint8 status=0;
os_printf("Test Sector is 0x%x\n",sector);
if(NULL==w_data){
os_printf("Memory little\n");
return;
}
os_memset(w_data,FLASH_WRITE_CONTENT,FLASH_WRITE_LEN_BYTE);
for(i=0;i<cnt;i++){
if(spi_flash_erase_sector(sector+i)==0)
{
os_printf("erase sector0x%x ok\n",sector+i);
}
else{
os_printf("Err:erase sector0x%x err\n",sector+i);
}
}
for(i=0;i<cnt;i++){
if(spi_flash_write((sector+i)*(FLASH_WRITE_LEN_BYTE),
(uint32*)w_data,FLASH_WRITE_LEN_BYTE)==0)
{
os_printf("write sector 0x%x ok\n",sector+i);
}
else{
os_printf("Err:write sector 0x%x err\n",sector+i);
}
}
for(i=0;i<cnt;i++){
os_memset(w_data,0x00,FLASH_WRITE_LEN_BYTE);
if(spi_flash_read((sector+i)*(FLASH_WRITE_LEN_BYTE), (uint32*)w_data,FLASH_WRITE_LEN_BYTE)==0)
{
uint32 j=0;
for(j=0;j<FLASH_WRITE_LEN_BYTE;j++){
if(*(w_data+j)!=FLASH_WRITE_CONTENT){
os_printf("Err Flash read w_data[%d]=0x%x\n",j,w_data[j]);
//status=1;
}
if(*(w_data+j)==FLASH_WRITE_CONTENT&&j==FLASH_WRITE_LEN_BYTE-1)
{
os_printf("Sector0x%x Test Ok\n",sector+i);
}
}
}
else {
os_printf("Err:read sector0x%x err\n",sector+i);
}
}
os_free(w_data);
w_data=NULL;
}
如何判断 Flash 是否支持 QIO 或 DIO 模式?
判断 Flash 是否支持四线:
- QE 在状态寄存器的 BIT(9)。
- 写状态寄存器的格式为 01H+StatusReg1+StatusReg2。
- 有读 Flash 的如下命令:
- 若是选择 QIO,必须支持 EBh 命令。
- 若是选择 QOUT,必须支持 6 Bh 命令。
判断 Flash 是否支持两线:
有读 Flash 的如下命令:
- 若是选择 DIO,必须支持 BBh 命令。
- 若是选择 DOUT,必须支持 3 Bh 命令。
特殊的 Flash:ISSI Flash 可以支持 QIO 模式。
为什么透传过程会丢包?
因为没有设置硬件流控。如果需要避免丢包,请设置硬件流控。透传功能使用的是 TCP 协议,每包数据是 1460 (取决于协议栈),只要网络良好,buffer 空间没有被消耗完,就可以不停地传输数据。对于透传,串口接收数据间隔超过约 20 ms,就会认为数据接收结束,将已经接受的数据传输到网络。如果网络不好,就可能会丢弃一些数据,因此,为避免这种情况,可以将串口设置为流控模式。
ESP8266 有几个 UART?
ESP8266 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。
GPIO 电平状态是怎样的?
除了 XPD_DCDC,GPIO 可以配置上拉。关于 GPIO 的上电 IO 口默认状态为:除了 SDIO 6根线 +GPIO4+GPIO5+GPIO16 上电 IO 默认无上拉,其他的 GPIO 口均有上拉。由于是内部配置上拉,所以如需下拉,需外部加下拉方式或者加一个三级管的反相电路。
注意:GPIO 不能到 5V。GPIO4/5 外接 1M 电阻不能上拉到高电平;需 100K 电阻。
如何屏蔽上电打印?
U0TXD 默认上电有系列打印,对此敏感应用可通过 UART 的内部引脚交换功能,在初始化的时候,调用 system_uart_swap 函数,将 U0TXD、U0RXD 分别与 U0RTS (MTDO/GPIO15),U0CTS (MTCK/GPIO13) 交换来屏蔽该上电的系统打印。交换后,硬件上的下载管脚还是使用 U0TXD+U0RXD,通信时需要将 MTDO 对应接到 MCU 的 RXD,MTCK 对应接到 MCU 的 TXD。
为什么 ESP8266 上电时会出现乱码?如何修改波特率?
如果使用的是 26 MHz 晶振,ESP8266 UARTO 上电后的波特率是 74880,所以上电时会有乱码。
客户可以在 user_main() 里面修改 UART 配置,比如:
void ICACHE_FLASH_ATTR
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
{
// rom use 74880 baut_rate, here reinitialize
UartDev.baut_rate = uart0_br;
uart_config(UART0);
UartDev.baut_rate = uart1_br;
uart_config(UART1);
}