Atmega8A ์นฉ์ ์ฌ์ฉํด UART, SPI ํต์ ์ ๊ตฌํํ ๊ฒ์ ๋๋ค.
Atmega๋ฅผ Master์นฉ์ผ๋ก ์ค์ ํ๊ณ , GPIO ํ์ ํ์ฉํด ์ฐ๊ฒฐ๋ Slave์นฉ๋ค์ ํ๋ค๊น์ง ์ปจํธ๋กค ํ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ ์ฉํ ์ ์๋์ด ์ ๋ ์๋ ์์ต๋๋ค,,!
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ์ํธ์์ ๊ธฐ์ด ํต์ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ฝ๋์ C์ฝ๋๋ก ๊ฐ๋ตํ๊ฒ ๊ธฐ์ ๋์ด ์์ต๋๋ค. ์ ๋ ๊ทธ ์ฝ๋๋ฅผ ์ผ๋ถ ์ฐธ๊ณ ํด์ ์์ฑํ์ผ๋, ์ฌ๋งํ๋ฉด ๋ฐ์ดํฐ์ํธ๋ฅผ ๋จผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์ :>
< ๋ฐ์ดํฐ์ํธ ์ฐธ๊ณ ํด SPIํต์ ๊ณผ UARTํต์ ์ค์ >
1. SPI ์ค์

์ต์ํ์ ๊ธฐ๋ฅ์ผ๋ก ๋์ํ๊ธฐ ์ํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , GPIOํ์ ์กฐ์ํด ์ง์ SPI ๊ตฌํํ ๊ฒ์ ๋๋ค.

- 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;
}
'F๐ปW > Coding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| c์ธ์ด uint8_t 16์ง์ ๋ณ์ 10์ง์ ์๋ฆฌ์ผ ์ถ๋ ฅ ๋ฐฉ๋ฒ (0) | 2024.01.12 |
|---|---|
| STM32 ๊ฐ๋ฐ ์, delay ํจ์ ์ง์ ๊ตฌํํด์ ์ฌ์ฉํด๋ณด์ ! (0) | 2023.12.06 |
| ATMEGA UART ์ถ๋ ฅ (0) | 2023.11.21 |
| gpio mode ์ฐธ๊ณ (0) | 2023.07.10 |
| Silicon Lab EFR32 ์ฝ๋ ๋ถ์ (0) | 2023.06.26 |
| [STM32F030C6T6] Bootloader ๊ตฌํ (0) | 2023.03.30 |