본문 바로가기

개발/embed

i2c (iic) 의 간단한 이해

반응형

기본 적으로  https://www.robot-electronics.co.uk/i2c-tutorial

 

I2C tutorial

Using the I2C Bus Using the I2C Bus  Judging from my emails, it is quite clear that the I2C bus can be very confusing for the newcomer. I have lots of examples on using the I2C bus on the website, but many of these are using high level controllers and do

www.robot-electronics.co.uk

를 기계번역 하였으며, i2c 사양  https://www.nxp.com/docs/en/user-guide/UM10204.pdf  을 추가적으로 참고 하였다

직접 넣은 것은 쬐끔

 

=================

Using the I2C Bus 

Judging from my emails, it is quite clear that the I2C bus can be very confusing for the newcomer. I have lots of examples on using the I2C bus on the website, but many of these are using high level controllers and do not show the detail of what is actually happening on the bus. This short article therefore tries to de-mystify the I2C bus, I hope it doesn't have the opposite effect!

웹사이트에 I2C 버스 사용에 대한 많은 예가 있지만 이들 많은 수가 높은 수준의 컨트롤러를 사용하고 있으며 버스에서 실제로 일어나는 일에 대한 세부 정보를 표시하지 않습니다따라서 짧은 기사는 I2C 버스를 이해하기 위해 시도합니다

 

The physical I2C bus 물리적 I2C 버스
This is just two wires, called SCL and SDA. SCL is the clock line. It is used to synchronize all data transfers over the I2C bus. SDA is the data line. The SCL & SDA lines are connected to all devices on the I2C bus. There needs to be a third wire which is just the ground or 0 volts. There may also be a 5volt wire is power is being distributed to the devices. Both SCL and SDA lines are "open drain" drivers. What this means is that the chip can drive its output low, but it cannot drive it high. For the line to be able to go high you must provide pull-up resistors to the 5v supply. There should be a resistor from the SCL line to the 5v line and another from the SDA line to the 5v line. You only need one set of pull-up resistors for the whole I2C bus, not for each device, as illustrated below:

I2C SCL SDA라고 하는 개의 선만 이용 합니다. SCL 클럭 라인입니다. I2C 버스를 통한 모든 데이터 전송을 동기화하는 사용됩니다. SDA 데이터 라인입니다. SCL SDA 라인은 I2C 버스의 모든 장치에 연결됩니다

I2C 버스 방식은 n:n 방식 입니다. 참고로RS232 같은 것은 1:1 방식 master(혹은 server)-client 방식 이나,  I2C RS485 같이 n:n 방식 n 개가 붙어 서로 송신 수신 하는 방식 입니다. 그리 보면  RS485 같이 보일 있읍니다.  하시만 보통 실제적으로는 한놈(Master) 쏘고 여러놈(Client) 받는 방식으로 합니다. 통신선을 송신 수신에 같이 쓰므로 하프 듀풀렉스 ? 라고 할까,  RS422 에서는 Master Tx(Client Rx)j Client Tx(Master Rx) 각각 2(신호선+신호접지)가닥 4가닥을 쓰지만 I2C Clock+Data+Gnd 3가닥을 씁니다. 접지 또는 0볼트인 번째 와이어가 필요합니다전원이 장치에 분배되는 5볼트나 3.3볼트나 전선이 있을 수도 있습니다. SCL SDA 라인은 모두 "오픈 드레인" 드라이버입니다이것이 의미하는 바는 칩이 출력을 낮게 구동할 있지만 높게 구동할 수는 없다는 것입니다라인이 높게 있으려면 5v 공급 장치에 풀업 저항을 제공해야 합니다. SCL 라인에서 5v 라인으로의 저항과 SDA 라인에서 5v 라인으로의 다른 저항이 있어야 합니다아래 그림과 같이 장치가 아닌 전체 I2C 버스에 대해 세트의 풀업 저항만 필요합니다.

I2C 디바이스 연결 하기

The value of the resistors is not critical. I have seen anything from 1k8 (1800 ohms) to 47k (47000 ohms) used. 1k8, 4k7 and 10k are common values, but anything in this range should work OK. I recommend 1k8 as this gives you the best performance. If the resistors are missing, the SCL and SDA lines will always be low - nearly 0 volts - and the I2C bus will not work.

저항 값은 중요하지 않습니다나는 1k8(1800)에서 47k(47000)까지 사용되는 것을 보았습니다. 1k8, 4k7 10k 일반적인 값이지만 범위의 모든 값은 정상적으로 작동합니다최고의 성능을 제공하므로 1k8 권장합니다저항이 없으면 SCL SDA 라인은 하이 임피던스(전압을 재면 2, 3 볼트 나오지만 부하 걸리면 0나왔다 1나왔다) 상테(거의 0볼트) I2C 버스가 작동하지 않습니다.

 

