뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr)
INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16
1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex) Internetworks (2 가닥선으로연결된 ) 버스 --> 확장성이좋다! I 2 C USB USB 2.0 USB.0 Master & Slave 구조 Master & Slave 구조채택 통신속도개선 10M 속도대역! IEE EE 194 Master & Slave 구조개선 USB OTG 모드 통신속도개선 최대 480Mbps Master & Slave 구조혁신 Master 와 Slave 로구분하지않음! 통신속도개선 100M 속도대역!
USB.0 1 I 2 C 통신이야기
2 ATmega128 TWI(I 2 C) 구조분석 Vcc Slave Slave Slave Slave Device 1 Device 2 Device Device n R1 R2 Master Device SDA SCL 디바이스 (Device) : 주로내부에메모리를포함한 IC 디바이스들구별은어떻게?? -> Device Address 필요!
2 ATmega128 TWI(I 2 C) 구조분석 ATmega128 TWI Device Address : 7-bit 지원 속도 : 100KHz, 400KHz
2 ATmega128 TWI(I 2 C) 구조분석
2 ATmega128 TWI(I 2 C) 구조분석 TWI frame format STA Address Packet 1 2 4 5 6 7 8 9 Data Packet 1 2 4 5 6 7 8 9 STP Address W/R ack Data ack MSB LSB MSB LSB
2 ATmega128 TWI(I 2 C) 구조분석 Start signal Stop signal start t 조건완료체크 데이터전송완료체크 (Option: ACK 신호수신 ) address 전송 주소전송완료체크 (Option: ACK 신호수신 ) data 전송 start address R/W ACK Data ACK stop
TWBR : TWI Bit Rate Register Register 설명실제구현예 TWBR : Bits 7..0 TWI Bit Rate Register TWBR = (CPU_CLOCK CLOCK / TWI_FREQ - 16) / 2; TWI Bit Rate Register 전송속도설정레지스터 전송속도계산식 // CPU_CLOCK : 16000000 // TWI_FREQ : 400000 CPU Clockfrequency // 4 TWPS :?? SCL frequency = TWPS 16 + 2(TWBR) 4 SCL frequency : 100KHz or 400KHz ( 둘중하나 ) CPU frequency : 16MHz (DK128의경우) 4 TWPS : 계산식을간단하게만들려면??
TWCR : TWI Control Register Register 설명실제구현예 Bit 7 소프트웨어에의해서반드시 1 값으로설정 (set) TWCR = (1<<TWINT) (1<<TWEN); TWINT: 현재작업이끝나면하드웨어에의해자동적으로 while (!( TWCR & (1 << TWINT) ) ); TWI 클리어 (Clear) 됨 주의 : 1 값으로 clear Interrupt AVR Core와연결되는입출력라인이다르다?! Flag TWI 작업을위해초기에반드시 1 로설정되어야함 Bit 5 TWSTA: TWI START Condition Bit Bit 4 TWSTO: TWI STOP Condition Bit TWI버스가사용되고있지않으면 (not busy 상태 ) START 조건을만들수있음 TWI 버스가현재사용중이라면 (busy 상태 ) STOP 조건이될때까지기다림 Polling 으로 START 상태를확인해야함! TWI 버스사용이끝나면다른 Device들을위해 STOP 조건을만들어 TWI 버스에전송 START 조건처럼확인할필요는없음! TWCR = (1 << TWINT) (1 << TWSTA) (1 << TWEN); while (!( TWCR & (1 << TWINT) ) ); TWCR = (1 << TWINT) (1 << TWSTO) (1 << TWEN); Bit 2 TWEN: TWI Enable Bit TWI 활성화비트 TWCR = (1 << TWINT) (1 << TWSTO) (1 << TWEN); TWCR = (1 << TWINT) (1 << TWEN);
ATmega128 AVR Core ex4_7_1.hex (firmware) WRITE READ TWINT TWI NOT gate TWCR System Bus
TWSR : TWI Status Register Register 설명실제구현예 TWSR : TWPS1,0 : TWI 속도 (Hz) 를계산하기위해필요한 TWSR = (0 << TWPS1) (0 << TWPS0); TWI Prescaler 값을설정하는비트 Status Register TWPS1 TWPS0 Prescaler Value TWPS ( 4 ) 0 0 1 0 1 4 1 0 16 1 1 64
TWDR : TWI Data Register Register 설명실제구현예 TWDR : 송수신데이터를담기위한레지스터 버퍼 (buffer) TWDR = byte; // Write TWI Data byte = TWDR; // Read Register
Start signal Stop signal start 조건완료체크 데이터전송완료체크 (Option: ACK 신호수신 ) address 전송 주소전송완료체크 (Option: ACK 신호수신 ) data 전송 start Slave Address W ACK Data ACK stop TWCR 초기화 TWINT 설정 TWINT 클리어 TWINT 설정 TWINT 클리어 TWINT 설정 STOP 조건 TWDR 주소입력 데이터입력 TWINT 상태값을 Polling 루틴 (while 문 ) 으로확인하는부분
Start signal start Slave Address W ACK Data ACK stop TWCR 1 초기화 start 조건을내보내기위해서 TWCR을초기화 실제구현예 ) TWCR = (1<<TWINT) (1<<TWSTA) (1<<TWEN);
start 조건완료체크 TWCR start Slave Address W ACK Data ACK stop 2 TWINT 설정 START 조건이 TWI 버스에제대로전송되었는지확인하는부분 실제구현예 ) while (!(TWCR & (1<<TWINT)));
address 전송 TWCR TWDR start Slave Address W ACK Data ACK stop TWINT 클리어 주소입력 Slave Device의 (Device) 주소를 TWDR에입력 TWINT를다시소프트웨어적으로클리어 (clear) 하기위하여 TWINT 값을 1 로설정 실제구현예 ) TWDR = SLA_W; TWCR = (1<<TWINT) (1<<TWEN);
주소전송완료체크 TWCR start Slave Address W ACK Data ACK stop 4 TWINT 설정 Slave Device 주소전송완료 하드웨어에의해자동적으로 TWINT가 1 로설정됨 실제구현예 ) while (!(TWCR & (1<<TWINT)));
data 전송 TWCR TWDR start Slave Address W ACK Data ACK stop 5 TWINT 클리어 데이터입력 실제전송 (write) 할데이터를 TWDR에입력 TWINT를다시소프트웨어적으로클리어 (clear) 하기위하여 TWINT 값을 1 로설정 실제구현예 ) TWDR = DATA; TWCR = (1<<TWINT) (1<<TWEN);
데이터전송완료체크 TWCR start Slave Address W ACK Data ACK stop 6 TWINT 설정 데이터전송완료 하드웨어에의해자동적으로 TWINT가 1 로설정됨 실제구현예 ) while (!(TWCR & (1<<TWINT)));
Stop signal TWCR start Slave Address W ACK Data ACK stop 7 STOP 조건 STOP조건을전송하기위해 TWCR을설정 실제구현예 ) TWCR = (1<<TWINT) (1<<TWEN) (1<<TWSTO);
번호 C 예제코드설명 1 TWCR = (1<<TWINT) (1<<TWSTA) (1<<TWEN) Start 조건을내보낸다. 2 while (!(TWCR & (1<<TWINT))); TWINT 가 1 로설정되기를기다린다. 여기서는 START 조건이완료된것을의미한다. TWDR = SLA_W; TWCR = (1<<TWINT) (1<<TWEN); TWDR 레지스터에 Slave Address 를써넣는다. TWCR 레지스터는 TWINT 를클리어시키기위해서새로써넣는다. 4 while (!(TWCR & (1<<TWINT))); TWINT 가 1 로설정되기를기다린다. 여기서는 Slave Address 전송이완료된것을의미한다. 5 TWDR = DATA; TWCR = (1<<TWINT) (1<<TWEN); TWDR 에실제로보낼데이터를써넣는다. TWCR 레지스터는 TWINT 를클리어시키기위해서새로써넣는다. 6 while (!(TWCR & (1<<TWINT))); TWINT 가 1 로설정되기를기다린다. 여기서는데이터전송이완료된것을의미한다. 7 TWCR = (1<<TWINT) (1<<TWEN) (1<<TWSTO); STOP 조건을만들어준다.
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 ATmega128 SCL SDA AT24C16 2-Wire Serial EEPROM AT24C01 AT24C02 AT24C04 AT24C08 AT24C16 1K (128 x 8) 2K (256 x 8) 4K (512 x 8) 8K (1024 x 8) 16K (2048 x 8)
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 2KB EEPROM 111 1111 1111 마지막주소에저장된데이터 네번째주소에저장된데이터 2 11 세번째주소에저장된데이터 두번째주소에저장된데이터 000 0000 0000 첫번째주소에저장된데이터 8 bit
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 Word address 로해당번지식별 data 영역에서나타냄 2048*8(2KB) 이므로 11bit 의주소표현비트필요 AT24C16 access 위치 ATmega128 (Master) SDA SCL Device address 로해당 device 식별 address 영역 (address packet) 에서나타냄
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 Start Address Packet Data Packet Stop 1 2 4 5 6 7 8 9 Address W/R ack 1 2 4 5 6 7 8 9 Data ack 1 0 1 0 P2 P1 P0 R/W 1 0 1 0 1 1 0 1 AT24C16 (Device address) Word address
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 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_stop(); } delay(10);
4 ATmega128 TWI(I 2 C) 실습 : AT24C16 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;