Pages List
List view
STM32 Peripheral
I2C
I2C Introduction
I2C는 SPI 보다 상당히 복잡한 통신 프로토콜이다.
I2C의 Specification은 NXP에서 디자인하였다. (global spec)
SPI는 Spec이 각각 따로 논다.
I2C는 multi-master 가능하다.
SPI는 multi-master에 대한 guide line이 없어서, multi-master capability는 MCU designer나 vendor에 따라 유무가 결정된다.
STM SPI peripheral은 multi-master 가능하지만 multi-master간의 arbitration은 software code로 handling 되어야한다.
I2C에서의 arbitration은 hardware가 자동으로 처리한다. (I2C의 중요한 특징)
I2C hardware는 매 byte를 수신할 때마다 자동으로 ACK을 보낸다.
(알다시피 SPI는 이러한 automatic ACK은 지원하지 않는다.)
I2C는 communication 하기위해 사용되는 Pin의 개수가 2개이다. (SCL, SDA)
SPI는 기본적으로 4개의 Pin이 필요하지만, 다수의 Slave가 연결된다면 그 이상의 Pin이 필요하다.
I2C에서는 SCL, SDA pin으로 모든 Slave들을 연결할 수 있다. (I2C의 가장 큰 장점중 하나)
SCL, SDA pin은 VDD로 풀업되어 있다.
I2C Master는 Slave의 address를 사용해서 Slave와 통신한다. (각각의 Device는 고유의 address를 갖는다.)
→ I2C 프로토콜은 address based communication이다.
(SPI 통신에서는 별도의 Pin을 사용해 Slave를 선택했다.)
기본적으로 I2C 통신은 Half-duplex이고, SPI 통신은 Full-duplex 이다.
I2C가 SPI에 꿀리는 점이 바로 Speed이다.
I2C는 Ultra speed plus에서 최대 4MHz로 동작할 수 있지만, 거의 모든 MCU에서 이것을 지원하지 않는다.
그래서 대개 400kHz나 1MHz가 최대 속도이다.
반면에 SPI는 peripheral clock speed의 절반으로 동작할 수 있기 때문에, 최고 통신 속도가 10MHz 이상이다.
SPI는 I2C보다 매우 매우 빠르다.
I2C 통신에서 Slave는 바쁠때, clock을 GND로 stretching 함으로써 master를 대기시킬 수 있다. (clock stretching)
그러나 SPI 통신에서는 Slave는 clock에 대한 제어권한이 없으므로 Slave가 바쁠 때, 프로그래머가 트릭을 사용해서 Master를 대기시켜야 한다.
높은 Data rate가 요구되는 곳에는 SPI 통신을 사용하고, 낮은 Data rate가 요구되는 곳에서는 I2C 통신을 사용하는 것이 바람직하다.
SDA 신호와 SCL 신호
SDA, SCL은 Bi-directional line이고 풀업 저항을 통해 +VDD에 연결되어 있다.
Bus가 free상태이면 SDA와 SCL 라인은 모두 High를 유지한다.
Bus에 연결된 장치들의 output stage는 반드시 open-drain 또는 open-collector 구조여야 한다.
Bus에 연결할 수 있는 interface의 숫자는 Bus capacitance에 의해 제한된다.
I2C Pin Configuration
GPIO pin을 I2C 통신에 사용할 때, Pin은 반드시 open-drain으로 설정되어야 한다.
I2C 통신에 문제가 있을 때는 SCL pin과 SDA pin이 모두 VDD로 풀업되어있는지 확인해야 한다.
I2C Modes
I2C는 SPI 통신보다 느리다는 사실을 다시 한번 알 수 있다.
Standard Mode
I2C 통신의 Standard mode는 100kbps의 data 전송 속도를 가진다.
Standard mode만 지원하는 장치는 Fast mode나 그 이상의 속도로 설정된 장비와는 통신이 불가능하다.
(RTC, 온도 센서 등이 Standard mode로 통신하는 장치이다.)
(RTC, 온도 센서 등이 Standard mode로 통신하는 장치이다.)
I2C 통신의 Fast mode는 400kbps의 data 전송 속도를 가진다.
Fast mode를 지원하는 장치라도 Standard mode로 설정하면, Standard mode만 지원하는 장치와 통신이 가능하다.
Basics of I2C Protocol
Start and Stop Conditions
모든 I2C transaction은 START condition으로 시작하고, STOP condition으로 종료된다.
SCL이 High일 때, SDA line의 High to Low의 transtion은 START condition을 의미하고, 마찬가지로 SCL이 High일 때, SDA line의 Low to High의 transition은 STOP condition을 의미한다.
일단 Master가 START condition을 형성하면 Bus는 해당 Master가 점유하게 되고, 나머지 Master들은 Bus가 release될 때까지 Bus에 대한 통제 권한을 주장할 수 없게 된다.
Points to Remember
- START와 STOP condition은 항상 Master가 만들어 낸다.
- START condition이 형성되면, Bus는 busy 상태가 되기 때문에 다른 Master들은 Bus를 사용할 수 없다.
- STOP condition 대신에 repeated START condition이 형성된다면, Bus는 busy상태를 지속한다.
대부분의 MCU의 I2C peripheral들은 Master mode와 Slave mode를 모두 지원한다.
peripheral이 START condition을 형성하면 그것은 자동으로 Master가 되고, STOP condition을 형성하면, 다시 Slave mode로 되돌아간다. 그래서 peripheral의 mode를 따로 설정할 필요가 없다.
ACK
Address phase에서 Master는 Slave의 address 7bit와 R/nW 1bit를 Bus에 올린다.
그러면 해당 address를 가진 Slave는 9번째 clock에서 Master가 release한 SDA line을 Low로 내리거나(ACK) High를 유지시킨다.(NACK)
1byte를 보낼 때마다 ‘ACK/NACK’ bit를 통해, Master와 Slave는 data 송수신이 성공적으로 이루어졌음을 상대에게 알릴 수 있다.
NACK
앞서 말했듯이 NACK의 경우에는 9번째 clock의 SDA line이 High로 유지된다.
이 경우에 Master는 data transfer를 중지하기 위해 STOP condition을 만들거나 새로운 data transfer를 시작하기 위해 START condition을 만들 수 있다.
Data validity
SCL이 High일 때, SDA의 data는 반드시 변하지 않고 stable 해야한다.
SDA의 data가 변할 수 있는 순간은 오로지 SCL이 Low인 구간 뿐이다. (START/STOP condition 제외)
Example of Master Writing data to Slave
Example of Master Reading data from Slave
Slave가 Master로부터 받은 ACK은 방금 Slave가 보낸 1byte가 성공적으로 수신되었음을 의미하고, 이어서 다음 byte도 보내라는 의미 또한 갖는다.
Repeated Start (Start again without Stop)
MCU가 I2C 통신으로 EEPROM의 0x45 번지의 data를 읽는 상황을 생각해보자.
① Repeated Start를 사용하지 않는 경우
Repeated Start를 사용하지 않으면, Master는 1byte의 data (0x45)를 보내고 STOP condition을 만듦으로써 Bus를 Release 하게 된다.
이때, 다른 Master가 Bus를 점유하면 EEPROM으로부터의 data 수신이 늦어질 수 있다.
② Repeated Start를 사용하는 경우
Repeated Start에서는 Master가 Bus를 release하지 않으므로 원하는 만큼 Slave와 data를 주고 받을 수 있다. (Single Master의 경우에는 Repeated Start 여부가 중요하지 않다.)
I2C Functional block Diagram
I2C Driver API requirements & Configurable items
Steps for I2C init API
- I2C의 mode를 설정한다. (Standard mode or Fast mode or etc.)
- Serial clock(SCL)의 속도를 설정한다.
- Device가 Slave로 동작하면, Device의 address를 설정한다.
- ACKing을 Enable 한다.
- I2C pin의 rise time을 설정한다.
I2C의 Serial clock(SCL) 설정
I2C에서 원하는 Serial clock(SCL)을 만드려면, CR2와 CCR 레지스터를 설정해야 한다.
CR2의 FREQ field에는 I2C peripheral이 연결된 APB bus의 clock speed를 write한다.
그리고 CCR의 CCR field를 통해 다양한 SCL의 frequency를 만들 수 있다.
예시) SM mode, 100kHz of SCL
예시) FM mode, 200kHz of SCL
Clock Stretching
Clock stretching은 clock을 ground level로 유지하는 것을 의미하는데, I2C 통신에서 Clock이 stretching되면, Clock이 정상으로 동작할 때까지 I2C interface 전체가 정지된다.
Master이던 Slave이던 통신을 늦춰야 하는 I2C 장치는 SCL을 Low로 stretching하는 Clock stretching을 사용한다.
예를 들어, Master가 제공하는 Clock speed에 맞춰서 Slave가 동작하기 힘들 때, Slave는 Clock stretching을 사용해 I2C 동작을 잠시 멈추는 방식으로 시간을 번다.
Slave가 다른 작업을 수행하는 등의 일로 시간이 필요할 때, Clock을 Low로 내림으로써 Master를 대기시킬 수 있다.
User가 I2C peripheral의 Clock stretching 기능을 Enable하면, HW가 알아서 Clock stretching을 한다.
Master Send data to Slave
- I2C 통신에서는 먼저 Start를 하는 장치가 Master가 된다. Master가 Start를 해서 SR 레지스터의 SB = 1이 되면, 성공적으로 Start를 한 것이다.(EV5) EV5에서는 SCL이 Low로 stretch 되는데, 여기서 SR1 레지스터를 read하고 DR 레지스터에 address를 write함으로써 EV5(SB가 clear)에서 벗어날 수 있다.
- Master가 Address phase로 진입해서 SDA line에 1byte(7bit of Slave address + 1bit of R/nW)를 올린다.
- Address에 대한 Slave의 ACK이 수신되면, EV6로 넘어간다.(SR 레지스터의 ADDR flag가 set된다.) 이는 Master가 Address phase를 성공적으로 수행했음을 의미한다.(다시 말해, 지정된 Slave로부터 ACK을 수신함.)
- EV6 상태에서 ADDR flag를 clear하면, 곧 바로 EV8_1로 넘어간다. (SR 레지스터의 TXE flag가 set되고, shift 레지스터와 Data 레지스터가 empty인 상태.)
- EV8_1 상태일 때, Data 레지스터에 data를 write하면 data는 즉시 shift 레지스터로 copy되고, Data 레지스터는 바로 다시 empty 상태가 된다. (이는 shift 레지스터 : not empty, Data 레지스터 : empty 상태인 EV8 상태이다.)
- EV8 상태에서 Data 레지스터에 data를 쓰면, 이 data는 이전에 송신한 data의 ACK이 도착하기 전까지 대기하고 ACK이 수신되면 shift 레지스터로 copy된다.
- Slave로 부터 ACK을 수신할 때마다, Data 레지스터에 data를 write하는 방식(EV8 상태)으로 data를 계속 송신한다.
- Master가 모든 data를 Slave로 송신해서 Data 레지스터와 Shift 레지스터가 모두 empty상태(Null)이면, TXE flag와 BTF flag(Byte transfer complete)가 set된다. (EV8_2 상태, 이 상태에서는 under run error를 피하기 위해 clock을 stretch 시킨다.)
- EV8_2 상태에서 Master가 STOP condition을 만들면, TXE flag와 BTF flag 모두 HW가 자동으로 clear하고, I2C 송신이 종료된다.
Pull-up resistance, Rise time and Bus capacitance
① Rp(min)
- Pull-up 저항의 최소값은 VCC, V_OL(max), I_OL로 결정된다. I2C specification을 보면, V_OL(max)는 0.4[V], I_OL은 3[mA] 정도의 값을 가진다.
② Rp(max)
- Pull-up 저항의 최대값은 rise time(tr)과 각 bus line의 capacitive load(c_b)로 결정된다.
- rise time(tr)은 SDA 또는 SCL line의 rising edge에서, amplitude가 30%에서 출발해서 70%에 도달하는데 걸리는 시간을 말한다.
- rise time(tr)은 RC time-constant에 비례하기 때문에, Pull-up 저항값을 증가시키거나 bus capacitance를 증가시킨다면 rise time(tr)도 증가하게 된다.
- Standard mode에서 rise time(tr)은 1us가 허용되는 최대값이고, Fast mode에서는 300ns가 허용되는 최대값이다.
Pull-up 저항값이 매우 크다면, 신호가 High 인식 조건(70% of VDD)을 넘지 못해서 모두 Low로 인식될 수 있다.
그러면 Slave는 쓰레기 값을 수신하게 되고. I2C 통신이 정상적으로 수행되지 못한다.
(이러한 현상이 발생하면, Pull-up 저항값을 낮추거나 Bus capacitance를 낮추어야 한다.)
(이러한 현상이 발생하면, Pull-up 저항값을 낮추거나 Bus capacitance를 낮추어야 한다.)
하지만 rise time(tr)을 줄이기 위해, Pull-up 저항값을 낮출수록 전류 소모량은 커지게 된다.
(Low power Application에 좋지 않다.)
(Low power Application에 좋지 않다.)
그래서 앞의 두 식으로 계산한 Rp(min)값과 Rp(max)값 사이의 적절한 값을 Pull-up 저항값으로 설정해야 한다.
capacitance는 signal line의 voltage level이 빠르게 변화하는 것을 방해한다. (Pull-up 저항처럼)
SDA, SCL line에 장치를 연결하면, 장치 뿐만 아니라 Pin capacitance도 함께 연결된다.
이러한 capacitance들은 Pull-up 저항처럼 신호가 Low에서 High로 변화하는데 장애물이 된다.
Bus capacitance는 Ground에 연결된 각각의 Pin capacitance, SDA line과 SCL line 사이의 capacitance, parastic capacitance, bus에 달린 장치들에 의한 capacitance, bus wire의 길이에 의한 capacitance들의 집합이다.
Bus capacitance 제한 때문에 I2C wire의 길이(capacitance due to Bus length)와 Bus에 연결할 수 있는 device 개수(Pin capacitance with respect to gnd)가 한정된다.
I2C specification에 나와있는 허용가능한 Bus capacitance 최대값은 400pF이다.(Standard mode, Fast mode)
device의 Pin capacitance는 해당 device의 specification에 기재되어 있다.
예를 들어, I2C protocol의 RTC인 DS1307은 10pF의 Pin capacitance를 가진다.
(그 밑에 CB는 강사가 언급안함.)
Rp(min) = (3.3 – 0.4) / (3*10^(-3)) = 966[ohm]
Rp(max) = (300 * 10^(-9)) / (0.8473 * 150 * 10^(-12)) = 2.3[kohm]
966[ohm] <= Rp < 2.3[kohm]
then, 2.2[kohm]으로 설정하면 전류 소모량도 최소로 줄일 수 있고 충분한 rise time(tr)도 얻을 수 있다.
Rise time Calculation
I2C Trise 레지스터의 Trise field의 값은 {Trise(max) / Tpclk1} +1 으로 계산된다.
예제 1) I2C Master Tx Test with blocking call API
주의할 점 : I2C Slave address로 사용하면 안되는 address들은 아래와 같다.
[ 결과 ]
Master Receive data from Slave
- Master가 Start를 하고 성공적으로 Start했을 때, SR 레지스터의 SB flag = 1이 된다.(EV5)
- EV5에서 SR 레지스터를 read하고 DR 레지스터에 address를 write하면, EV5에서 벗어나 Address phase로 넘어갈 수 있다.
- 해당 Address를 가진 Slave가 ACK을 보내면, ADDR flag = 1이 되는 EV6로 진입한다. (Address phase 완료를 의미)
- ADDR flag를 clear하면(SR1, SR2를 순차적으로 read함으로써), EV6에서 벗어나고, Slave가 송신한 data가 Master의 Shift 레지스터에 채워지게 된다.
- Shift 레지스터에 1byte가 채워지면, Master는 Slave에게 ACK을 송신한다. (Master가 Slave에게 보내는 ACK은 다음 byte를 송신하라는 의미이다.)
- Master가 ACK을 송신하면, RxNE flag = 1이 된다. (EV7 : Rx buffer에 data가 있으므로 read하라는 의미이다.)
- RxNE flag가 set될 때마다 Master는 Rx buffer를 read하는 과정을 반복하면 된다.
- 그러다 Master가 더 이상 Slave에게 요청할 data가 없다면, Master는 Slave에게 NACK을 송신하고 Slave는 data 송신을 중단한다.
- 마지막 byte에 대한 RxNE flag가 set되면, Master는 마지막 byte를 read하고 STOP condition을 생성한다.
Master Receive 1byte from Slave
EV6에서 ACKing을 diable(CR 레지스터의 ACK bit를 0으로 clear)하고, ADDR flag를 0으로 clear해야 한다. ADDR flag를 0으로 clear하면, clock이 release되고 Slave로부터 data가 수신되기 시작한다.
Slave는 data를 송신한 후, Master로부터 NACK을 수신함으로써 Master로의 data 송신이 끝났음을 알게 된다.
EV7에서 Master는 RxNE flag가 set되면, STOP bit를 1로 set하고 STOP condition을 생성한다. 그리고 Rx buffer에서 마지막으로 수신한 data를 read한다.
예제 2-1) I2C Master Rx Test(without Repeated Start) with blocking call API
주의할 점 :
I2C_CR1 레지스터의 ACK bit는 PE(Peripheral Enable) bit가 set되기 전까지는 configure할 수 없다.
I2C_CR1 레지스터의 ACK bit는 PE(Peripheral Enable) bit가 set되기 전까지는 configure할 수 없다.
[ 결과 ]
예제 2-2) I2C Master Rx Test(with Repeated Start) with blocking call API
[ 결과 ]
I2C Interrupt
I2C IRQ들을 허용하려면, 그것에 대응하는 Control bit를 enable해야 한다.
각 I2C에서는 2개의 IRQ line이 존재한다.
I2C Event에 대한 IRQ는 NVIC의 31번에 전달되고, I2C Error에 대한 IRQ는 NVIC의 32번에 전달된다.
I2C Errors
Bus Error : Data 송수신 중에 SCL이 High인 상태에서는 SDA의 state가 바뀌면 안되는데, 바뀐 경우에 발생.
Arbitration Loss Error : Multi-Master에서 Master가 다른 Master에게 bus의 arbitration을 빼앗긴 경우에 발생.
ACK Failure Error : 이전에 송신한 data에 대한 ACK을 받지 못했을 때, 발생하는 Error
Overrun Error : 이 Error는 data 수신과정에서만 발생할 수 있다. 새로운 data가 수신되었지만, DR에 있는 이전 data를 아직 읽지못해서 새로 수신된 data가 버려질 때 발생하는 Error이다.
(Underrun Error는 data 송신과정에서만 발생하고, Clock stretching이 Enable된다면 두 Error는 발생하지 않는다.)
Master나 Slave가 Clock을 Stretch했을 때, 권장된 시간보다 오래 clock을 Low로 유지하면 Time-Out Error가 발생한다.
BTF flag in Tx, Rx
Tx 모드에서 DR 레지스터가 empty 상태가 되면 TXE flag가 Set된다.
더 나아가 SR 레지스터까지 empty 상태가 되어, 두 레지스터가 모두 empty 상태가 되면 BTF flag가 Set된다.
이 때, Clock stretching이 Enable되어 있다면, clock은 Stretch되고 Underrun Error 발생을 막을 수 있다.
Rx 모드에서 DR 레지스터가 Full 상태가 되면 RXNE flag가 Set된다.
더 나아가 SR 레지스터까지 Full 상태가 되어, 두 레지스터가 모두 Full 상태가 되면 BTF flag가 Set된다.
이 때. Clock stretching이 Enable되어 있다면, clock은 Stretch되고 Overrun Error 발생을 막을 수 있다.
BTF flag가 Set되는 경우는 다음과 같다.
① Tx 모드
SR 레지스터와 DR 레지스터가 모두 empty 상태일 때, BTF flag가 Set된다.
Clock stretching이 Enable되어 있다면, BTF flag가 set되는 즉시 Clock이 stretch되고 Master와 Slave 모두 Waiting state에 머무른다. (Underrun Error 방지)
② Rx 모드
SR 레지스터와 DR 레지스터가 모두 Full 상태일 때, BTF flag가 Set된다.
Clock stretching이 Enable되어 있다면, BTF flag가 set되는 즉시 Clock이 stretch되고 Master와 Slave 모두 Waiting state에 머무른다. (Overrun Error 방지)
예제 3) I2C Master Rx Test with Interrupt
주의할 점 :
I2C Slave
I2C Master는 Start condition, Stop condition을 생성할 수 있고, Read/Write transaction을 시작할 수 있다.
하지만 Slave는 오직 다음과 같이 2가지만 수행할 수 있다.
① Master로부터 data를 수신하는 것 (Master의 Write transaction)
② Master에게 요청받은 data를 송신하는 것 (Master의 Read transaction)
Slave Send data to Master (Master’s Read transaction)
EV1 : Master가 보낸 address가 자신(Slave)의 address와 동일한 경우. SR1과 SR2를 순차적으로 Read함으로써 ADDR flag를 clear하고, EV3-1로 넘어갈 수 있다.
EV3-1 : SR 레지스터와 DR 레지스터가 모두 Empty 상태인 경우이다. Underrun error 발생을 예방하기 위해 Clock이 stretch된다.
EV3 : SR 레지스터는 Full, DR 레지스터는 Empty 상태인 경우이다. 이 때마다 Master에 보낼 data를 Write한다.
EV3-2 : Master로부터 더 이상 data를 보내지 말라는 의미의 NACK을 Slave가 수신하면, Slave에는 AF error가 발생한다. Slave가 data를 보내는 과정에서 발생하는 AF error는 data transfer의 끝을 의미한다.
Slave Receive data from Master (Master’s Write transaction)
EV1 : Master가 보낸 address가 자신(Slave)의 address와 동일한 경우. EV1을 넘어가려면 SR1과 SR2를 순차적으로 Read해서 ADDR flag를 clear한다.
EV2 : Slave는 Master가 보낸 data에 대한 ACK을 송신하면, RxNE flag가 set된다. RxNE flag가 set될 때마다 Master가 송신한 data를 read하면 된다.
EV4 : Master가 Stop condition을 생성하면, Slave는 STOP flag를 통해 Master가 Write transaction을 종료했음을 알 수 있다.
예제 4) I2C Slave Tx Test with Interrupt
[ 결과 ]
I2CI2C IntroductionSDA 신호와 SCL 신호I2C Pin ConfigurationI2C ModesStandard ModeBasics of I2C ProtocolStart and Stop ConditionsPoints to RememberACKNACKData validityExample of Master Writing data to SlaveExample of Master Reading data from SlaveRepeated Start (Start again without Stop)① Repeated Start를 사용하지 않는 경우② Repeated Start를 사용하는 경우I2C Functional block DiagramI2C Driver API requirements & Configurable itemsSteps for I2C init APII2C의 Serial clock(SCL) 설정예시) SM mode, 100kHz of SCL예시) FM mode, 200kHz of SCLClock StretchingMaster Send data to SlavePull-up resistance, Rise time and Bus capacitance① Rp(min)② Rp(max)Rise time Calculation예제 1) I2C Master Tx Test with blocking call API[ 결과 ]Master Receive data from SlaveMaster Receive 1byte from Slave예제 2-1) I2C Master Rx Test(without Repeated Start) with blocking call API[ 결과 ]예제 2-2) I2C Master Rx Test(with Repeated Start) with blocking call API[ 결과 ]I2C InterruptI2C ErrorsBTF flag in Tx, Rx예제 3) I2C Master Rx Test with InterruptI2C SlaveSlave Send data to Master (Master’s Read transaction)Slave Receive data from Master (Master’s Write transaction)예제 4) I2C Slave Tx Test with Interrupt[ 결과 ]