질문게시판 > ATmega128에서 TWI(I2C)에 대한 코딩 질문입니다!!

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

ATmega128에서 TWI(I2C)에 대한 코딩 질문입니다!!

페이지 정보

작성자 질문Y 작성일19-01-15 20:13 조회8,824회 댓글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을 첨부하겠습니다.

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 2

조회수 : 8,824

master님의 댓글

master 작성일

통신은 쉽지 않습니다.
오실로스코프로 파형을 체크하면서 디버깅하면 수월합니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 아두이노 센서 쉴드 v5.0 과 음성인식 모듈(V2)통… 첨부파일AutoSun 새글 22-07-05
질문 초음파 센서를 사용한 dc모터 제어에 관해 질문 있습니… 첨부파일뉴비에오 새글 22-07-04
답변 답변 : 초음파 센서를 사용한 dc모터 제어에 관해 질… 댓글[2] master 새글 22-07-05
질문 아두이노 Sensor Shield 5.0 시리얼 통신 … 댓글[2] AutoSun 새글 22-07-04
질문 Atmega 코드 좀 봐주세요. 댓글[1] 첨부파일chelsea 새글 22-07-04
질문 아두이노 while문 탈출 질문 yhj2644  22-07-01
답변 답변 : 아두이노 while문 탈출 질문 댓글[8] master  22-07-01
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의… 댓글[3] cansad  22-06-30
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의 댓글[3] cansad  22-06-30
질문 빵판없이 디스플레이 넣을 수 있을까요? 댓글[2] 첨부파일오소로롯  22-06-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum  22-06-26
질문 음전압 ADC 댓글[2] 412904  22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전