I2C 통신은 serial 통신의 하나로 장점은 하나의 장치로 여러대와 통신이 발생한다는것입니다.
하지만 단점으로는 속도 이슈가 발생 할 수 있습니다.
통신이 안되는 경우가 발생할수 있어 저항으로 조절을 하게 됩니다.
SDA는 1bit 단위로 Data를 송수신합니다.
SCL은 동기화 CLCOK입니다. ( data에 clock을 알려줌)


Atmega128 Datasheet USART에 따르면
1~7까지는 Device주소, 8은 Read/Write 9는 ACK로 device로 송신, Master에서 수신을 한다.
따라서 I2C 통신을 사용하기 위해 DDRD에 연결을 하고 사용할 예정입니다.
#ifndef I2C_H_
#define I2C_H_
#define I2C_DDR DDRD
#define I2C_SCL 0
#define I2C_SDA 1
void I2C_init();
void I2C_txByte(uint8_t SLA_W, uint8_t data);
void I2C_start();
void I2C_txDevAddr(uint8_t SLA_W);
void I2C_txData(uint8_t data);
void I2C_stop();
#endif /* I2C_H_ */
코드들은 제조사에서 제공하고있는 부분들이 있습니다.
우리가 설정해줄 부분은 I2C_init (초기화)
I2C_txByte(데이터를 사용)입니다.
#include "I2C.h"
void I2C_init()
{
I2C_DDR |= (1<<I2C_SCL) | (1<<I2C_SDA);
TWBR = 72; // 100khz SCL
//TWBR = 32; // 200khz SCL
//TWBR = 12; // 400khz SCL
TWSR = 0;
}
void I2C_txByte(uint8_t SLA_W, uint8_t data)
{
I2C_start();
//(device(7비트) 주소 + write(송신) bit)1byte 데이터 송신 + ack
I2C_txDevAddr(SLA_W); //tx = 송신
//데이터 송신 + ack
I2C_txData(data);
// 데이터 송신
I2C_stop();
// stop 신호 송신
}
void I2C_start()
{
//Send START condition
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
//Wait for TWINT flag set. This indicates that the START condition has been transmitted
while (!(TWCR & (1<<TWINT)));
}
void I2C_txDevAddr(uint8_t SLA_W)
{
//Load SLA_W into TWDR Register.
TWDR = SLA_W;
//Clear TWINT bit in TWCR to start transmission of address
TWCR = (1<<TWINT) | (1<<TWEN);
//Wait for TWINT flag set.
//This indicates that the SLA+W has been transmitted, and ACK/NACK has been received.
while (!(TWCR & (1<<TWINT)));
}
void I2C_txData(uint8_t data)
{ //Load DATA into TWDR Register.
TWDR = data;
//Clear TWINT bit in TWCR to start transmission of data
TWCR = (1<<TWINT)|(1<<TWEN);
//Wait for TWINT flag set. This indicates that the
//DATA has been transmitted, and ACK/NACK has been received.
while (!(TWCR & (1<<TWINT)));
}
void I2C_stop()
{
//Transmit STOP condition
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
제조사에서 제공한 코드를 사용하였습니다.




다음내용은 다음에
'나의 전자 공부방 > Atmega128a' 카테고리의 다른 글
| 1. Atmega128a 첫 사용기 (GPIO 설정) (0) | 2023.03.13 |
|---|