31
뻔뻔한 AVR 프로그래밍 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture The Last(8 ) Lecture 유명환 ( [email protected])

뻔뻔한AVR 프로그래밍 - read.pudn.comread.pudn.com/downloads157/doc/comm/699258/Atmega... · 1 II2CC 통신통신이야기이야기 I2C Inter IC Bus 3어떤IC들간에도공통적으로통할수있는

Embed Size (px)

Citation preview

뻔뻔한 AVR 프로그래밍뻔뻔한 AVR 프로그래밍The Last(8th) LectureThe Last(8 ) Lecture

유 명 환 ( [email protected])

INDEX

I2C 통신 이야기1

ATmega128 TWI(I2C) 구조 분석2

ATmega128 TWI(I2C) 관련 레지스터 분석3

ATmega128 TWI(I2C) 실습 : AT24C164

I2C 통신 이야기1 I C 통신 이야기1

I2C Inter IC Bus어떤 IC들 간에도 공통적으로 통할 수 있는

ex) Internetworks

(2 가닥 선으로 연결된) 버스

--> 확장성이 좋다!

I2C USB IEE

USB 2.0 USB 3.0

EE 1394Master & Slave 구조 Master & Slave 구조채택

통신속도개선 10M 속도대역!Master & Slave 구조개선 USB OTG 모드통신속도개선 최대 480Mbps

Master & Slave 구조혁신 Master 와 Slave 로구분하지않음!통신속도개선 100M 속도대역!

I2C 통신 이야기1 I C 통신 이야기1

USB 3.0

ATmega128 TWI(I2C) 구조 분석2 ATmega128 TWI(I C) 구조 분석2

Slave Slave Slave Slave

Vcc

SlaveDevice 1

Slave Device 2

Slave Device 3

Slave Device n

……R1 R2

MasterDevice

SDASCL

디바이스(Device) : 주로 내부에 메모리를 포함한 IC

디바이스들 구별은 어떻게?? -> Device Address 필요!

ATmega128 TWI(I2C) 구조 분석2 ATmega128 TWI(I C) 구조 분석2

ATmega128 TWIDevice Address : 7-bit 지원속도 : 100KHz, 400KHz

ATmega128 TWI(I2C) 구조 분석2 ATmega128 TWI(I C) 구조 분석2

ATmega128 TWI(I2C) 구조 분석2 ATmega128 TWI(I C) 구조 분석2

Address PacketSTA STPTWIframe

format

Data Packet

1 2 3 4 5 6 7 8 9

Address W/R ack

1 2 3 4 5 6 7 8 9

Data ack

MSB LSB MSB LSB

format

ATmega128 TWI(I2C) 구조 분석2 ATmega128 TWI(I C) 구조 분석2

Start signal Stop signal

t t조건완료체크데이터전송완료체크(Option: ACK 신호수신)

start 조건완료체크

address 전송

data 전송주소전송완료체크(Option: ACK 신호수신)

start address R/W ACK Data ACK stop

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

TWBR :TWBR : TWI Bit Rate RegisterRegister 설명 실제 구현 예

TWBR Bit 7 0 TWI Bit R t R i t TWBR (CPU CLOCK / TWI FREQ 16) / 2TWBR : TWI Bit Rate Register

•Bits 7..0 – TWI Bit Rate Register–전송속도설정레지스터–전송속도계산식

TWBR = (CPU_CLOCK / TWI_FREQ - 16) / 2;

// CPU_CLOCK : 16000000// TWI_FREQ : 400000

encyClockfrequCPU // 4TWPS : ??TWPS4 2(TWBR)16

⋅+

=encyClockfrequCPUfrequencySCL

SC f (둘중하나)SCL frequency : 100KHz or 400KHz (둘중하나)

CPU frequency : 16MHz (DK128의경우)

4TWPS : 계산식을간단하게만들려면??

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

TWCR : TWI Control RegisterRegister 설명 실제 구현 예

