각 함수에 대한 설명은 스크롤을 아래로 내리시면 볼수있습니다.
void I2C_start(void)
{
I2C_DIR=SDIROUT;
sda(1);
scl(1);I2C_delay();
sda(0);I2C_delay();
}
void I2C_stop(void)
{
I2C_DIR=SDIROUT;
scl(1);I2C_delay();
sda(0);I2C_delay();
sda(0);I2C_delay();
sda(1);I2C_delay();
}
void init_ds1307(void){
I2C_start();
I2C_write(ADDRTC);
I2C_write(0x00);
I2C_write(0x00);
I2C_stop();
I2C_start();
I2C_write(ADDRTC);
I2C_write(0x00);
I2C_write(sec);
I2C_write(min);
I2C_write(hr);
I2C_write(dy);
I2C_write(dt);
I2C_write(mn);
I2C_write(yr);
I2C_write(0x10); // sqwe:enable 1Hz output
I2C_stop();
}
void writebyte(unsigned char addr, unsigned char data)
{
I2C_start();
I2C_write(ADDRTC);
I2C_DIR=SDIROUT;
I2C_write(addr);
I2C_write(data);
I2C_stop();
}
unsigned char readbyte(unsigned char addr)
{
unsigned char byte;
I2C_start();
I2C_write(ADDRTC);
I2C_write(addr);
I2C_start();
I2C_write(ADDRTC|1);
byte = I2C_read(NACK);
I2C_stop();
return byte;
}
unsigned char I2C_read(unsigned char b)
{
unsigned char data, i;
sda(1);I2C_delay();I2C_delay();I2C_delay();
scl(0);I2C_delay();I2C_delay();
for(i=1;i<=8;i++)
{
scl(1);I2C_delay();
I2C_DIR=SDIRIN;
data=data<<1;
data = data | ((I2C_IN>>1)&0x01);
I2C_DIR=SDIROUT;
scl(0);I2C_delay();
}
sda(b);I2C_delay();
scl(0);I2C_delay();
scl(1);I2C_delay();
if(b==NACK)
sda(1);I2C_delay();
scl(0);I2C_delay();
sda(1);I2C_delay();
return data;
}
void I2C_write(unsigned char data)
{
unsigned char i;
I2C_DIR=SDIROUT;
scl(0);I2C_delay();
for(i=1;i<=8;i++)
{
sda(data>>7);I2C_delay();
scl(1);I2C_delay();
data=data<<1;
scl(0);I2C_delay();
}
sda(0);I2C_delay();
scl(0);I2C_delay();
scl(1);I2C_delay();
scl(0);I2C_delay();
sda(1);I2C_delay();
}
void main(void)
{
unsigned char i;
init_devices();
init_ds1307();
writebyte(0x00,0x00); // 00번지(초)에 0 값을 쓴다.
while(1)
{
Display();
FourDigit=readbyte(0); // 초값을 읽어온다.
}
}
------------------함수의 설명-------------------
I2C_start();
SDA 출력 방향을 AVR이 출력하는 것으로 함
SCL, SDA : High로
SDA : Low로 떨굼
I2C_stop();
SDA 출력 방향을 AVR이 출력하는 것으로 함
SCL을 High로
SDA를 Low로
SDA를 High로
init_ds1307();
I2C_start(); 를 실행한다.
DS1307 칩을 초기화 한다.
시간, 분, 초 등을 초기 값으로 초기화 한다.
동작 확인용 LED를 달기 위하여,
1Hz를 사용 가능하도록 설정한다.
void writebyte(unsigned char addr, unsigned char data);
writebyte(어드레스, 데이터)
설명 : 어드레스에 데이터를 쓴다.
SDA 출력을 AVR에서 출력하는 것으로 한다.
1.SCL을 Low로 떨군다.
2.최상위 비트부터 한 비트 쓴다.
3.SCL을 High로 올린다.
4.담 비트 준비
1,2,3,4을 8번 반복한다.
Ack를 체크한다.(그냥 무시하고 지나가고 있다.)
nsigned char readbyte(unsigned char addr);
데이터 = readbyte(어드레스)
설명 : 어드레스에서 데이터를 읽는다.
SDA핀을 AVR에서 입력 받는 것으로 한다.
1. SCL을 High로 올린다.(I2C에서 데이터 수신 받을 때 안
정적인 쪽은 클럭이 High일 때이므로)
2. 최상위비트부터 한 비트 받는다.
3. SCL을 Low로 떨군다.
4. 담 비트 받을 준비한다.
1,2,3,4를 8번 반복한다.
Ackn을 받는다.
unsigned char I2C_read(unsigned char b);
데이터 = I2C_read();
현재 번지에서 데이터를 읽어 온다.
ACK를 굳이 읽을 이유가 없어서, ACK는 강제로 1로 주고
있다.
void I2C_write(unsigned char data);
I2C_write
현재의 어드레스에 데이터를 쓴다.
ACK에 0을 실어준다.
'Nobody tells you about.. > I2C' 카테고리의 다른 글
[I2C] The I2C of ATmega128 (7) | 2012.12.11 |
---|---|
[I2C] The I2C-bus specification : 예제소스 (3) | 2012.12.10 |
[I2C] The I2C-bus specification : 송수신 (0) | 2012.12.10 |
[I2C] The I2C-bus specification : 동작설명 (0) | 2012.12.10 |
[I2C] The I2C-bus specification : 기술설명 (0) | 2012.12.10 |