W5300 인터럽트 관련 질문 입니다(두번째..ㅜ)

지난번에 공통 레지스터와 소켓 레지스터의 혼동으로 인터럽트가 안걸려서 삽질 했던 사람입니다 ㅎㅎ;

이번 질문은

제공해주신 프로그램

Socket.c(h), w5300.c(h)에 함수가 잘 만들어져 있어서 굉장히 잘 쓰고 있습니다.

그런데

Socket.c에 " int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) " 함수 경우

Sn_IMR 레지스터에 Sn_IR_SENDOK Bit를 1로 Set하지 않으면 한번만 동작합니다.

send() 함수를 살펴본 결과

bbaa

위의 조건 때문에 최초 한번만 실행되는거 같습니다.

저는 제공된 프로그램을 수정하지 않고

계속 send 함수가 정상적으로 동작시키고 싶은데…

아직까지 좋은 아이디어가 안떠오릅니다…

조언 부탁드립니다.

Sn_IMR은 인터럽트 마스크입니다. 초기 인터럽트 설정후 변경할 필요가 없습니다.
이 후 해당 인터럽트가 발생시 Sn_IR로 인터럽트 종류 확인이 가능한데 인터럽트 확인 후 해당 비트를 클리어해주시면 됩니다.
간단하게 설명해드리면

  1. 초기 설정
  • SIMR 설정(인터럽트를 발생시킬 소켓 설정), Sn_IMR 설정(인터럽트 종류 설정)
  1. 인터럽트 발생시
  • SIR로 인터럽트 발생 소켓 번호 확인 & Sn_IR로 인터럽트 종류 확인
  • 인터럽트 시퀀스 수행
  1. 인터럽트 시퀀스 종료후
  • SIR 및 Sn_IR 클리어

감사합니다.

감사합니다. 알려주신 방법으로 시험 진행해보겠습니다

(- -) (_ _)

1 Like