完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
因为项目要求,无法使用官方的升级接口,所以自己写flash进行升级,但是遇到了问题
reboot to use1 state: 5 -> 0 (0) rm 0 pm close 7 del if0 usl ets Jan 8 2013,rst cause:2, boot mode:(3,7) load 0x40100000, len 2408, room 16 tail 8 chksum 0xe5 load 0x3ffe8000, len 776, room 0 tail 8 chksum 0x84 load 0x3ffe8310, len 632, room 0 tail 8 chksum 0xd8 csum 0xd8 2nd boot version : 1.6 SPI Speed : 40MHz SPI Mode : DIO SPI Flash Size & Map: 32Mbit(512KB+512KB) jump to run user1 @ 1000 error magic! first boot failed, reboot to try backup bin 一直是错误的,我是用C#写了一个上位机,分段读取bin文件,然后通过UDP发给esp8266,并且在写入完成后把数据读出来了 数据跟我发送的是一致的,但是还是无法启动,以下是我的升级代码 #define USER1 0x01000 #define USER2 0x81000 //0x101000 uint16 History_Pack = 0; uint32 OTA_ADDR; void OTA_upgrade(void) { uint16 PackLength = 0; uint16 TotalPack,CurrentPack; uint16 Sector; uint16 Sector_count = 0,num = 0; uint8 bin = 0; //总包数 TotalPack = (uint16)char_change_int( UDP_ReceiveBuff.Pack_data, 2, UDP_ReceiveBuff.Data_Length); //当前分包 CurrentPack = (uint16)char_change_int( UDP_ReceiveBuff.Pack_data, 2, UDP_ReceiveBuff.Data_Length); //包长 PackLength = (uint16)char_change_int( UDP_ReceiveBuff.Pack_data, 2, UDP_ReceiveBuff.Data_Length); os_printf("rn[OTA]TotalPack:%d CurrentPack:%d PackLength:%d",TotalPack,CurrentPack,PackLength); if (CurrentPack == 1 && TotalPack != 0) { //查询 user bin uint8_t userBin = system_upgrade_userbin_check(); switch (userBin) { case UPGRADE_FW_BIN1: OTA_ADDR = USER2; Sector_count = 129; Sector = 130 + ((TotalPack * PackLength) / 4096); break; // user2.bin case UPGRADE_FW_BIN2: OTA_ADDR = USER1; Sector_count = 1; Sector = 2 + ((TotalPack * PackLength) / 4096); break; // user1.bin default: os_printf("[OTA]Invalid userbin number!n"); return; } while(1) { //擦除扇区(flash必须先擦再写) if(spi_flash_erase_sector (Sector_count) == SPI_FLASH_RESULT_OK) { os_printf("rn[OTA]flash_erase_sector %d OKn",Sector_count); num = 0; Sector_count++; }else num++; if(num > 10 || Sector_count >= Sector) break; } } if(History_Pack < CurrentPack && History_Pack != CurrentPack) { bin = OTA_Write((uint32 *)UDP_ReceiveBuff.Pack_data,PackLength); if(bin)os_printf("rn[OTA]write %d OK",CurrentPack); } else bin = 1; if(bin) { //写入成功 OTA_upgrade_Reply(TotalPack, CurrentPack, 1); History_Pack = CurrentPack; } else { //写入失败 OTA_upgrade_Reply(TotalPack, CurrentPack, 0); } if((CurrentPack) >= TotalPack) { os_printf("rn[OTA]reboot OK",CurrentPack); system_upgrade_flag_set(UPGRADE_FLAG_FINISH); //重启系统,运行新软件 system_upgrade_reboot(); } } uint8 OTA_Write(uint32 *pBuffer,uint32 length) { uint32 Write_data[45] = {0}; uint32 Read_data[45] = {0}; uint8 i = 0; uint8 Ip_num[4]={0}; for(i = 0; i < (length / 4); i++) { Ip_num[3]=(uint8)((pBuffer>>24)&0x000000ff); Ip_num[2]=(uint8)((pBuffer>>16)&0x000000ff); Ip_num[1]=(uint8)((pBuffer>>8)&0x000000ff); Ip_num[0]=(uint8)(pBuffer&0x000000ff); Write_data = (Ip_num[0] << 24) + (Ip_num[1] << 16) + (Ip_num[2] << 8) + (Ip_num[3]); } //写入数据到A扇区(flash必须4个字节对齐) if(spi_flash_write (OTA_ADDR, Write_data,length) == SPI_FLASH_RESULT_OK){ //读取扇区 spi_flash_read(OTA_ADDR, Read_data,length); os_printf("rn[OTA]READ:"); for(i = 0; i < (length / 4); i++) os_printf(" %X",Read_data); OTA_ADDR = OTA_ADDR + length; os_printf("rn[OTA]OTA_ADDR %d",OTA_ADDR); return 1; }else return 0; } 测试的代码,写的有点乱,最开始打印写入的数据发现字节序反了,所以临时调换了一下 以下是程序打印的LOG Code: Select all [OTA]READ: EA040001 4001040 0 F0370300 A4180040 B4180040 12C1C0F2 61080261 4C26105 D961E971 39C1ED05 32A0A6DD 2CD042D 50C8401 F6FFC000 3D0C48 C18B2E29 A1D04411 1F3FFC0 2D0D 1C03854D CC327C F2C62200 8BF129E1 68C10C05 C0779D1 59B11B66 69918221 CC2210A A6185592 210DA891 1BD9AA99 [OTA]OTA_ADDR 4224 [OTA]write 1 OK -->OTA_upgrade [OTA]TotalPack:1915 CurrentPack:2 PackLength:128 [OTA]READ: 99F12D01 3D0E0C84 1E3FFC0 2D0F 3D0C0C84 1E0FFC0 28E1 3D014D01 C54D002D E3D010C 8401DAFF C000002D C3D0FB2 E070C84 B0BD30B2 4E0701D5 FFC00000 8BCC08F1 1BDD079D B442210C 22210B32 210D1B22 29B14A33 39D16662 8C28E185 4B000C02 C851D861 E871F881 84112C1 400DF000 F0CCFF3F FF00 [OTA]OTA_ADDR 4352 [OTA]write 2 OK -->OTA_upgrade [OTA]TotalPack:1915 CurrentPack:3 PackLength:128 [OTA]READ: FF FF0000 12C1E0C9 21980268 22881272 407A204 B20401 F951E941 59010911 D9313001 21D2040F 52040BE2 40CF204 D00BB11 80AA0100 FF1180EE 1807730 60553082 403B0AA 30620408 B20405F0 EE308066 1F2040E 90883000 BB119204 480FF11 F0EE3080 9901B099 30F832B2 409F0DD 3000BB11 B06630B2 [OTA]OTA_ADDR 4480 [OTA]write 3 OK -->OTA_upgrade 上位机的LOG 找到设备9800 正在传输升级包 1915/1 正在传输数据:EA-04-00-01-04-00-10-40-00-00-00-00-F0-37-03-00-A4-18-00-40-B4-18-00-40-12-C1-C0-F2-61-08-02-61-04-C2-61-05-D9-61-E9-71-39-C1-ED-05-32-A0-A6-DD-02-CD-04-2D-05-0C-84-01-F6-FF-C0-00-00-3D-0C-48-C1-8B-2E-29-A1-D0-44-11-01-F3-FF-C0-00-00-2D-0D-1C-03-85-4D-00-CC-32-7C-F2-C6-22-00-8B-F1-29-E1-68-C1-0C-05-0C-07-79-D1-59-B1-1B-66-69-91-82-21-0C-C2-21-0A-A6-18-55-92-21-0D-A8-91-1B-D9-AA-99 正在传输升级包 1915/2 正在传输数据:99-F1-2D-01-3D-0E-0C-84-01-E3-FF-C0-00-00-2D-0F-3D-0C-0C-84-01-E0-FF-C0-00-00-28-E1-3D-01-4D-01-C5-4D-00-2D-0E-3D-01-0C-84-01-DA-FF-C0-00-00-2D-0C-3D-0F-B2-0E-07-0C-84-B0-BD-30-B2-4E-07-01-D5-FF-C0-00-00-8B-CC-08-F1-1B-DD-07-9D-B4-42-21-0C-22-21-0B-32-21-0D-1B-22-29-B1-4A-33-39-D1-66-62-8C-28-E1-85-4B-00-0C-02-C8-51-D8-61-E8-71-F8-81-08-41-12-C1-40-0D-F0-00-F0-CC-FF-3F-00-00-FF-00 正在传输升级包 1915/3 正在传输数据:00-00-00-FF-00-FF-00-00-12-C1-E0-C9-21-98-02-68-22-88-12-72-04-07-A2-04-00-B2-04-01-F9-51-E9-41-59-01-09-11-D9-31-30-01-21-D2-04-0F-52-04-0B-E2-04-0C-F2-04-0D-00-BB-11-80-AA-01-00-FF-11-80-EE-01-80-77-30-60-55-30-82-04-03-B0-AA-30-62-04-08-B2-04-05-F0-EE-30-80-66-01-F2-04-0E-90-88-30-00-BB-11-92-04-04-80-FF-11-F0-EE-30-80-99-01-B0-99-30-F8-32-B2-04-09-F0-DD-30-00-BB-11-B0-66-30-B2 |
|
相关推荐
1个回答
|
|
ESP8266 OTA(Over-The-Air)升级错误可能有多种原因。根据您提供的信息,我将尝试分析可能的原因并提供解决方案。
1. 错误的固件格式:请确保您正在使用的固件是正确的格式,通常是.bin文件。如果您使用的是其他格式,可能需要转换为.bin格式。 2. 错误的固件版本:请确保您正在使用的固件版本与您的ESP8266模块兼容。如果您使用的固件版本过高或过低,可能会导致升级失败。 3. 错误的升级方法:由于您提到无法使用官方的升级接口,您需要确保您自定义的升级方法正确地将固件写入到ESP8266的闪存中。请检查您的代码,确保在升级过程中正确地处理了闪存操作。 4. 闪存损坏:如果ESP8266的闪存部分损坏,可能会导致升级失败。您可以尝试使用其他模块进行测试,以排除这个问题。 5. 电源不稳定:在升级过程中,如果电源不稳定,可能会导致升级失败。请确保在升级过程中电源稳定。 6. 错误的配置参数:请检查您的配置参数,确保它们与您的ESP8266模块和固件兼容。 7. 错误的校验和:在升级过程中,如果校验和不正确,可能会导致升级失败。请检查您的固件文件,确保校验和正确。 8. 固件损坏:如果固件文件在下载或传输过程中损坏,可能会导致升级失败。请重新下载固件文件并尝试再次升级。 为了解决这些问题,您可以尝试以下步骤: 1. 确保固件格式正确,通常是.bin文件。 2. 确保固件版本与您的ESP8266模块兼容。 3. 检查您的自定义升级方法,确保正确地将固件写入到ESP8266的闪存中。 4. 尝试使用其他模块进行测试,以排除闪存损坏的问题。 5. 确保在升级过程中电源稳定。 6. 检查配置参数,确保它们与您的ESP8266模块和固件兼容。 7. 检查固件文件的校验和,确保正确。 8. 重新下载固件文件并尝试再次升级。 希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我能更好地帮助您。 |
|
|
|
只有小组成员才能发言,加入小组>>
528浏览 6评论
440浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
425浏览 5评论
423浏览 4评论
399浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 16:50 , Processed in 0.570928 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号