Masters and Slaves 마스터 슬레이브
The devices on the I2C bus are either masters or slaves. The master is always the device that drives the SCL clock line. The slaves are the devices that respond to the master. A slave cannot initiate a transfer over the I2C bus, only a master can do that. There can be, and usually are, multiple slaves on the I2C bus, however there is normally only one master. It is possible to have multiple masters, but it is unusual and not covered here. On your robot, the master will be your controller and the slaves will be our modules such as the SRF08 or CMPS03. Slaves will never initiate a transfer. Both master and slave can transfer data over the I2C bus, but that transfer is always controlled by the master.

I2C 버스의 장치는 마스터 또는 슬레이브입니다마스터는 항상 SCL 클록 라인을 구동하는 장치입니다슬레이브는 마스터에 응답하는 장치입니다마스터만 I2C 버스를 통한 전송을 시작할 있으며 슬레이브는 시작 없읍니다. I2C 버스에는 또는 여러 개의 슬레이브가 있을 있으며 일반적으로 마스터는 하나만 있습니다여러 마스터를 가질 있지만 일반적이지 않으며 여기에서 다루지 않습니다로봇에서 마스터는 컨트롤러가 되고 슬레이브는 SRF08 또는 CMPS03 같은 모듈이 됩니다슬레이브는 전송을 시작하지 않습니다마스터와 슬레이브 모두 I2C 버스를 통해 데이터를 전송할 있지만 해당 전송은 항상 마스터에 의해 제어됩니다.

 

The I2C Physical Protocol I2C 물리적 프로토콜
When the master (your controller) wishes to talk to a slave (our CMPS03 for example) it begins by issuing a start sequence on the I2C bus. A start sequence is one of two special sequences defined for the I2C bus, the other being the stop sequence. The start sequence and stop sequence are special in that these are the only places where the SDA (data line) is allowed to change while the SCL (clock line) is high. When data is being transferred, SDA must remain stable and not change whilst SCL is high. The start and stop sequences mark the beginning and end of a transaction with the slave device.

마스터(컨트롤러) 슬레이브(: CMPS03) 통신하려고 I2C 버스에서 시작 시퀀스를 발행하여 시작합니다시작 시퀀스는 I2C 버스에 대해 정의된 개의 특수 시퀀스 하나이며 다른 하나는 중지 시퀀스입니다시작 시퀀스와 정지 시퀀스는 SCL(클록 라인) 하이인 동안 SDA(데이터 라인) 변경될 있는 유일한 위치라는 점에서 특별합니다데이터가 전송될 SDA 안정적으로 유지되어야 하며 SCL 높은 동안 변경되지 않아야 합니다시작 중지 시퀀스는 슬레이브 장치와의 트랜잭션 시작 끝을 표시합니다.

Data validity  데이터 유지
The data on the SDA line must be stable during the HIGH period of the clock. The HIGH or LOW state of the data line can only change when the clock signal on the SCL line is LOW (see Figure 4). One clock pulse is generated for each data bit transferred.
SDA
라인의 데이터는 클록의 HIGH 기간 동안 변하지 말어야 합니다. 데이터 라인의 HIGH 또는 LOW 상태는 SCL 라인의 클록 신호가 LOW 때만 변경될 있습니다(아래 그림 참조). 전송된 데이터 비트에 대해 하나의 클럭 펄스가 생성됩니다.

Data is transferred in sequences of 8 bits. The bits are placed on the SDA line starting with the MSB (Most Significant Bit). The SCL line is then pulsed high, then low. Remember that the chip cannot really drive the line high, it simply "lets go" of it and the resistor actually pulls it high. For every 8 bits transferred, the device receiving the data sends back an acknowledge bit, so there are actually 9 SCL clock pulses to transfer each 8 bit byte of data. If the receiving device sends back a low ACK bit, then it has received the data and is ready to accept another byte. If it sends back a high then it is indicating it cannot accept any further data and the master should terminate the transfer by sending a stop sequence. 

데이터는 8비트 시퀀스로 전송됩니다비트는 MSB(Most Significant Bit) 시작하는 SDA 라인에 배치됩니다그러면 SCL 라인이 HIGH, LOW 펄스됩니다칩은 실제로 라인을 높게 구동할 없으며 단순히 "놓아버리고"(0으로 만들지 않고 오픈 드레인에 의하여 하이 임피던스 상태) 별도 추가한 풀업저항이 실제로 라인을 높게 끌어당긴다는 점을 기억하십시오. 8비트가 전송될 때마다 데이터를 수신하는 장치는 승인(Ack) 비트를 다시 보내므로 실제로 8비트 바이트의 데이터를 전송하기 위한 9개의 SCL 클록 펄스를 사용 합니다수신 장치가 낮은(0, 0V) ACK 비트를 응답으로 보내면 데이터를 정상 수신했으며 다른 바이트를 받을 준비가 것입니다하이(1, 5V) 다시 보내면 이상 데이터를 받아들일 없으며 마스터는 중지 시퀀스를 보내 전송을 종료해야 함을 나타냅니다

 

