뻔뻔한avr 프로그래밍 - read.pudn.comread.pudn.com/downloads157/doc/comm/699258/atmega... ·...
Post on 31-Aug-2018
234 Views
Preview:
TRANSCRIPT
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 속도대역!
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
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
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) 관련 레지스터 분석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;}
top related