BASIC4MCU | 질문게시판 | ATmega128에서 TWI(I2C)에 대한 코딩 질문입니다!!
페이지 정보
작성자 질문Y 작성일2019-01-15 20:13 조회13,987회 댓글2건본문
제 목표는 ATmega128을 통해 연결된 MPU-9250에 내장된 0x75번지를 건들여서 0x71(whoami) return 값을 uart통신 창에 출력해 내는게 목표입니다.
코드는 다음과 같습니다.
#define F_CPU 16000000UL
#include <avr/io.h>
void usart0_init(void)
{
UCSR0A = 0x00;
UCSR0B = (1<<TXEN0) | (1<<RXEN0);
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
UBRR0H = 0x00;
UBRR0L = 0x08; // 16MHz, 115200bps
}
void put_usart0(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
void twi_init(void)
{
TWBR = 12; // 16MHz, 400kbps
TWCR = (1<<TWEN); // TWI Enable
TWSR = 0x00;
}
void twi_master_write(unsigned char dev_addr, unsigned char reg_addr)
{
TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN)); // START 조건
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x08)); // START 전송 완료
TWDR = dev_addr<<1; // MPU-9250 device address, write
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x18)); // 전송 완료 및 ACK 확인
TWDR = reg_addr; // MPU-9250 register address
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x28)); // 전송 완료 및 ACK 확인
}
unsigned char twi_master_read(unsigned char dev_addr)
{
unsigned char data;
TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN)); // REPEATED START
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x10)); // REPEATED START 전송 완료
TWDR = ((dev_addr<<1) | 0x01); // MPU-9250 device address, read
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x40)); // 전송 완료 및 ACK 확인
TWCR = (1<<TWINT) | (1<<TWEN);
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x58)); // 데이터 수신, NACK return
data = TWDR;
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); // STOP 조건
return data; // 0x71
}
int main(void)
{
unsigned char val;
usart0_init();
twi_init();
while(1)
{
twi_master_write(0x68,0x75);
val = twi_master_read(0x68);
put_usart0(val);
}
}
twi_master_write함수에서 보면
while(((TWCR & (1<<TWINT))==0x00) || ((TWSR & 0xf8)!=0x18));
디버깅 모드로 한 줄씩 넘어갈 때 위 코드에서 계속 무한루프에 빠집니다... 이유를 모르겠습니다.
그리고 디버깅 모드로 넘어갈 때 START 조건이 넘어가면 TWSR인 상태레지스터가 변화해서 첫번째 while은 넘어가는데
그 다음부터 TWSR이 바뀌지 않고 while에서 걸려버리네요...
mpu-9250 twi 루틴을 따르고 번지도 제대로 입력했는데 뭐가 문제인지 알려주시면 정말 감사하겠습니다. ㅠㅠㅠ
mpu-9250의 twi 루틴과, register map을 첨부하겠습니다.
댓글 2
조회수 13,987master님의 댓글
master 작성일
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo13&wr_id=13
6050 예제인데요
이 글의 함수와 비교해보세요
master님의 댓글
master 작성일
통신은 쉽지 않습니다.
오실로스코프로 파형을 체크하면서 디버깅하면 수월합니다.