Acknowledge (ACK) and Not Acknowledge (NACK) 확인(ACK) 확인하지 않음(NACK)
The acknowledge takes place after every byte. The acknowledge bit allows the receiver to signal the transmitter that the byte was successfully received and another byte may be sent. The controller generates all clock pulses, including the acknowledge ninth clock pulse.
승인은 모든 바이트 후에 발생합니다. 승인 비트를 통해 수신기는 바이트가 성공적으로 수신되었으며 다른 바이트를 보낼 있음을 송신기에 알릴 있습니다. Master ack 9번째 클럭 펄스를 포함하여 모든 클럭 펄스를 생성합니다.
The Acknowledge signal is defined as follows: the transmitter releases the SDA line during the acknowledge clock pulse so the receiver can pull the SDA line LOW and it remains stable LOW during the HIGH period of this clock pulse. Set-up and hold times (specified in Section 6) must also be taken into account.
확인Ack 신호는 다음과 같이 정의됩니다. 송신기가 확인 클록 펄스 동안 SDA 라인을 해제(1 만들고)하므로 수신기는 SDA 라인을 그냥 두거나 LOW 끌어내릴 있고 클록 펄스의 HIGH 기간 동안 안정적인 LOW 유지할 있읍니다 설정 유지 시간도 고려해야 합니다.
 When SDA remains HIGH during this ninth clock pulse, this is defined as the Not Acknowledge signal. The controller can then generate either a STOP condition to abort the transfer, or a repeated START condition to start a new transfer. There are five conditions that lead to the generation of a NACK:
9번째 클록 펄스 동안 SDA HIGH 유지되면 이는 승인되지 않음 신호로 정의됩니다. 그런 다음 Master컨트롤러는 전송을 중단하기 위해 STOP 조건을 생성하거나 전송을 시작하기 위해 반복된 START 조건을 생성할 있습니다..
데이터 전송중 Ack(0)/ Nack(1) 연속 데이터가 있음 여부를 나타내기도 한다

 

I2C Device Addressing I2C 장치 주소 지정
All I2C addresses are either 7 bits or 10 bits. The use of 10 bit addresses is rare and is not covered here. All of our modules and the common chips you will use will have 7 bit addresses. This means that you can have up to 128 devices on the I2C bus, since a 7bit number can be from 0 to 127. When sending out the 7 bit address, we still always send 8 bits. The extra bit is used to inform the slave if the master is  writing to it or reading from it. If the bit is zero the master is writing to the slave. If the bit is 1 the master is reading from the slave. The 7 bit address is placed in the upper 7 bits of the byte and the Read/Write (R/W) bit is in the LSB (Least Significant Bit).

모든 I2C 주소는 7비트 또는 10비트입니다. 10비트 주소의 사용은 드물며 여기서는 다루지 않습니다. 우리의 모든 모듈과 당신이 사용할 공통 칩은 7비트 주소를 가질 것입니다. 이것은 7비트 숫자가 0에서 127까지일 있기 때문에 I2C 버스에 최대 128개의 장치를 가질 있음을 의미합니다. 7비트 주소를 보낼 여전히 항상 8비트를 보냅니다. 추가 비트는 마스터가 슬레이브에 쓰거나 읽고 있는지 슬레이브에 알리는 사용됩니다. 비트가 0( /W ) 이면 마스터는 슬레이브에 쓰겟다는 뜻입니다.. 비트가 1 ( R ) 이면 마스터는 슬레이브에서 읽습니다. 7비트 주소는 바이트의 상위 7비트에 배치되고 읽기/쓰기(R/W) 비트는 LSB(Least Significant Bit) 있습니다. 주소 7비트 보내고, R/W 비트 1 보내고 ACK 비트 1 읽고 입니다.

The placement of the 7 bit address in the upper 7 bits of the byte is a source of confusion for the newcomer. It means that to write to address 21, you must actually send out 42 which is 21 moved over by 1 bit. It is probably easier to think of the I2C bus addresses as 8 bit addresses, with even addresses as write only, and the odd addresses as the read address for the same device. To take our CMPS03 for example, this is at address 0xC0 ($C0). You would uses 0xC0 to write to the CMPS03 and 0xC1 to read from it. So the read/write bit just makes it an odd/even address. 

