i2c통신 공부중인데헤더파일 코드가 이해가잘안됩니다.

조회수 439회

read부분만가지고 왔는데 이해가 잘안됩니다

typedef union{
    uint8_t byte;
    struct
    {
        uint8_t bit0 : 1,
        bit1 : 1,
        bit2 : 1,
        bit3 : 1,
        bit4 : 1,
        bit5 : 1,
        bit6 : 1,
        bit7 : 1;
    };
} IOREG8;


#define SFR_MEM8(addr)  (*(volatile IOREG8 *) (addr))
#define PINA_REG    SFR_MEM8(0x39)
#define DDRA_REG    SFR_MEM8(0x3A)
#define PORTA_REG   SFR_MEM8(0x3B)

#define F_CPU 16000000UL

#include "delay_asm.h"
#include <util/delay.h>

void I2c_Port_Init(){
    DDRA_REG.bit0 = 1; // 0 SDA 1 SCL 
    DDRA_REG.bit1 = 1; // 0 SDA 1 SCL
    PORTA_REG.bit0 = 1;
    PORTA_REG.bit1 = 1;
}

void Read_Sequence(unsigned char MPU_Addres,unsigned char Register_Addres ,char* Pin){
    volatile unsigned char data = MPU_Addres;
    volatile unsigned char Data;

    PORTA_REG.bit0 = 0; //125NS
    _delay_us(1);
    //cycle_7(1);           //875ns + 125ns = 1ms
    PORTA_REG.bit1 = 0; //125ns
    //cycle_2(1);           //125 + 250 = 375nscycle_us(149);
    _delay_us(1);

    //cycle_us(149);
    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100); 


    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    //address 끝

    _delay_us(149);
    PORTA_REG.bit0 = 0;//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);           // 625ns + 1us = 1.625us
    _delay_us(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);      // 1cycle           //address 끝

    // w mode

    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('d');
        return;
    }
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    tx_char('c');
    //ack 신호

    DDRA_REG.bit0  = 1; // 0 SDA 1 SCL
    data = Register_Addres;


    _delay_us(149);
    PORTA_REG.bit0 = ((data >> 7) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);


    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    //Register address

    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('f');
        return;
    }
    tx_char('v');
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    //ack신호

    DDRA_REG.bit0 = 1;

    PORTA_REG.bit0 = 1; //125

    cycle_us(148);
    PORTA_REG.bit1 = 1;     // 125n
    _delay_us(2);
    PORTA_REG.bit0 = 0; //125NS
    _delay_us(2);
    //cycle_7(1);           //875ns + 125ns = 1ms
    PORTA_REG.bit1 = 0; //125ns
    //cycle_2(1);           //125 + 250 = 375nscycle_us(149);        
    cycle_us(2);
    //Start re

    data = MPU_Addres;

    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);


    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    //address 끝

    _delay_us(149);
    PORTA_REG.bit0 = 1;//125ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);      // 1cycle           //address 끝

    // r mode
    // MPU6050 ADDRESS

    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('g');
        return;
    }
    tx_char('b');
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);

    // ACK

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 7); 
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 6);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 5);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 4);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 3);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 2);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);

    DDRA_REG.bit0 = 1;
    PORTA_REG.bit0 = 0;

    cycle_us(149);
    PORTA_REG.bit0 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 1;
    cycle_3(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_3(1);
    PORTA_REG.bit0 = 0;
    cycle_us(100);

    // notack   

    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    PORTA_REG.bit0 = 1;
    cycle_3(1);
    cycle_us(101);

    *Pin  = Data;

    // P
}
  • 무엇이 이해가 안되시는지요? 정영훈 2019.11.11 15:50

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)