[Harman 세미콘 아카데미] Day_68(System Verilog)
I2C Protocol : 직렬 통신 프로토콜, 단거리 통신에 활용합니다.
특징 :
1) 두개의 wire(SDA, SCL)로 Master - Slave 간 통신 진행
2) 한번에 한 bit씩 전송하는 직렬 통신
3) 송/수신이 동시에 불가능 (Half Duplex)
4) 동기식 통신 Protocol
5) 두개의 wire는 Pullup 저항 존재 (내부 회로가 Open Drain 구조)
장점 :
1) wire가 두개이므로 단순하고 저렴하게 구현 가능
2) 여러 Peripheral을 연결할 수 있음
ㄴ Slave에 고유한 주소를 할당하여 통신
3) 다중 Master를 지원하여, 여러 Master와의 연결 가능 (잘 하지는 않음)
단점 : 단거리 통신, 다른 Protocol에 비해 속도가 느리다.
** (CAN 통신 : Noise에 강하다 (자동차, 공장 등의 기계 회로에 사용됨)) **
I2C는 기본적으로 100kbps를 지원하지만, Slave의 동작 속도에 맞춰 fastmode를 사용할 수 있습니다.
특징으로, VDD에 Pullup 저항이 존재하고, SDA와 SCL의 2개의 연결선이 연결되어 있어야 합니다. Slave는 동일한 GND를 사용해야 통신이 가능합니다. (전압의 기준점을 잡아주어 VDD를 인식하도록 하기 위함)
또한, 각 Slave는 고유한 주소를 가지고 있어, Master로부터 Broadcasting되는 신호가 특정 Slave에게만 전달되며 통신합니다.
여담)
BJT : 화살표 있는 쪽이 Emitter, 화살촉의 방향이 N형
FET : 화살표 있는 쪽이 Source, Gate에 o있으면 PMOS 없으면 NMOS
NOT GATE : PMOS와 NMOS를 직렬로 연결함. (Switching을 통한 출력 반전)
Open - Drain : FET의 Drain에 전압이 0이면, 출력값이 생성되지 않음. 출력단에 Pullup 저항을 달아 주어 출력 생성
Open - Collector : BJT의 Collector에 전압이 0일때, 출력단에 Pullup 저항을 달아 주어 출력 생성
I2C로 돌아와서, I2C는 VDD에 연결된 SDA와 SCL이 Pullup 저항이 연결되어 Open-drain 형태로 이뤄져 있습니다. 그 이유로는, 하나의 Port에 여려개의 연결되는 모듈의 전류와 전압이 약하므로, 이를 공급하기 위해 외부의 VDD와 Pull-up을 달아 줍니다.
동작 방식 :
I2C의 Master가 Start Signal을 모든 Slave에 전달합니다. 그 후, 특정 Slave의 Address에 접근하고, Data를 전송합니다. Data 전송이 끝나면, Slave로부터 ACK를 받아 Data 전송이 잘 되었음을 확인하고 STOP 신호를 생성하여 전체적인 Process를 종료합니다. (Master가 보내는 신호는 Broadcasting되기 때문에 동일한 address를 갖는 Slave만 명령 실행)
요약 :
1. START 신호 발생 (Broadcasting 되어 모든 Slave가 받음)
2. Address bit를 통해 특정 Slave의 Address에 '만' 접근 (Address_bit의 0번 bit를 통해 Read/ Write 명령 구분)
3. Data bit 전송
4. Slave로부터 Data를 받았다는 신호인 ACK를 받고, STOP 신호를 발생 함 -> 통신 종료
ㄴ (Slave가 1byte의 Data를 수신하면 Master에게 자동으로 ACK를 송신)
/// 보류 ///
I2C의 Start 신호는 통신이 시작되어 SDA와 SCL이 순차적으로 LOW로 변하는데 SDA == 0 && SCL == 1 인 시점의 차이를 통해 Edge를 검출합니다. 이 Edge로 I2C Master의 Start Signal을 생성합니다. 반대로, Stop Signal은 통신이 종료된 후, SCL과 SDA를 차례로 High 시키면서 SCL == 1 && SDA == 0 인 구간에서의 차이를 이용해 Edge를 검출합니다. 이 Edge를 통해 Stop Signal을 생성하게 됩니다. (만약, SDA와 SCL 모두 1인 상태에서는 어떠한 Data를 갖지 않으므로 IDLE State를 유지합니다.)
START와 STOP의 신호를 생성하기 위해, State를 3개로 나눠 주었습니다. SDA와 SCL의 값에 따라 3개의 state로 나눠 주었고, SCL이 High일 때, SDA 값이 High -> Low로 변할 때 start 신호가 생성되고, SDA 값이 Low->High로 변할 때 stop 신호가 생성됩니다.
또한, 아래의 그림처럼 SDA가 SCL보다 먼저 변화합니다. 이는 Start와 Stop Signal에 대해 명확히 생성하기 위해 설계되었습니다.
Start Signal이 들어오고 SDA가 LOW로 유지되면서 8bit의 Address bit가 들어옵니다. 이 bit [7:1]을 활용하여, 특정 Slave가 가지는 address와 동일하면 그 Slave에 bit[0]의 판별을 통해 Write / Read 동작을 수행합니다. 그리고, 추가적으로 Slave가 8bit 즉, 1byte의 명령어를 수신하게 되면 Master에게 ACK를 송신합니다.
이를, DS1307 I2C Real -Time Clock의 Datasheet를 참고하며 I2C Protocol을 살펴보았습니다.
Address bit의 최하위 bit가 0임을 확인하여 Write 동작을 실행합니다. bit[7:1]의 Address 정보를 받고 Slave로 부터 ACK를 받습니다. 그 후, Stop 신호가 들어오기 전까지 1byte의 Data를 Write하고 ACK를 받고를 반복하며 동작 합니다.
Read는 최하위 bit가 1일때 동작을 실행합니다. 이때 Slave가 Master에게 Data를 보내기 때문에, Data 1byte를 받았다는 ACK 신호는 Master에서 Slave로 보내게 됩니다. 그리고 stop 신호가 들어오기 전 NACK를 보내며, Read 명령을 종료합니다.
(ACK = SDA가 LOW이고, SCL이 한번 올라갔다 떨어질 때 발생, NACK = SDA가 HIGH 일 때)
Data bit를 전송할 때, 100KHz의 SCL 기준에 맞춰 전달합니다. 이때, 전송하고자 하는 SDA는 tx_data를 담고 있는 Register의 MSB tx_data_reg[7]을 보내고, SCL에 맞춰서 보내게 됩니다. 이를 총 4개의 state로 나눠서 동작하게 되며, 이를 8번 반복하면 1byte가 전송되었으므로 Slave로부터 ACK를 수신하면서 다음 Data를 전송할 준비를 합니다.