FND 제어

김지성·2022년 7월 19일
1

Embedded

목록 보기
10/19
post-thumbnail

(( https://github.com/kostarev/TM74HC595-4dig-display/blob/master/TM74HC595Display.cpp
FND관련 깃헙 ))

VCC: 전력 공급

DIO: 직렬 데이터 입력

RCLK: 시계 맥박 신호

SCLK: 입력 시계 신호

GND: 지상


모듈을 제어할 때 사용하면 좋은 방법
1) 하드웨어 담당자에게 데이터시트 부탁하기
2) 모듈의 메인 칩의 이름을 찾는다

FND 메인칩 이름 : TM74HC595

  • 메인칩의 데이터 시트만 찾을게 아니라 모듈 자체에 대한 데이터 시트도 필요함

1.1 GPIO핀 설정

pinMode(SCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(DIO, OUTPUT);

OUTPUT으로 설정되어 있는걸로 봐서 나도 OUTPUT으로 설정하면 되겠다.

1.2 send

🧧 SPI 관련해서 아주 잠깐 알아보자

SPI는 CLK(클럭)과 DIO(데이터)의 신호를 쏴줄 수 있다. CLK이 일정한 주기로 펄스를 보낸다면 DIO는 내가 원하는(SET, CLEAR)값을 담을 수 있다.

//아두이노 코드

void TM74HC595Display::send(unsigned char X)
{

  for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      digitalWrite(_DIO, HIGH);			//STM32에선 DIO를 제어해주면 된다
    }
    else
    {
      digitalWrite(_DIO, LOW);			//STM32에선 DIO를 제어해주면 된다
    }
    X <<= 1;
    digitalWrite(_SCLK, LOW);			//STM32에선 클럭을 제어한다.
    digitalWrite(_SCLK, HIGH);  		//STM32에선 클럭을 제어한다.
  }
}
//STM32로 재해석

void send(uint8_t X){						//unsigned char = uint8_t

  for (int i = 8; i >= 1; i--)
  {
	if (X & 0x80)
	{
	  HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, HIGH);	
	}
	else
	{
		HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, LOW);
	}
	X <<= 1;
	HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
	HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);
  }
}

Q1 : 도대체 X는 어디서 온걸까?
A1 : digit2를 따라가보면 send_port가 나오는데, "send_port는 send_port(uint8_t X, uint8_t port)" 이렇게 생겼다. 즉 X는 _LED_0F[]의 배열이다.
(아마도 digit2의 n1, n2는 0~9를 맴돌면서 _LED_0F[]의 배열을 따라갈 것이다)

Q2 : 그렇다면 i는 어디에 쓰이는걸까?
A2 : 내가 보내고자 하는 X(8bit)를 i를 이용하여 8번 쪼갠다음 DIO(데이터)를 보내겠다는 뜻이다. 0x80와 X가 일치하다면 HIGH를 보내고, 0x80과 X가 일치하지 않는다면 LOW를 보낸다. (SPI는 8비트를 이용해 통신하기 때문)

profile
JUST DO IT

0개의 댓글