플래쉬 라이팅 do_iap 오류

W7500P로 개발중에 있습니다.

예제프로그램중에 S2E_BOOT 을 응용해서 부트프로그램 짜고 있습니다. 이더넷으로 원격업데이트를 위함입니다.

부트 에서 이더넷으로 데이타를 다운받고 flash 영역에 app을 라이팅한후 app로 점프해서 실행하게끔 만들려고 하는데

write_flash() 중에 do_iap() 함수에서 랜덤하게 리턴을 못하고 정지하네요.

영어포럼에서 저와 비슷한경험을 하신분이 있던데 그분처럼 내부 클럭을 4Mhz 까지 낮췄는데도 랜덤하게 do_iap 리턴을 못하고 얼어버리네요.

종종 정상적으로 write_flash이 완료되어 app로 점프해서 정상동작하는걸 확인했습니다.

내부클럭속도 조절외에 유심히 봐야할부분이 있는지 알려주셨으면 합니다.

안녕하세요.
W7500x 칩의 IAP 기능은 내부적으로 8MHz로 동작하도록 제작되어 있습니다.
제공된 W7500 기반 S2E 펌웨어의 경우, 안정성 확보를 위해 IAP 동작 시 MCU 동작 클럭을 8MHz로 변경하여 해당 동작을 수행하도록 구성되어 있습니다.

[IAP 동작 시 = Internal 8MHz]

static void W7500x_Init(void)
{
	...
	/* Set System init */
	SystemInit_User(CLOCK_SOURCE_INTERNAL, PLL_SOURCE_8MHz, SYSTEM_CLOCK_8MHz);
	...
}

[일반 동작 시 = External 48MHz]

static void W7500x_Init(void)
{
	...
	/* Set System init */
	// DEVICE_CLOCK_SELECT: CLOCK_SOURCE_EXTERNAL
	// PLL clock source: 12MHz
	// System clock: 48MHz
	SystemInit_User(DEVICE_CLOCK_SELECT, DEVICE_PLL_SOURCE_CLOCK, DEVICE_TARGET_SYSTEM_CLOCK);
	...
}

이외에, DO_IAP() 함수 수행 이전에 Interrupt 발생을 방지하기 위한 interrupt disable 및 함수 동작 완료 후 interrupt enable이 잘 수행되고 있는지 체크 부탁 드립니다.

위즈넷에서 최신 소스 받아서 모두 바꿨는데도 동일하네요. 외부 크리스탈은 8m 이고 시스템 클락도 8m로 세팅했습니다.

그냥 랜덤 데이타를 플래쉬에 라이팅하는 방법으로 테스트했고 인터럽트는 아예 사용하지 않고 있습니다.

저희한테는 이더넷 업데이트 기능을 포기 해야할 정도입니다.

칩 버전이 A664298 / 1607 인데요 칩이 업버전된건 없나요.

DO_IAP() 에 들어가서 빠져나오질 못하는데 FAIL 되면 DO_IAP빠져 나오게 할순 없나요.

또하나 궁금한것이

W7500 ISP TOOL 프로그램에서 시리얼로 플래쉬에 무작위 데이타 120Kbyte 를 라이트할때는 멈춤현상없이 라이팅이 잘 됩니다.

플래쉬 라이팅 알고리즘이 다른가요?

안녕하세요.
현재 Github에 오픈되어 있는 W7500P 기반 S2E 펌웨어 예제 코드가 언급하신 A664298/1607 datecode 칩 기반으로 테스트 된 바 있습니다.
프로젝트 링크: github.com/wiznet/wiz750sr

이전에 언급 드린 대로, 예제의 Boot 코드에서의 IAP 동작은 클럭이 Internal / 8MHz로 설정되어 있습니다. 그리고 사용자가 별도로 Interrupt를 추가하지 않았더라도 Ethernet library에 systick interrupt가 포함되어 있는 등 예제 코드를 기반으로 코드 작성 시 Interrupt disable / enable 과정이 꼭 필요함을 알려 드립니다.

제공된 예제 코드에서의 IAP 동작, 즉 펌웨어 업데이트 기능의 동작을 참고하셔서 작성하신 코드를 체크 해 보시기 바랍니다.