4. 03. I2C 통신(Inter-Integrated Circuit)
I2C란
•디바이스를 두개의 신호선으로 제어 가능한 통신
•대부분의 디바이스들은 7비트 형식의 주소를 사용하기 때문에 그 경우
마스터가 지정할 수 있는 장치는 128개이다.
•SDA(serial DATA):
- 데이터를 전송하기 위한 신호
- 마스터와 슬레이브 사이의 양방향 신호
•SCL(serial CLOCK):
- 마스터와 슬레이브를 동기화
- 항상 마스터가 발생시킴, 단방향 신호
5. 03. I2C 통신(Inter-Integrated Circuit)
I2C 통신의 장/단점
•장점:
- 클럭신호를 사용하는 동기식 통신으로 시간이 자유로움
- 多 : 多 통신이 가능함
•단점:
- 슬레이브 선택을 위해 주소데이터가 붙기 때문에, 긴 데이터에 부적합
- 같은종류를 다중으로 연결시 고유 address가 동일하기때문에
동시제어가 불가능
6. 03. I2C 통신(Inter-Integrated Circuit)
· r/w = 0 → 마스터가 슬레이브에 데이터를 전달한다.
r/w = 1 → 마스터가 슬레이브의 데이터를 전달받는다.
· ack – 슬레이브가 내보내는 신호이며 마스터는 이 신호를 보고 데이터
전송이 성공적인지 판단함 ack비트는 주소,데이터 프레임의 끝에 항상 붙음
7. 03. I2C 통신(Inter-Integrated Circuit)
interrupt
Basic I2C Interrupt Request
:여러 개가 한번에 걸릴 수 없고
arbiter에 의해 한 개가 선택되어 걸린다.
FIFO 복수의 신호가 있을 때 처리의
우선순위를 매기지 않고 제일 먼저 들어온
신호 순대로 처리하는 방식
9. 03. I2C 통신(Inter-Integrated Circuit)
I2caRegs.I2CSAR = (0x00e0 >> 1); // Slave Address.
여기서 DSP에서 사용시에는 slave address의 마지막bit는 r/w 1bit를 포함하므로 1bit
shift해준다.
I2caRegs.I2CPSC.all = 79;
다음은 통신속도클락를 조절하는 레지스터인데, 값이 너무 작으면 통신속도가
너무 빨라서 통신이 안되는 경우도 있으니 적당한 값을 설정해준다.
10. 03. I2C 통신(Inter-Integrated Circuit)
• 클락이 안나오는경우
sysctrl.c에 들어가서 클락을 on 시켜줘야 한다.
>> SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;
• Interrupt 설정
여느 interrupt 설정과 같이 pievecter table에 따라 인터럽트 설정을 해준다.
11. 03. I2C 통신(Inter-Integrated Circuit)
2. 통신 rx/tx
통신 규칙에 따라
1. START 신호를 보내고
2. SLAVE ADDRESS bit를 보내고
3. DATA를 보내고
4. DATA를 받고
12. 03. I2C 통신(Inter-Integrated Circuit)
void I2C_tx_Uint16data(Uint16 data)
{
I2caRegs.I2CCNT = 1; //1byte 명령어 tx
I2caRegs.I2CDXR = data; //i2c data transmit register
I2caRegs.I2CMDR.all = 0x6e20;
}
void I2C_rx_Uint16length(Uint16 length)
{
g_u16data_length = length;
I2caRegs.I2CCNT = length;
I2caRegs.I2CMDR.all = 0x2c20;
}
I2CCNT register – data count register 로 data의 길이를 정하고
I2CDXR register – data transmit register 로 data를 받는다!
14. 03. I2C 통신(Inter-Integrated Circuit)
24 (0x18) gives a range of 1 metre and 93 (0x5D) is 4 metres.
3. Command 설정
사용한 초음파 센서의 경우 결과값의 단위 등 설정 값을 명령해주는 단계로 뒤의
I2cwrite 함수로 command를 해준다
16. 03. I2C 통신(Inter-Integrated Circuit)
I2caRegs.I2CMDR.bit.BC = 0; // 2:0 Bit count
I2caRegs.I2CMDR.bit.FDF = 0; // 3 Free data format
I2caRegs.I2CMDR.bit.STB = 0; // 4 Start byte
I2caRegs.I2CMDR.bit.IRS = 1; // 5 I2C Reset not
I2caRegs.I2CMDR.bit.DLB = 0; // 6 Digital loopback
I2caRegs.I2CMDR.bit.RM = 0; // 7 Repeat mode
I2caRegs.I2CMDR.bit.XA = 0; // 8 Expand address
I2caRegs.I2CMDR.bit.TRX = 1/0; // 9 Transmitter mode
Receive mode
I2caRegs.I2CMDR.bit.MST = 1; // 10 Master mode
I2caRegs.I2CMDR.bit.STP = 1; // 11 Stop condition
I2caRegs.I2CMDR.bit.rsvd1 = 0; // 12 reserved
I2caRegs.I2CMDR.bit.STT = 1; // 13 Start condition
I2caRegs.I2CMDR.bit.FREE = 1 ; // 14 Emulation mode(free)
if) = 0; // 14 master mode
I2caRegs.I2CMDR.bit.NACKMOD = 0; // 15 No Ack mode
Write 함수의 register 설정으로 I2caRegs.I2CMDR.bit.FREE 의 값을 1로 둠으로 써 마스터
모드가 아닌 자유로운 모드 상태에서 명령을 해준다.
17. 03. I2C 통신(Inter-Integrated Circuit)
앞서 command를 참고하여
명령을 해준뒤, data를 받겠다는
0x02 주소값을 보낸뒤 2byte의
센서값을 받는과정이다. 이
과정에서 command를 받기 위해
조금의 delay를 걸어주기 위해
interrupt를 사용하였다.