F๐Ÿ’ปW/Coding

Atmega๋กœ UART, SPI ํ†ต์‹  ๊ตฌํ˜„

์ฒœ์ˆญ์ด 2023. 12. 4. 11:31

Atmega8A ์นฉ์„ ์‚ฌ์šฉํ•ด UART, SPI ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Atmega๋ฅผ Master์นฉ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , GPIO ํ•€์„ ํ™œ์šฉํ•ด ์—ฐ๊ฒฐ๋œ Slave์นฉ๋“ค์˜ ํ•€๋“ค๊นŒ์ง€ ์ปจํŠธ๋กค ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•  ์‹œ ์ž‘๋™์ด ์•ˆ ๋ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค,,!

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์‹œํŠธ์—์„œ ๊ธฐ์ดˆ ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ์™€ C์ฝ”๋“œ๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ ๊ธฐ์ˆ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ๊ทธ ์ฝ”๋“œ๋ฅผ ์ผ๋ถ€ ์ฐธ๊ณ ํ•ด์„œ ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ, ์›ฌ๋งŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ์‹œํŠธ๋ฅผ ๋จผ์ € ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :>

 


 

< ๋ฐ์ดํ„ฐ์‹œํŠธ ์ฐธ๊ณ ํ•ด SPIํ†ต์‹ ๊ณผ UARTํ†ต์‹  ์„ค์ •>

 

1. SPI ์„ค์ •

SPIํ†ต์‹ ์— ํ•„์š”ํ•œ ๋„ค ๊ฐœ์˜ ํ•€ ํ™•์ธ

 

 

์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , GPIOํ•€์„ ์กฐ์ž‘ํ•ด ์ง์ ‘ SPI ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

SCK, MOSI, MISO, NSS ํ•€์„ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์กฐ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

 

- SPI_MasterInit() : ํ•€ ์„ค์ •

 

SCK, MOSI, NSS๋ฅผ Output์œผ๋กœ์„ค์ •ํ•˜๊ณ  MISOํ•€๋งŒ Input์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

(๋‚ด์žฅ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด SPI๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ฉด, SPCR |= (1<<SPE)|(1<<MSTR); ์ฒ˜๋Ÿผ SPI ํ™œ์„ฑํ™” ๋ฐ ๋งˆ์Šคํ„ฐ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

void SPI_MasterInit(void)  // GPIO
{
	// InOut Pin set
	DDRB |= (1<<SCK)|(1<<MOSI)|(1<<NSS);
	DDRB &= ~(1<<MISO); 
}

 

 

- SCK ํ•€์„ 1, 0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ์œ„ํ•œ ๋งคํฌ๋กœ ๊ตฌํ˜„

#define SCK_1		PORTB |= 1<<PORTB5;
#define SCK_0		PORTB &= ~(1<<PORTB5);

 

 

- SPI_Write() : addr ์ฃผ์†Œ์— data ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ ๊ตฌํ˜„

void SPI_WRITE(u8 addr, u8 data)
{
	u8 tmp;
	u8 mask = 0x80;  
    // MSB๋ฅผ ์ฒดํฌํ•˜๋ฉฐ 1,0๊ฐ’์„ ํ•€์— ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค
    // ์™ผ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”
	addr = (addr<<1)&0x7F;

	NSS_0  // SPI ํ†ต์‹  ์‹œ์ž‘ - SCKํ•€์— ๋”ฐ๋ผ์„œ ๋™์ž‘ ์ง„ํ–‰
    
    // SCK ํ•€์„ ์˜ฌ๋ ธ๋‹ค ๋‚ด๋ ธ๋‹ค 8๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉฐ MOSI ํ•€์˜ addr ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋œ๋‹ค
	for (u8 i=0;i<8;i++)
	{
		if (addr & mask) {
			MOSI_1
		}
		else MOSI_0
		addr = addr<<1;
		SCK_1
		SCK_0
	}

	for (u8 i=0;i<8;i++)
    // SCK ํ•€์„ ์˜ฌ๋ ธ๋‹ค ๋‚ด๋ ธ๋‹ค 8๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉฐ MOSI ํ•€์˜ data ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋œ๋‹ค
	{
		if (data & mask) {
			MOSI_1
		}
		else MOSI_0
		data = data<<1;
		SCK_1
		SCK_0
	}
    NSS_1

}

 

 

- SPI_READ()

u8 TRH_READ(u8 addr)
{
	u8 tmp;
    // MSB๋ฅผ ์ฒดํฌํ•˜๋ฉฐ 1, 0๊ฐ’์„ ํ•€์— ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค
    // ์™ผ์ชฝ์œผ๋กœ ์‰ฌํ”„ํŠธํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”
	u8 mask = 0x80;
	unsigned char result = 0;
	addr = (addr<<1)|0x80;

	NSS_0  // SPI ํ†ต์‹  ์‹œ์ž‘ - SCKํ•€์— ๋”ฐ๋ผ์„œ ๋™์ž‘ ์ง„ํ–‰
	for (u8 i=0;i<8;i++)
	{
		if (addr & mask) {
			MOSI_1
		}
		else {
			MOSI_0
		}
		addr = addr<<1;
		SCK_1
		SCK_0
	}
	
	for (u8 i=0;i<8;i++)
	{
		// ํ•€์— ์ž…๋ ฅ๋ ๋•Œ, result LSB += 1
		if(PINB & (0x10)) {  // INPUT = PIN!
			result += 0x01;
		}
		SCK_1
		SCK_0
		if (i != 7) result <<= 1;;
	}
	NSS_1
    
	return result;
}

 

 

 

2. UART ์„ค์ •

UART๋Š” ๋ฐ์ดํ„ฐ์‹œํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ด€๋ จ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

- UBRRH (0x20) : Baud Rate ์„ค์ • ๋ ˆ์ง€์Šคํ„ฐ

 

์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ์†๋„๋ฅผ ๋งคํฌ๋กœ๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

 

 

- USART_Init() : ํ†ต์‹  ์†๋„ ์„ค์ •

 

์ดˆ๊ธฐํ™”ํ• ๋•Œ ์„ค์ •ํ•œ MYUBRR์„ ๋งค๊ฐœ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.     -> USART_Init(MYUBRR);

void USART_Init(unsigned long baud)
{
	UBRRH = (unsigned char)(baud>>8);
	UBRRL = (unsigned char)baud;

	/* Enable receiver and transmitter */
	UCSRB = (1<<RXEN)|(1<<TXEN);
	/* Set frame format: 8data, 2stop bit */
	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);	
}

 

- USART_Transmit() :

UCSRA๋ผ๋Š” Status ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด UDR ๋ฒ„ํผ๊ฐ€ ์ œ๋Œ€๋กœ ๋น„์›Œ์ง€๊ณ  ์ฑ„์›Œ์กŒ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void USART_Transmit( unsigned char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSRA & (1<<UDRE)) )
	/* Put data into buffer, sends the data */
	UDR = data;
}