Bit 7 – •소프트웨어에의해서반드시 “1” 값으로설정(set) TWCR = (1<<TWINT) | (1<<TWEN);TWINT:TWI Interrupt Flag

•현재작업이끝나면하드웨어에의해자동적으로클리어(Clear)됨 주의: “1” 값으로 clearAVR Core와연결되는입출력라인이다르다?!

• TWI 작업을위해초기에반드시 “1”로설정되어야함

while ( !( TWCR & (1 << TWINT) ) );

Bit 5 –TWSTA: TWI START Condition Bit

• TWI버스가사용되고있지않으면(not busy 상태)START 조건을만들수있음

• TWI 버스가현재사용중이라면(busy 상태)STOP조건이될때까지기다림

TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

while ( !( TWCR & (1 << TWINT) ) );

STOP 조건이될때까지기다림Polling 으로 START 상태를확인해야함!

Bit 4 –TWSTO: TWI STOP

• TWI 버스사용이끝나면다른 Device들을위해STOP 조건을만들어 TWI 버스에전송

TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);

TWI STOP Condition Bit

• START 조건처럼확인할필요는없음!

Bit 2 –TWEN:

•TWI 활성화비트 TWCR = (1 << TWINT) | (1 << TWSTO) |(1 << TWEN);

TWI Enable Bit

(1 << TWEN);TWCR = (1 << TWINT) | (1 << TWEN);

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

ATmega128ATmega128

AVR Core TWIWRITE

TWINTex4_7_1.hex(firmware)

NOT gate

WRITE

TWCRREAD

System Bus

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

TWSR : TWI Status RegisterRegister 설명 실제 구현 예

TWSR : • TWPS1,0 : TWI 속도(Hz)를계산하기위해필요한 TWSR = (0 << TWPS1) | (0 << TWPS0);

TWI Status Register

Prescaler값을설정하는비트

TWPS1 TWPS0 Prescaler Value ( )

0 0 1

0 1 4

TWPS4

1 0 16

1 1 64

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

TWDR : TWI Data RegisterRegister 설명 실제 구현 예

TWDR : •송수신데이터를담기위한레지스터 버퍼(buffer) TWDR = byte; // Write

TWI Data Register

byte = TWDR; // Read

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3Start signal Stop signal

데이터전송완료체크(Option: ACK 신호수신)

start 조건완료체크

address 전송

data 전송주소전송완료체크(Option: ACK 신호수신)

start Slave Address W ACK Data ACK stop

TWCR

TWDR

초기화TWINT설정

TWINT클리어

TWINT설정

TWINT클리어

TWINT설정

STOP조건

주소입력

데이터입력

TWINT 상태값을 Polling 루틴(while 문)으로확인하는부분

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3Start signal

start Slave Address W ACK Data ACK stop

①TWCR 초기화

start 조건을내보내기위해서 TWCR을초기화실제구현예) TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

start 조건완료체크

start Slave Address W ACK Data ACK stop

②TWCR TWINT

설정

START조건이 TWI 버스에제대로전송되었는지확인하는부분실제구현예) while (!(TWCR & (1<<TWINT)));

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

address 전송

start Slave Address W ACK Data ACK stop

③TWCR

TWDR

TWINT클리어

주소입력

Slave Device의 (Device) 주소를 TWDR에입력

TWINT를다시소프트웨어적으로클리어(clear)하기위하여 TWINT 값을 “1”로설정실제구현예) TWDR = SLA_W;

TWCR = (1<<TWINT) |(1<<TWEN);

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

start Slave Address W ACK Data ACK stop

주소전송완료체크

TWCR TWINT설정

Slave Device주소전송완료 하드웨어에의해자동적으로 TWINT가 “1”로설정됨실제구현예) while (!(TWCR & (1<<TWINT)));

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

data 전송

start Slave Address W ACK Data ACK stop

⑤TWCR

TWDR

TWINT클리어

데이터입력

실제전송(write)할데이터를 TWDR에입력

