본문 바로가기
나의 전자 공부방/Atmega128a

8. Atmega128을 사용하여 I2C통신 하기

by 나만의생각 2023. 3. 31.

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