본문 바로가기
프로젝트 기록/23SEMA_Control_STM32

[LoRa] 5편. 두 모듈에서 code 200 return받기

by 소요이 2023. 1. 18.
728x90

대부분 코드를 main문 안의 while문 안에 넣는데, 

while문임에도 계속 돌아가지 않고 멈추는 현상이 발생했다.

그래서 lora_send() 함수를 주석 처리 하니 위 사진처럼 정상 작동함..

lora send함수에서 이상이 생긴 듯 하다.

 

추정되는 이유로는

1. lora_send함수를 실행했는데 rx측 보드와 연결이 안 되어 있으면 return값이 없어 동작을 멈춘다

일 듯 한데..

위 현상이 일어나는 Tx측 코드

그래서 rx측 코드를 다시 한 번 확인하고 tx측 보드와 연결이 잘 되는지 다시 한번 확인한 뒤,

그 상황에서는 while문의 모든 코드가 정상적으로 돌아가는지 확인할 예정이다.

 

 

 

1) 함수 멈추는 거 해결하기(세팅확인, 함수 확인)

 

void LoRa_Send()
{
	LoRa_transmit(&myLoRa, Tx_information, 20, 100);
}

코드 실행 중 main문 내부의 while문이 정상적으로 돌아가지 않아

디버깅 해 본 결과, LoRa_Send()함수만 들어가면 멈췄다. 

그 내부에는 transmit함수가 있는데, transmit 함수로 이동해 보면

uint8_t LoRa_transmit(LoRa* _LoRa, uint8_t* data, uint8_t length, uint16_t timeout){
	uint8_t read;

	int mode = _LoRa->current_mode;
	LoRa_gotoMode(_LoRa, STNBY_MODE);
	read = LoRa_read(_LoRa, RegFiFoTxBaseAddr);
	LoRa_write(_LoRa, RegFiFoAddPtr, read);
	LoRa_write(_LoRa, RegPayloadLength, length);
	LoRa_BurstWrite(_LoRa, RegFiFo, data, length);
	LoRa_gotoMode(_LoRa, TRANSMIT_MODE);
	while(1){
		read = LoRa_read(_LoRa, RegIrqFlags);
		if((read & 0x08)!=0){
			LoRa_write(_LoRa, RegIrqFlags, 0xFF);
			LoRa_gotoMode(_LoRa, mode);
			return 1;
		}
		else{
			if(--timeout==0){
				LoRa_gotoMode(_LoRa, mode);
				return 0;
			}
		}
		HAL_Delay(1);
	}

}

이렇게 내부에 while문이 있다. 

아마 이 while문에서 빠져나가지 못해서 무한 딜레이가 발생하는 듯 하다.

(이렇게 빠져버리면 watchdog을 이용해 빠져나갈 수 있는데, 이 방법도 추후 고려해 보도록 하자)

 

내가 찾은 문제점은..

 void Init_LoRa(); 라고 선언만 되어있고

  /* USER CODE BEGIN 2 */
  int i;
  Init_LoRa();
  /* USER CODE END 2 */

이 부분이 누락되어 있었다.

코드 수정중에 실수로 지워진 듯 하다..

 

이를 수정하고 다시 테스트를 해 보면 

 

 

오류 코드 LoRa_404가 뜨지만(모듈이 보드와 통신할 수 없음)

이제 LoRa_Send()함수가 막힘 없이 실행됨을 확인했다.

 

 

 

 

2) Tx측에서 1->101, 2->102 로 바뀌는 값을 쏴주고, Rx측에서 그거 바뀌는 값을 받고 202코드 return 하도록 하기.

rx측 200은 return 받았으나.. 보낸 값이 안 들어왔다.

 

근데 이상한 점은, tx측은 둘 다 전원이 연결되었음에도 404가 뜨고

rx측은 한 쪽만 전원이 연결되어도 200이 뜬다.

여기서 알 수 있는 사실은,

code 200은 두 기기가 연결되어야 뜨는 것이 아니라, 

한 모듈에서 마이크로컨트롤러와 로라 모듈이 통신을 할 준비가 완벽하면 뜨는 것이다.

 

현재 상황 정리

1. code 200: tx측은 x, rx측은 o

즉, tx측 보드와 모듈이 제대로 연결되어 있지 않다.

해결 test: 제대로 통신 되었던 rx측 보드에 tx측 모듈을 연결해 보고 결과 확인 -> 모듈은 정상

Rx보드에 Tx모듈, (Rx코드) -> 정상작동. code200 return받음

그럼 모듈의 하드웨어적 결함은 없다.

그렇다면 Tx측 보드와 Tx측 모듈을 원래대로 연결하고 

여기에 Rx측 코드를 넣어보면, 보드의 이상을 알 수 있다.

이것도 정상이다.

즉, Tx측 보드, 모듈 모두 정상이며

Rx측 보드와 모듈은 당연히 정상이다.

 

1. configuration 문제 (핀설정, 클럭설정)

2. 설정 문제 (함수설정, 연결)

3. 코드 문제 (헤더파일)

 

로 좁혀졌다. 

 

 

rx프로젝트는 문제가 없는 거니까 rx프로젝트와 동일한 설정에서 tx를 돌려보려고 한다.

그런데 새로 프로젝트를 만들면 일이 많고, 

tx프로젝트의 기능을 모두 off했는데 혹시 프로젝트 자체의 문제가 아니였다면 귀찮아진다.

 따라서 rx프로젝트를 복제해서 tx로 설정을 바꾸고, 실행해 보겠다.

 

 


23-01-30

아...허무하다...

ㅋㅋ코드를 몇 번을 확인했는데..

핀 설정이 잘못되있었음

왜지? 뭔가에 홀렸었나?

Tx측 200뜨는 것 확인했다

세상에 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