STM32/STM32C031-DK

STM32C031-DK와 DOT MATRIX 사용하기 2편(MAX7219사용)

원원 2024. 2. 24. 19:30

안녕하세요. 오늘은 STM32C031-DK와  DOT MATRIX 32*8을 사용해보겠습니다.
(해당글을 이해하기 위해서는 DOT MATRIX 사용하기 1편을 봐야합니다)

앞면
뒷면

해당 모듈도 MAX7219를 사용하고 도트매트릭스 8*8짜리 1개당 1개씩 사용해서 총 4개가 달려있습니다


*OUT핀 나가는 파형
SPI신호의 MOSI가 MAX7219의 IN핀으로 들어와서 OUT핀으로 나갑니다.
근데 OUT으로 나가는 파형이 동일시점에서 IN과 OUT이 같지가 않습니다. IN파형이 들어오고나서, 16.5클럭이후에 OUT으로 파형이 나갑니다


실제 파형을 보겠습니다

1번이 실제로 MCU와 연결하는 핀이고, 2,3,4번은 2,3,4번째 세그먼트의 IN핀입니다. (글의 처음 부분의 그림에 빨강선이 연결해있는데 파형을 측정하려고 선을 딴것입니다)
파형에 빨강/주황/노랑/초록으로 네모표시가 있는데 빨강네모표시를 보면 1번핀에서 16클럭동안 0x01,0x01파형이 들어왔습니다. 이때 2,3,4번핀에서는 0x00,0x00파형이 들어왔는데 해당 파형은 이전에 보냈었던 파형입니다. 2,3,4번째 빨강네모를 보면 각각 16.5클럭 이후에 0x01,0x01파형이 들어온것을 볼 수 있습니다.
여기서 중요한거는 1번핀의 파형을 보면 0x01,0x01 / 0x01,0x02 / 0x01,0x04 / 0x01,0x08 파형이 찍혔습니다. 그러면 맨 마지막에 들어온 0x01, 0x08로 도트매트릭스가 표시하게 됩니다.
그러면 결론적으로, 첫번째 도트매트릭스에는 0x01, 0x08 / 두번째 도트매트릭스에는 0x01,0x04 / 세번째 도트매트릭스에는 0x01,0x02 / 네번째 도트매트릭스에는 0x01,0x01가 표시됩니다

소스코드

	uint16_t test_send[4] = {0x0101,0x0102,0x0104,0x0108};
	for(int i=0; i<sizeof(test_send)/2; i++)
	{
		spi_transmit(test_send[i]);
	}


위의 코드 이후에 두번째줄을 표시해주려고 {0x0202, 0x0204, 0x0208, 0x0210}을 보낸다고 가정해보겠습니다.
그러면 첫번째줄은 모두 첫번째 세그먼트의 모양처럼 0x01,0x08가 표시됩니다. 왜냐하면 1번 MAX7219에서 이전에 보냈었던 0x01,0x08가 저장되어있어서 OUT으로 그파형을 보내게 됩니다.

소스코드

	uint16_t test_send[4] = {0x0101,0x0102,0x0104,0x0108};
	for(int i=0; i<sizeof(test_send)/2; i++)
	{
		spi_transmit(test_send[i]);
	}
	uint16_t test_send2[4] = {0x0202,0x0204,0x0208,0x0210};
	for(int i=0; i<sizeof(test_send2)/2; i++)
	{
		spi_transmit(test_send2[i]);
	}



*해결법
CS핀을 LOW로 해놓은 상태에서 MOSI,CLK로 데이터를 아무리 보내도 CS를 HIGH하기 직전에 2바이트만 MAX7219가 인식하는거같습니다. 이 방법으로 도트매트릭스를 하나씩 설정하면 됩니다. 

위의 파형 이전에 1번핀으로 0x02,0x00을 보냈었습니다. 2,3,4번핀에 모두 0x02가 있긴하지만, 결국 CS핀이 HIGH로 올라기전 16클럭때는 0x00,0x00 파형이 있습니다. 1번핀에는 설정 할 0x03,0x1F파형이 있습니다. 그럼 1번핀만 0x03,0x1F로 설정되고 나머지는 0x00,0x00이므로 아무일도 발생안합니다. 이러한 방식으로 코드를 만들어서 1번매트릭스표시 / 2번매트릭스표시/3번매트릭스표시/4번매트릭스표시를 하면 됩니다

*화면 Clear하기
0x01~0x08모든곳에 0x00을 주면 LED가 꺼지므로 Clear가 됩니다

void max7219_display_clear()
{
	uint16_t data[] = {0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800,0x0000,0x0000,0x0000};
	for(uint8_t i=0; i<sizeof(data)/2; i++)
	{
		spi_transmit(data[i]);
	}
}



*최종소스코드
위의 내용을 적용해서 1,2,3,4를 세그먼트에 표시했습니다.

https://github.com/yhunterr/STM32C031-DK/tree/main/stm32c0316_dk_dotmatrix4

'STM32 > STM32C031-DK' 카테고리의 다른 글

STM32C031-DK와 DOT MATRIX 사용하기 1편(MAX7219사용)  (0) 2024.02.19