TWINT를다시소프트웨어적으로클리어(clear)하기위하여 TWINT 값을 “1”로설정실제구현예)실제구현예) TWDR = DATA;

TWCR = (1<<TWINT) | (1<<TWEN);

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

데이터전송완료체크

start Slave Address W ACK Data ACK stop

TWCR TWINT설정

데이터전송완료 하드웨어에의해자동적으로 TWINT가 “1”로설정됨실제구현예) while (!(TWCR & (1<<TWINT)));

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

Stop signal

start Slave Address W ACK Data ACK stop

TWCR STOP조건

STOP조건을전송하기위해 TWCR을설정실제구현예) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

ATmega128 TWI(I2C) 관련 레지스터 분석3 ATmega128 TWI(I C) 관련 레지스터 분석3

번호 C 예제 코드 설명

1 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) Start 조건을내보낸다.

2 while (!(TWCR & (1<<TWINT)));TWINT가 1로설정되기를기다린다. 여기서는 START 조건이완료된것을의미한다.

3TWDR = SLA_W;TWCR = (1<<TWINT) |(1<<TWEN);

TWDR 레지스터에 Slave Address를써넣는다. TWCR 레지스터는 TWINT를클리어시키기위해서새로써넣는다.

4 while (!(TWCR & (1<<TWINT)));TWINT가 1로설정되기를기다린다. 여기서는 Slave Address전송이완료된것을의미한다.

5TWDR = DATA;TWCR = (1<<TWINT) | (1<<TWEN);

TWDR에실제로보낼데이터를써넣는다. TWCR 레지스터는 TWINT를클리어시키기위해서새로써넣는다.

TWINT가 1로설정되기를기다린다6 while (!(TWCR & (1<<TWINT)));

TWINT가 1로설정되기를기다린다. 여기서는데이터전송이완료된것을의미한다.

7 TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); STOP 조건을만들어준다.

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

SCLATmega128 AT24C16

SDA

2-Wire Serial EEPROM

AT24C01AT24C02

1K (128 x 8)2K (256 x 8)AT24C02

AT24C04AT24C08

2K (256 x 8)4K (512 x 8)8K (1024 x 8)AT24C08

AT24C168K (1024 x 8)16K (2048 x 8)

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

마지막 주소에 저장된 데이터

2KB EEPROM

111 1111 1111 마지막 주소에 저장된 데이터

……111 1111 1111

네 번째 주소에 저장된 데이터 211……

두 번째 주소에 저장된 데이터

세 번째 주소에 저장된 데이터

첫 번째 주소에 저장된 데이터

두 번째 주소에 저장된 데이터

000 0000 0000

8 bit

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

Word address로해당번지식별data 영역에서나타냄2048*8(2KB)이므로 11bit의주소표현비트필요

AT24C16

access위치access위치

ATmega128(Master)

SDASCL

Device address로해당 device 식별address 영역(address packet)에서나타냄

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

Address PacketStart Data Packet Stop

1 2 3 4 5 6 7 8 9

Address W/R ack

1 2 3 4 5 6 7 8 9

Data ack

1 0 1 0 P2 P1 P0 R/W

AT24C16

1 0 1 0 1 1 0 1

AT24C16(Device address)

Word address

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

Byte Write

void twi_write_byte(unsigned int addr, unsigned char byte){

twi start();_ ();

twi_send_byte(0xA0 | ((addr >> 7) & 0x000E));twi_send_byte(addr & 0x00FF);

twi send byte(byte);twi_send_byte(byte);

twi_stop();

delay(10);}

ATmega128 TWI(I2C) 실습 : AT24C164 ATmega128 TWI(I C) 실습 : AT24C164

Random Read

unsigned char twi_read_byte(unsigned int addr){

unsigned char byte;

twi_start();

twi_send_byte(0xA0 | ((addr >> 7) & 0x000E));twi_send_byte(addr & 0x00FF);

twi_start();

twi_send_byte(0xA0 | ((addr >> 7) & 0x000E) | 0x0001);

byte = twi_read();twi_stop();

return byte;}