ATmega328을 활용하여 i2c통신을 해보려고 한다. 이후 i2c통신을 활용하여 mpu6050 모듈에 who am i를 통해 통신이 제대로 되는지까지 확인해 보도록 하겠다.
I2C통신 인터페이스 신호
i2c통신은 두 개의 신호선(SDA, SCL)을 통해 다수의 I2C통신을 지원하는 모듈들과 데이터를 주고받을 수 있게 하는 통신 방식이다. 신호선이 SDA(data), SCL(clock)으로 2개의 신호선으로 통신을 할 수 있다는 장점이 있다.
해석해 보자면 twi는 마이크로컨트롤러에 적합한 통신이다. twi는 128개에 다른 장치와 두 개의 선(SDA, SCL)을 갖고 통신을 할 수 있다. 각각 버스 라인에 풀업 저항을 달아 줘야 한다. 각 모듈은 개인의 고유주소를 갖고 있다.
즉 한마디로 모듈이 갖고 있는 고유의 주소와 두 개의 선을 통해 통신을 한다라고 해석된다. 또한 풀업 저항을 달아줘야 한다고 하는데 풀업 저항이 없으면 크게 3가지 문제가 발생한다.
- 라인 상태 불안정 : SDA, SCL이 high상태를 유지하지 못해 신호의 안정성이 낮음
- 데이터 불안정 : 신호의 상승 및 하강 에지 시간이 일정하지 않아 데이터가 불안정
- 노이즈에 약함 : 전기적 노이즈에 매우 취약해져 통신 오류가 발생
다음과 같은 이유로 풀업 저항을 생각해줘야 한다.
버스에 연결되는 모듈들은 400pf 버스 용량과 7bit 슬레이브 주소로 제한된다. 더 자세한 twi 자료들은 317page에서 확인해 보면 된다. 전송모드는 standard, fast mode 등등이 있다.
전송모드는 standard, fast mode... 등 모드에 따라 최대속도, Rsie Time이 각 다르고 신호선이 연결된 버스의 전체 커패시턴스 (용량)이 400pF 이내로 제한되어 실질적인 전송거리가 수 m이내이다. 즉 i2c 통신은 속도보다는 여러 개의 모듈들을 통신하는 것이 목적이니 알맞은 전송모드와 그에 따른 모듈개수를 선택하는 것이 중요하다.
데이터 및 프레임 형식
twi버스에서 송신되는 각각의 bit들은 클럭 와 펄스로서 동반된다. 클럭(SCL)이 high일 때 데이터(SDA)는 유지되어야 한다. start, stop 상태가 발생할 때에는 이러한 규칙에서 예외 된다.
i2c통신은 동기 방식 통신으로 SCL신호에 따라 데이터를 주고받을 수 있다. SCL이 low일 때는 data change, high일 때는 data stable 상태이다. 즉 hihg일 때 SDA를 통해 데이터를 주고받는 샘플링 작업을 진행하고 low일 때 데이터 전이가 일어난다는 말이다. 하지만 예외적으로 start, stop bit에서는 SCL신호가 high일지라도 데이터 전이가 발생할 수 있다는 의미로 해석하면 된다.
다음과 같이 start, stop 신호는 SCL이 high 상태에서 SDA 신호가 바뀌는 것을 볼 수 있다.
즉 무슨 말이냐면 SCL이 high인 상태에서 SDA 1->0이면 start SDA 0->1이면 stop이라고 통신 규칙?을 정한 거라고 이해하면 될듯하다.
- start 신호를 보낸다.
- slave(모듈)의 주소를 보낸다.
- 값을 wirte 할 것인지 read 할 것인지 보낸다.(wirte = 0, read = 1)
- ACK 신호를 받아 수신을 확인한다.
- 보내고 싶은 데이터를 8bit 보낸다.
- ACK 신호를 받아 수신을 확인한다.
- 데이터를 다 보냈으면 stop신호를 보내 통신을 종료한다.
이다 쉽게 보면 데이터를 보내고 싶은 모듈을 지정한 후 데이터를 계속 보내거나 받고 통신을 종료한다!라고 생각하면 된다.
예를 들어 mpu6050 모듈과 통신을 하고 싶다고 하면 0x68(mpu6050 address)와 R/W를 보내고 모듈로부터 원하는 데이터를 쓰거나 읽으면 된다로 짧게 해석할 수 있다.
위에서 설명한 내용과 비교해 보자면 SCL이 high일 때 신호를 샘플링하고 있고.. 정해진 프로토콜로 통신을 하고 있는 것을 확인할 수 있다. 또한 중간에 SLA+R/W라고 쓰여있는 걸 볼 수 있는데 이는 7bit address + 1bit R/W라고 해석하면 된다.
다음은 twi 데이터 송신 인터페이스다. 위 정리 내용들과 많이 비슷한 내용들인데 twi 이는 이게 제일 중요하다고 생각? 해서 데이터시트에서 갖고 왔다. 데이터시트를 보면 좀 더 자세하게 볼 수 있으니 궁금하면 확인해 보면 된다.
여기서 처음 등장하는 TWI 레지스터들이 있으니 이것 먼저 이해하면 위 그림을 좀 더 쉽게 이해할 수 있을 것이다. 일단 크게 그림을 훑어보고 레지스터를 학습한 뒤 다시 돌아와 정리해 보겠다.
i2c 통신 레지스터 정리
첫 번째로 TWBR이다. TWI 전송속도를 설정하는 레지스터로 쉽게 말해 SCL신호 클럭을 맞춰주는 역할을 한다고 보면 된다. 위에 전송 모드에 따라 클럭이 달라진다고 설명했는데 연장선으로 생각하면 된다. 추가적으로 TWBR은 TWSR(TWPS1, TWPS0)과 다음과 같은 식으로 SCL 주파수 값을 구할 수 있다. TWSR레지스터에서 TWS3~TWS7은 나중에 한번 살펴보도록 하겠다. 짧게 말하면 에러 관련 처리 레지스터이다.
다음으로 TWCR이다. 이 레지스터는 twi를 컨트롤하는 레지스터로 제일 중요한 레지스터이니 하나하나 설명하겠다.
TWINT -> TWI 인터럽트 플래그로 TWI의 현재 작업이 완료되고 응용 소프트웨어의 응답을 기다릴 때 하드웨어에 의해 세트 된다. 또한 인터럽트 루틴을 활성화하면 TWINT 비트가 세트 될 때 인터럽트 서비스 루틴까지 실행이 가능하다.
TWEA -> ACK 펄스의 생성을 제어한다.(안써봐서 잘 모르겠다 공부해야 함)
TWSTA -> 마스터에서 전송을 시작하기 위해 세트 해야 하는 비트이다.
TWSTO -> 마스터에서 전송을 끝내기 위해 세트해야하는 비트이다.
TWWC -> 잘 모름.. 공부해야 함
TWEN -> TWI허용비트로 TWI를 활성화시킨다고 보면 된다.
TWIE -> 인터럽트 허용 비트로 전송이 완료된 경우 인터럽트 발생을 허용하는 비트이다. (나중에 요기 나게 써먹을 수 있을듯하다.)
다음은 TWDR이다 누가 봐도 데이터선이지 않은가? SDA에서 송수신하는 데이터(주소 데이터 포함)를 처리하는 것을 담당한다.
TWAR, TWAMR도 있는데 안 써봐서 모르겠다... 다음에 사용할 일이 있으면 데이터시트를 참고해 봐야겠다.
'AVR 임베디드 학습 > AVR 이론 공부' 카테고리의 다른 글
ATmega328 i2c통신 학습하기(feat.mpu6050)(4탄) (0) | 2024.11.03 |
---|---|
ATmega328 i2c통신 학습하기(feat.mpu6050)(3탄) (0) | 2024.10.13 |
ATmega328 i2c통신 학습하기(feat.mpu6050)(2탄) (3) | 2024.10.10 |