바이트의 상위 7비트에 있는 7비트 주소의 배치는 초보자에게 혼란의 원인이 됩니다. 이는 주소 21 쓰려면 실제로 1비트만큼 이동된 21 42 보내야 함을 의미합니다. I2C 버스 주소는 짝수 주소가 쓰기 전용이고 홀수 주소가 동일한 장치의 읽기 주소인 8비트 주소로 생각하는 것이 쉬울 것입니다. 예를 들어 CMPS03 주소 0xC0($C0) 있습니다. 0xC0 사용하여 CMPS03 쓰고 0xC1 사용하여 읽습니다. 따라서 읽기/쓰기 비트는 홀수/짝수 주소로 만듭니다.

 

The I2C Software Protocol I2C 소프트웨어 프로토콜
The first thing that will happen is that the master will send out a start sequence. This will alert all the slave devices on the bus that a transaction is starting and they should listen in incase it is for them. Next the master will send out the device address. The slave that matches this address will continue with the transaction, any others will ignore the rest of this transaction and wait for the next. Having addressed the slave device the master must now send out the internal location or register number inside the slave that it wishes to write to or read from. This number is obviously dependant on what the slave actually is and how many internal registers it has. Some very simple devices do not have any, but most do, including all of our modules. Our CMPS03 has 16 locations numbered 0-15. The SRF08 has 36. Having sent the I2C address and the internal register address  the master can now send the data byte (or bytes, it doesn't have to be just one). The master can continue to send data bytes to the slave and these will normally be placed in the following registers because the slave will automatically increment the internal register address after each byte. When the master has finished writing all data to the slave, it sends a stop sequence which completes the transaction. So to write to a slave device: 
가장 먼저 일어날 일은 마스터가 시작 시퀀스를 보내는 것입니다. 이렇게 하면 버스의 모든 슬레이브 장치에 트랜잭션이 시작되고 있음을 알리고 수신 대기해야 합니다. 다음으로 마스터는 장치 주소를 보냅니다. 주소와 일치하는 슬레이브는 트랜잭션을 계속하고 다른 모든 슬레이브는 트랜잭션의 나머지 부분을 무시하고 다음을 기다립니다. 슬레이브 장치에 주소를 지정하면 마스터는 이제 쓰거나 읽고자 하는 슬레이브 내부의 내부 위치 또는 레지스터 번호를 보내야 합니다. 숫자는 분명히 슬레이브가 실제로 무엇이며 얼마나 많은 내부 레지스터가 있는지에 따라 다릅니다. 일부 매우 단순한 장치에는 아무것도 없지만 모든 모듈을 포함하여 대부분이 있습니다. CMPS03에는 0-15까지 번호가 매겨진 16개의 위치가 있습니다. SRF08에는 36개가 있습니다. I2C 주소와 내부 레지스터 주소를 보낸 마스터는 이제 데이터 바이트를 보낼 있습니다. 마스터는 데이터 바이트를 슬레이브로 계속 보낼 있으며 슬레이브가 바이트 후에 내부 레지스터 주소를 자동으로 증가시키기 때문에 일반적으로 다음 레지스터에 배치됩니다. 마스터가 슬레이브에 모든 데이터 쓰기를 마치면 트랜잭션을 완료하는 중지 시퀀스를 보냅니다. 따라서 슬레이브 장치에 쓰려면 다음을 수행하십시오.. 마스터가 슬레이브에 모든 데이터 쓰기를 마치면 트랜잭션을 완료하는 중지 시퀀스를 보냅니다.
1. Send a start sequence
2. Send the I2C address of the slave with the R/W bit low (even address)
3. Send the internal register number you want to write to
4. Send the data byte
5. [Optionally, send any further data bytes]
6. Send the stop sequence.

따라서 슬레이브 장치에 쓰려면 다음을 수행하십시오.
1. 시작 시퀀스 보내기
2. R/W
비트가 낮은(0) 슬레이브의 I2C 주소 보내기(짝수 주소 쓰겠다는 )
3.
쓰려는 내부 레지스터 번호 보내기
4.
데이터 바이트 보내기
5. [
선택적으로 추가 데이터 바이트 보내기]
6.
정지 시퀀스 보내기

As an example, you have an SRF08 at the factory default address of 0xE0. To start the SRF08 ranging you would write 0x51 to the command register at 0x00 like this:
예를 들어 공장 기본 주소 0xE0 SRF08 있습니다. SRF08 범위 지정을 시작하려면 다음과 같이 0x00에서 명령 레지스터에 0x51 씁니다.
1. Send a start sequence
2. Send 0xE0 ( I2C address of the SRF08 with the R/W bit low (even address)
3. Send 0x00 (Internal address of the command register)
4. Send 0x51 (The command to start the SRF08 ranging)
5. Send the stop sequence.
1. 시작 시퀀스를 보냅니다
2. 0xE0( R/W
비트가 낮은 SRF08 I2C 주소(짝수 주소) 보냅니다.
3. 0x00(
명령 레지스터의 내부 주소) 보냅니다.
4. 0x51(SRF08
범위 지정을 시작하는 명령) 보냅니다.
5.
정지 시퀀스를 보냅니다.

 

Reading from the Slave 슬레이브에서 읽기
This is a little more complicated - but not too much more. Before reading data from the slave device, you must tell it which of its internal addresses you want to read. So a read of the slave actually starts off by writing to it. This is the same as when you want to write to it: You send the start sequence, the I2C address of the slave with the R/W bit low (even address) and the internal register number you want to write to. Now you send another start sequence (sometimes called a restart) and the I2C address again - this time with the read bit set. You then read as many data bytes as you wish and terminate the transaction with a stop sequence. So to read the compass bearing as a byte from the CMPS03 module:
이것은 조금 복잡하지만 이상은 아닙니다슬레이브 장치에서 데이터를 읽기 전에 읽고자 하는 내부 주소를 알려야 합니다따라서 슬레이브 읽기는 실제로 슬레이브에 쓰기 시작합니다쓰기를 원할 때와 동일합니다. 시작 시퀀스, R/W 비트가 낮은 슬레이브의 I2C 주소(짝수 주소) 쓰기를 원하는 내부 레지스터 번호를 보냅니다이제 다른 시작 시퀀스(종종 재시작이라고 ) I2C 주소를 다시 보냅니다. 이번에는 읽기 비트가 설정된 상태입니다그런 다음 원하는 만큼의 데이터 바이트를 읽고 중지 시퀀스로 트랜잭션을 종료합니다
1. Send a start sequence
2. Send 0xC0 ( I2C address of the CMPS03 with the R/W bit low (even address)
3. Send 0x01 (Internal address of the bearing register)
4. Send a start sequence again (repeated start)
5. Send 0xC1 ( I2C address of the CMPS03 with the R/W bit high (odd address)
6. Read data byte from CMPS03
7. Send the stop sequence.
따라서 CMPS03 모듈에서 나침반 방위를 바이트로 읽으려면:
1. 시작 시퀀스를 보냅니다.
2. 0xC0( R/W
비트가 낮은( 0 ) CMPS03 I2C 주소(짝수 주소) 전송
3. 0x01(
베어링 레지스터의 내부 주소) 전송
4.
시작 시퀀스 다시 전송(반복 시작)  이부분이 쓰기와 다름
5. R/W
비트가 높은(1) CMPS03 I2C 주소(홀수 주소) 0xC1 전송(홀수 주소) 
  
이부분이 쓰기와 다름,  이에 따라 슬레이브는 데이터를 전송 시작 한다.
6. CMPS03
에서 데이터 바이트 읽기
7.
정지 시퀀스 전송

The bit sequence will look like this: 비트 시퀀스는 다음과 같습니다.

 

 

Wait a moment 잠깐만
That's almost it for simple I2C communications, but there is one more complication. When the master is reading from the slave, its the slave that places the data on the SDA line, but its the master that controls the clock. What if the slave is not ready to send the data! With devices such as EEPROMs this is not a problem, but when the slave device is actually a microprocessor with other things to do, it can be a problem. The microprocessor on the slave device will need to go to an interrupt routine, save its working registers, find out what address the master wants to read from, get the data and place it in its transmission register. This can take many uS to happen, meanwhile the master is blissfully sending out clock pulses on the SCL line that the slave cannot respond to. The I2C protocol provides a solution to this: the slave is allowed to hold the SCL line low! This is called clock stretching. When the slave gets the read command from the master it holds the clock line low. The microprocessor then gets the requested data, places it in the transmission register and releases the clock line allowing the pull-up resistor to finally pull it high. From the masters point of view, it will issue the first clock pulse of the read by making SCL high and then check to see if it really has gone high. If its still low then its the slave that holding it low and the master should wait until it goes high before continuing. Luckily the hardware I2C ports on most microprocessors will handle this automatically.

간단한 I2C 통신에 대한 설명은 거의 되었지만 한가지 복잡한 문제가 있습니다마스터가 슬레이브에서 읽을 SDA 라인에 데이터를 배치하는 것은 슬레이브이지만 클록을 제어하는 ​​것은 마스터입니다슬레이브가 데이터를 보낼 준비가 되지 않았다면 어떻게 될까요!  EEPROM 같은 장치에서는 이것이 문제가 되지 않지만 슬레이브 장치가 실제로 다른 작업을 수행하는 마이크로프로세서인 경우 문제가 있습니다슬레이브 장치의 마이크로프로세서는 인터럽트 루틴으로 이동하고, 작업 레지스터를 저장하고, 마스터가 읽고자 하는 주소를 찾고, 데이터를 가져와 전송 레지스터에 배치해야 합니다이것은 많은 uS 시간이 소요될 있어서, 마스터가 SCL 라인에 클록 펄스를 그냥 보낸다면 동안 슬레이브가 응답할 없을 있읍니다. I2C 프로토콜은 이에 대한 솔루션을 제공합니다슬레이브는 SCL 라인을 낮게 유지할 있습니다이를 클록 스트레칭이라고 합니다슬레이브가 마스터로부터 읽기 명령을 받으면 클록 라인을 낮게 유지합니다그런 다음 슬레이브 마이크로프로세서는 요청된 데이터를 가져와 전송 레지스터에 배치하고 SCL 0으로 만들던 것을 해제하여 풀업 저항이 최종적으로 SCL 높게 끌어올릴 있도록 합니다마스터의 관점에서 SCL 높게 만들어 읽기의 번째 클럭 펄스를 발행한 다음 실제로 높아졌는지 확인합니다여전히 SCL 낮으면 슬레이브가 낮게 유지하고 마스터는 계속하기 전에 높을 때까지 기다려야 합니다다행히 대부분의 마이크로프로세서의 하드웨어 I2C 포트는 이를 자동으로 처리합니다그런 다음 마이크로프로세서는 요청된 데이터를 가져와 전송 레지스터에 배치하고 클럭 라인을 해제하여 풀업 저항이 최종적으로 데이터를 높게 끌어올릴 있도록 합니다마스터의 관점에서 SCL 높게 만들어 읽기의 번째 클럭 펄스를 발행한 다음 실제로 높아졌는지 확인합니다여전히 낮으면 슬레이브가 낮게 유지하고 마스터는 계속하기 전에 높을 때까지 기다려야 합니다다행히 대부분의 마이크로프로세서의 하드웨어 I2C 포트는 이를 자동으로 처리합니다

Sometimes however, the master I2C is just a collection of subroutines and there are a few implementations out there that completely ignore clock stretching. They work with things like EEPROM's but not with microprocessor slaves that use clock stretching. The result is that erroneous data is read from the slave. Beware!
그러나 때로는 마스터 I2C 서브루틴 모음일 뿐이며 클럭 확장을 완전히 무시하는 가지 구현이 있습니다그들은 EEPROM 같은 것들과 함께 작동하지만 클록 스트레칭을 사용하는 마이크로프로세서 슬레이브와는 작동하지 않습니다그럴때는 결과적으로 잘못된 데이터가 슬레이브에서 읽혀집니다조심!

 

Example Master Code               예제 마스터 코드
This example shows how to implement a software I2C master, including clock stretching. It is written in C for the PIC processor, but should be applicable to most processors with minor changes to the I/O pin definitions. It is suitable for controlling all of our I2C based robot modules. Since the SCL and SDA lines are open drain type, we use the tristate control register to control the output, keeping the output register low. The port pins still need to be read though, so they're defined as SCL_IN and SDA_IN. This definition and the initialization is probably all you'll need to change for a different processor.
예제는 클록 확장을 포함하여 소프트웨어 I2C 마스터를 구현하는 방법을 보여줍니다. PIC 프로세서용으로 C 작성되었지만 I/O 정의를 약간만 변경하면 대부분의 프로세서에 적용할 있습니다당사의 모든 I2C 기반 로봇 모듈을 제어하는 ​​ 적합합니다. SCL SDA 라인은 오픈 드레인 유형이므로 3상태 제어 레지스터를 사용하여 출력을 제어하고 출력 레지스터를 낮게 유지합니다포트 핀은 여전히 ​​읽어야 하므로 SCL_IN SDA_IN으로 정의됩니다 정의와 초기화는 아마도 다른 프로세서에 대해 변경해야 전부일 것입니다.

 

#define SCL     TRISB4 // I2C bus
#define SDA     TRISB1 //
#define SCL_IN  RB4    //
#define SDA_IN  RB1    //

 

To initialize the ports set the output resisters to 0 and the tristate registers to 1 which disables the outputs and allows them to be pulled high by the resistors.
포트를 초기화하려면 출력 Port 0으로 설정하고 PullUp상태 레지스터를 1 설정하면 출력이 비활성화되고 저항에 의해 높게 풀링될 있습니다.  SCL, SDA 둘다 PullUp저항으로 1 만들고

SDA = SCL = 1;
SCL_IN = SDA_IN = 0;

 

We use a small delay routine between SDA and SCL changes to give a clear sequence on the I2C bus. This is nothing more than a subroutine call and return.
SDA SCL 변경 사이에 작은 지연 루틴을 사용하여 I2C 버스에서 명확한 시퀀스를 제공합니다이것은 서브루틴 호출 반환에 지나지 않습니다.

 

void i2c_dly(void)
{
}

 

The following 4 functions provide the primitive start, stop, read and write sequences. All I2C transactions can be built up from these.
다음 4개의 함수는 기본 시작, 중지, 읽기 쓰기 시퀀스를 제공합니다모든 I2C 트랜잭션은 이들로부터 구축될 있습니다.

void i2c_start(void)
{
  SDA = 1;             // i2c start bit sequence
  i2c_dly();
  SCL = 1;
  i2c_dly();
  SDA = 0;
  i2c_dly();
  SCL = 0;
  i2c_dly();
}
//  둘다 1 (Hi)에서 SDA 먼저 0(Low) 되고 이후 SCL 0 된다

void i2c_stop(void)
{
  SDA = 0;             // i2c stop bit sequence
  i2c_dly();
  SCL = 1;
  i2c_dly();
  SDA = 1;
  i2c_dly();
}
//  둘다 0에서 SCL 먼저 1이되고 이후 SDL 1 된다.


//  바이트 읽기
unsigned char i2c_rx(char ack)   // ack:  ̺꿡   
{
char x, d=0;
  SDA = 1
  for(x=0; x<8; x++) {    // 8bit 읽기
    d <<= 1;
    do {
      SCL = 1;
    }
    while(SCL_IN==0);    // wait for any SCL clock stretching
    i2c_dly();
    if(SDA_IN) d |= 1;
    SCL = 0;
  } 
  if(ack) SDA = 0;
  else SDA = 1;
  SCL = 1;
  i2c_dly();             // send (N)ACK bit
  SCL = 0;
  SDA = 1;
  return d;
}


//  바이트 쓰기
bit i2c_tx(unsigned char d)
{
char x;
static bit b;
  for(x=8; x; x--) {    // MSB 부터 8비트 보내기
    if(d & 0x80) SDA = 1;
    else SDA = 0;
    SCL = 1;
    d <<= 1;
    SCL = 0;
  }
// Ack 읽기
  SDA = 1;
  SCL = 1;
  i2c_dly();
  b = SDA_IN;          // possible ACK bit
  SCL = 0;
  return b;
}


The 4 primitive functions above can easily be put together to form complete I2C transactions. Here's and example to start an SRF08 ranging in cm:
위의 4가지 기본 기능을 쉽게 결합하여 완전한 I2C 트랜잭션을 형성할 있습니다. cm 단위로 SRF08 시작하는 예는 다음과 같습니다.

i2c_start();              // send start sequence 시작 시퀀스 보내기
i2c_tx(0xE0);             // SRF08 I2C address with R/W bit clear SRF08 R/W
비트 클리어가 있는 I2C 주소
i2c_tx(0x00);             // SRF08 command register address SRF08 명령 레지스터 주소
i2c_tx(0x51);             // command to start ranging in CM cm 단위로 레인징을 시작하라는 명령
i2c_stop();               // send stop sequence 중지 시퀀스 보내기

 

Now after waiting 65mS for the ranging to complete (I've left that to you) the following example shows how to read the light sensor value from register 1 and the range result from registers 2 & 3.
이제 거리 측정이 완료될 때까지 65mS 기다린 (나는 당신에게 맡겼습니다) 다음 예제는 레지스터 1에서 센서 값을 읽고 레지스터 2 3에서 범위 결과를 읽는 방법을 보여줍니다.

i2c_start();              // send start sequence  // 시작 시퀀스 보내기
i2c_tx(0xE0);             // SRF08 I2C address with R/W bit clear
// SRF08 R/W 비트 클리어한  I2C 주소 write
i2c_tx(0x01);             // SRF08 light sensor register address  // SRF08 광센서 레지스터 주소
i2c_start();              // send a restart sequence // 재시작 시퀀스 전송
i2c_tx(0xE1);             // SRF08 I2C address with R/W bit set
// R/W 비트가 설정된 SRF08 I2C 주소 read
lightsensor = i2c_rx(1);  // get light sensor and send acknowledge. Internal register address will increment automatically.
        
// 센서를 가져오고 ack==1 보냅니다(1이면 읽을 거이다). 내부 레지스터 주소는 자동으로 증가합니다
rangehigh = i2c_rx(1);    // get the high byte of the range and send acknowledge.
   
// 범위의 상위 바이트를 가져오고 ack==1 보냅니다(1이면 읽을 거이다). 
rangelow = i2c_rx(0);     // get low byte of the range - note we don't acknowledge the last byte.
  
// 범위의 하위 바이트 가져오기 - 마지막 바이트를 인식하지 않는다는 점에 유의하십시오
i2c_stop();               // send stop sequence  
// 중지 시퀀스 보내기



Easy isn't it?

The definitive specs on the I2C bus can be found on the Philips website. It currently here but if its moved you'll find it easily be googleing on "i2c bus specification".

쉽지 않나요?
I2C
버스의 최종 사양은 필립스 웹사이트에서 확인할 있습니다현재  여기에  있지만 이동하면 "i2c 버스 사양"에서 쉽게 찾을 있습니다.

 

 

*** 추가 사항.

How fast? 얼마나 빨리?
The standard clock (SCL) speed for I2C up to 100KHz. Philips do define faster speeds: Fast mode, which is up to 400KHz and High Speed mode which is up to 3.4MHz. All of our modules are designed to work at up to 100KHz. We have tested our modules up to 1MHz but this needs a small delay of a few uS between each byte transferred. In practical robots, we have never had any need to use high SCL speeds. Keep SCL at or below 100KHz and then forget about it.

I2C 표준 클록(SCL) 속도는 최대 100KHz입니다. Philips 빠른 속도를 정의합니다. Fast 모드는 최대 400KHz이고 High Speed ​​모드는 최대 3.4MHz입니다. 모듈에 따라 일반적으로 최대 100KHz에서 작동하도록 설계되었습니다. 최대 1MHz 이상 까지 모듈을 수도 있지만, 전송된 바이트 사이에 uS 작은 지연이 필요합니다. 실제 로봇에서는 높은 SCL 속도를 사용할 필요가 없었습니다. SCL 100KHz 이하로 유지하고 잊어버리십시오.

 

Reserved addresses  예약된 주소 
Two groups of eight addresses (0000 XXX and 1111 XXX) are reserved for the purposes
8
개의 주소로 구성된 그룹(0000 XXX 1111 XXX) 다음 목적을 위해 예약되어 있습니다.


[1] The general call address is used for several functions including software reset.
[2] No device is allowed to acknowledge at the reception of the START byte.
[3] The CBUS address has been reserved to enable the inter-mixing of CBUS compatible and I2C-bus compatible devices in the same system. I2C-bus compatible devices are not allowed to respond on reception of this address.
[4] The address reserved for a different bus format is included to enable I2C and other protocols to be mixed. Only I2C-bus compatible devices that can work with such formats and protocols are allowed to respond to this address.
[1]
일반 호출 주소는 소프트웨어 재설정을 포함한 여러 기능에 사용됩니다.
[2]
어떤 장치도 START 바이트 수신 승인할 없습니다.
[3] CBUS
주소는 동일한 시스템에서 CBUS 호환 장치와 I2C 버스 호환 장치를 혼합할 있도록 예약되어 있습니다. I2C 버스 호환 장치는 주소 수신 응답할 없습니다.
[4]
다른 버스 형식을 위해 예약된 주소는 I2C 기타 프로토콜이 혼합될 있도록 포함됩니다. 이러한 형식 프로토콜과 함께 작동할 있는 I2C 버스 호환 장치만 주소에 응답할 있습니다.

 

Software reset 소프트웨어 재설정
Following a General Call, (0000 0000), sending 0000 0110 (06h) as the second byte causes a software reset. This feature is optional and not all devices respond to this command. On receiving this 2-byte sequence, all devices designed to respond to the general call address reset and take in the programmable part of their address.
Precautions must be taken to ensure that a device is not pulling down the SDA or SCL line after applying the supply voltage, since these low levels would block the bus.
일반 호출(0000 0000) 이어 번째 바이트로 0000 0110(06h) 전송하면 소프트웨어 재설정이 발생합니다. 기능은 선택 사항이며 모든 장치가 명령에 응답하는 것은 아닙니다. 2바이트 시퀀스를 수신하면 일반 호출 주소에 응답하도록 설계된 모든 장치는 재설정되고 주소의 프로그래밍 가능한 부분을 받아들입니다.
장치가 공급 전압을 적용한 SDA 또는 SCL 라인을 풀다운하지 않도록 주의해야 합니다. 이러한 낮은 레벨은 버스를 차단할 있기 때문입니다.

i2c_bus_specification_1995.pdf
0.20MB
i2c-Spec-Rec21-200101.pdf
0.30MB
i2c-Spec-Rec70-UM10204-nxp-211001.pdf
0.72MB

 

일단 여기 까지 하시고,

 

소스는 추후 올리 겠읍니다.  뭐 내용도 많이 고쳐야  겠지만, 

 

 

 

 

 

 

반응형