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
}
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
댓글 입력