'embeded/i2c'에 해당되는 글 8건

  1. 2022.12.27 linux i2c 예제
  2. 2018.04.26 i2c 자료
  3. 2018.04.26 i2c mode - tm4c
  4. 2018.04.26 i2c BUS에 pull-up, pull-down
  5. 2015.09.02 i2c bank switching
  6. 2012.01.10 i2c 정리 4
  7. 2011.11.28 I2C 2
  8. 2009.01.14 SMBus 넌 머냐? - System Management Bus 2
embeded/i2c2022. 12. 27. 11:02

i2c read 예제

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>

const int bus = 0;
const unsigned long slave_addr = 0xA0;
const unsigned short sub_addr = 0x10;

int main()
{
int fd;
int rval;
char path[20];
unsigned char buf[2];
unsigned char rxd[1];

sprintf(path, "/dev/i2c/%d", bus);

fd = open(path, O_RDWR);

if ((fd < 0) && (errno == ENOENT)) {
sprintf(path, "/dev/i2c-%d", bus);

fd = open(path, O_RDWR);
}

if (fd < 0) {
fprintf(stderr, "Can't open file '/dev/i2c-%d' or '/dev/i2c/%d': %s\r\n", bus, bus, strerror(errno));

exit(EXIT_FAILURE);
}

// Read 1byte
ioctl(fd, I2C_SLAVE, slave_addr);

buf[0] = (sub_addr & 0xFF00) >> 8;
buf[1] = sub_addr & 0xFF;

if ((rval = write(fd, buf, 2)) < 0) {
fprintf(stderr, "Writing error! (%lX): %s\r\n", slave_addr, strerror(errno));

exit(EXIT_FAILURE);
}

if ((rval = read(fd, rxd, sizeof(unsigned char))) < 0) {
fprintf(stderr, "Reading error! (%lX): %s\r\n", slave_addr, strerror(errno));

exit(EXIT_FAILURE);
}

fprintf(stdout, "Read 1byte = 0x%02X\r\n", rxd[0]);

close(fd);

return 0;
}

[링크 : https://infoarts.tistory.com/40]

[링크 : https://southlife.tistory.com/21]

'embeded > i2c' 카테고리의 다른 글

i2c 자료  (0) 2018.04.26
i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
Posted by 구차니
embeded/i2c2018. 4. 26. 15:05


[링크 : https://www.i2c-bus.org/]


10bit address

0b11110xxM 0bxxxxxxxx

M은 Read/Write

xx 총 10비트로 7비트에서 확장하여 장치를 더 많이 사용 가능함

RW는 첫 바이트(?)에만 나오므로 두번째 바이트는 기존에 장치 register address로 쓰이던 부분임

0x78~ 0x7B(120~123) 주소로 시작하면 10비트 어드레싱으로 간주하면 된다


7비트 addressing 일 경우

0~127 까지 가능한데 그럼 7비트랑 10비트랑 어떻게 구분해야 하려나?

[링크 : https://www.i2c-bus.org/addressing/10-bit-addressing/]



반복 start 상태는 

ACK 받은 후 STOP으로 진행후 idle로 빠지는게 아니라

ACK 받은 후 START로 진행후 한번더 전송하는 상태이다.

[링크 : https://www.i2c-bus.org/repeated-start-condition/]



---

버스트

[링크 : https://blog.naver.com/specialist0/220645221966]

'embeded > i2c' 카테고리의 다른 글

linux i2c 예제  (0) 2022.12.27
i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
Posted by 구차니
embeded/i2c2018. 4. 26. 12:31

데이터시트 내용중에

Four I2C modes
– Master transmit
– Master receive
– Slave transmit
– Slave receive 
 

요런게 보이는데, 풀어 쓰다면

마스터 모드 - master가 slave로 전송 / slave가 master로 부터 받기

마스터 모드 - slave가 master로 전송 / master가 slave로 부터 받기

슬레이브 모드 - slave가 master로 전송 / master가 slave로 부터 받기

슬레이브 모드 - master가 slave로 전송 / slave가 master로 부터 받기 

요렇게 해석이 가능하다.


I2C 통신은 아래와 같이 이루어 지는데 Master에 의해서 SCL이 생성되고
마스터에 의해서 통신이 시작되고(START)

마스터가 쓰는 데이터 = 통신할 slave의 주소 + Read/Write(혹은 Receive/Send) 

슬레이브의 응답 = ACK
마스터가 쓰는 데이터 = slave의 register 주소
슬레이브의 응답 = ACK
마스터가 쓰는 데이터 = register의 data
슬레이브의 응답 = ACK

마스터에 의해서 통신이 종료되게 된다.(STOP)


 

I2C 레지스터 관련 내용 





Driverlib에 정의된 내용

#define I2C_MASTER_CMD_SINGLE_SEND                                            \

                                0x00000007

#define I2C_MASTER_CMD_SINGLE_RECEIVE                                         \

                                0x00000007

#define I2C_MASTER_CMD_BURST_SEND_START                                       \

                                0x00000003

#define I2C_MASTER_CMD_BURST_SEND_CONT                                        \

                                0x00000001

#define I2C_MASTER_CMD_BURST_SEND_FINISH                                      \

                                0x00000005

#define I2C_MASTER_CMD_BURST_SEND_STOP                                        \

                                0x00000004

#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP                                  \

                                0x00000004

#define I2C_MASTER_CMD_BURST_RECEIVE_START                                    \

                                0x0000000b

#define I2C_MASTER_CMD_BURST_RECEIVE_CONT                                     \

                                0x00000009

#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH                                   \

                                0x00000005

#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP                               \

                                0x00000004

#define I2C_MASTER_CMD_QUICK_COMMAND                                          \

                                0x00000027

#define I2C_MASTER_CMD_HS_MASTER_CODE_SEND                                    \

                                0x00000013

#define I2C_MASTER_CMD_FIFO_SINGLE_SEND                                       \

                                0x00000046

#define I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE                                    \

                                0x00000046

#define I2C_MASTER_CMD_FIFO_BURST_SEND_START                                  \

                                0x00000042

#define I2C_MASTER_CMD_FIFO_BURST_SEND_CONT                                   \

                                0x00000040

#define I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH                                 \

                                0x00000044

#define I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP                             \

                                0x00000004

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START                               \

                                0x0000004a

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT                                \

                                0x00000048

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH                              \

                                0x00000044

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP                          \

                                0x00000004


#define I2C_O_MCS               0x00000004  // I2C Master Control/Status 


void

I2CMasterControl(uint32_t ui32Base, uint32_t ui32Cmd)

{

    //

    // Check the arguments.

    //

    ASSERT(_I2CBaseValid(ui32Base));

    ASSERT((ui32Cmd == I2C_MASTER_CMD_SINGLE_SEND) ||

           (ui32Cmd == I2C_MASTER_CMD_SINGLE_RECEIVE) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_START) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_START) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_QUICK_COMMAND) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_SINGLE_SEND) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_START) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_HS_MASTER_CODE_SEND));


    //

    // Send the command.

    //

    HWREG(ui32Base + I2C_O_MCS) = ui32Cmd;



값대로 정렬하면 아래처럼 나오는데

CONT 0x01

START 0x03

STOP 0x04

FINISH 0x05

_SINGLE_ 0x07

로 끝나게 된다.


I2C_MASTER_CMD_BURST_SEND_CONT 0x00000001


I2C_MASTER_CMD_BURST_SEND_START 0x00000003


I2C_MASTER_CMD_BURST_SEND_STOP 0x00000004

I2C_MASTER_CMD_BURST_SEND_ERROR_STOP 0x00000004

I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP 0x00000004

I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP 0x00000004

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP 0x00000004


I2C_MASTER_CMD_BURST_SEND_FINISH 0x00000005

I2C_MASTER_CMD_BURST_RECEIVE_FINISH 0x00000005


I2C_MASTER_CMD_SINGLE_SEND 0x00000007

I2C_MASTER_CMD_SINGLE_RECEIVE 0x00000007


I2C_MASTER_CMD_BURST_RECEIVE_CONT 0x00000009

I2C_MASTER_CMD_BURST_RECEIVE_START 0x0000000b


I2C_MASTER_CMD_HS_MASTER_CODE_SEND 0x00000013


I2C_MASTER_CMD_QUICK_COMMAND 0x00000027

I2C_MASTER_CMD_FIFO_BURST_SEND_CONT 0x00000040

I2C_MASTER_CMD_FIFO_BURST_SEND_START 0x00000042

I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH 0x00000044

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH 0x00000044

I2C_MASTER_CMD_FIFO_SINGLE_SEND 0x00000046

I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE 0x00000046

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT 0x00000048

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START 0x0000004a 



+

데이터시트에는 존재하지 않는 오프셋 주소다.. ㄷㄷ

burst mode랑 multibyte랑 다른거 같긴한데 모르겠네..

#define I2C_O_MBLEN             0x00000030  // I2C Master Burst Length

#define I2C_O_MBCNT             0x00000034  // I2C Master Burst Count 


I2CMCS에 write 레지스터는.. 0x10까지만 공개되어 있네?

#define I2C_MCS_BURST           0x00000040  // Burst Enable 


공개가 안된건.. 해당 칩셋에서는 burst mode 사용불가인거 겠지?



state라고 하긴 애매한데

idle(통신을 잡지 않은 상태)

start (SDA,SCL Low, 통신 시작)

transmit(address LSB에 Write)

receive(address LSB에 Read)

stop (통신을 놓음)

repeat start(통신을 놓지 않고 다른 장치나 주소로 통신)

run (ACK 이후에 stop이나 transmit/recieve로 가는 상태)


이러한 상태들이 존재하게 된다.

그림으로 그리려니 참 애매해지네


그런 이유로... i2c 구현시에 함수들이 uart 처럼 단순하지 않고

토막토막 나있는 것으로 보인다.


I2CMasterControl()은

i2c driver의 state machine을 통제하고

i2c 로직에서는

장치 주소와, 데이터를 가지고 있고

state machine의 값을 이용해

어떤식으로 데이터를 보낼지 결정하게 된다.

(그래서 더 복잡한 듯)


+

2018.04.27

그러니까.. 1 byte를 기준으로 보내는데

바이트 별로 설정을 해줘야하고

그 설정에 통신을 끝낼지 이어서 전송을 할게 있는지를 설정해주는게 은근복잡했던 것..

'embeded > i2c' 카테고리의 다른 글

linux i2c 예제  (0) 2022.12.27
i2c 자료  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
Posted by 구차니
embeded/i2c2018. 4. 26. 12:27

MCU 데이터시트를 보다보니 신기한거(?) 발견

I2C 에서 SCL/SDA에 둘다 풀업이 걸려있다.


그리고 HIGH->LOW로 가면서 통신이 이루어지게 된다.


혹시나 해서 봤는데..

UART 역시 TX 기준 HIGH에서 LOW로 떨어트린 다음 시작하게 된다.


SSI는... LOW에서 HIGH 가네?




아무튼 얼추 주워들은 이야기라 근거, 출처를 아직 못 찾아 봤지만

어떤 의미로 통신은

한쪽에서 전압을 떨구거나 올리는 스위치를 통해 이뤄지는 것이라 pull-up, pull-down이 중요하다고 한다.


I2C의 경우에는 Pull-up으로 통신라인이 구성되고

데이터를 보내기 위해서는 I2C Driver에서 내부적으로 GND로 돌려주는 작업을 하면 

BUS 라인내에서 간단하게 Logical 0과 1을 표현할 수 있고

받는 쪽에서도 rising edge나 falling edge를 탐지하면 인터럽트로 처리가 가능하니

통신이란 거진 이런 양상을 뛰는 걸지도?


SSI같이 Low에서 High로 가는건

Pull-down으로 구성하고, 드라이버 내에서 logical 1을 표현시에는

Driver에 인가되는 Vcc를 스위칭 해주는 것으로 구현될 것으로 추측된다.

'embeded > i2c' 카테고리의 다른 글

i2c 자료  (0) 2018.04.26
i2c mode - tm4c  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
I2C  (2) 2011.11.28
Posted by 구차니
embeded/i2c2015. 9. 2. 17:31

주소번지의 한계를 넘기기 위해 

일종의.. 페이징? 이라고 해야 하려나?


Bank Switching Operation

I2C can access 256 addresses directly (i.e. 0x00 through 0xFF).

SMBus can access 128 addresses directly (i.e. 0x00 through 0x7F).

NB3H5150 has an address space which goes up to 0x14F. Therefore, a “bank switching” mechanism is included to allow access to all addresses no matter which bus protocol is used. Effectively, the two bank select bits are appended to the most-significant end of the seven-bit byte offset, creating a nine-bit address. The bank switch control bits(6:7) are located in Register 0x21.

The most significant two bits of that register are used for bank selection; the least significant six bits are used for the READBYTECOUNT Function.


[링크 : http://www.onsemi.com/pub_link/Collateral/NB3H5150_I2C_MANUAL.PDF]

'embeded > i2c' 카테고리의 다른 글

i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c 정리  (4) 2012.01.10
I2C  (2) 2011.11.28
SMBus 넌 머냐? - System Management Bus  (2) 2009.01.14
Posted by 구차니
embeded/i2c2012. 1. 10. 23:32
i2c는 1선은 데이터 1선은 클럭을 보내는 구조인데
문서마다 조금씩 다르게 나오고 칩마다 설명이 달라서 모호한 감이 없진 않지만..

아무튼 용어를 정의하자면

i2c는 Master와 Slave로 구성되며

 - Master는 SCL을 통해 클럭을 생성하며, 데이터를 요청하는 주체가 되는 녀석이고
 - Slave는 Master의 요청에 따라 데이터를 받거나 요청시 보내주는 녀석이다.

2개의 선로를 통해 통신을 하며

 - SDA는 데이터를 주고 받으며(즉, Master 기준 Input / Output 전환이 필요하다)
 - SCL은 데이터 구분을 위한 클럭을 Master에 의해서 유지하게 된다.

통신을 주고 받기 위해 Slave에는 Address가 부여된다.

 - 7bit의 경우 상위 4bit의 host Address 하위 3bit의 동일 장치에 대한 구분용 device address가 존재한다.
 - 10bit도 존재한다.(자세한 내용은 http://www.i2c-bus.org/addressing/10-bit-addressing/ 참조)

Bus Empty / Start(start&start continue) / 1bit (data&ACK) / STOP 의 상황이 있다.

 - Bus Empty 는 SCL 과 SDA가 모두 High로 아무도 버스를 사용하지 않는 상황
 - Start는 SCL이 High인 상황에서 SDA가 High 에서 Low로 떨어지는 상황
 - Stop은 SCL이 High인 상황에서 SDA가 Low 에서 High로 올라가는 상황
 - 1bit는 SCL을 SDA가 감싸면서 Low -> High-> Low로 변화하는 상황이다.

통신은 다음의 순서를 따른다.
 - Bus Empty 인 것을 확인하고(둘다 high 임을 확인)
 - Start로 SDA와 SCL을 low로 설정하고
 - 7bit Address를 보내고 1bit의 Write/Read를 보내고(대개는 합쳐서 1byte로 처리함)
 - ACK를 수신하기 위해 SDA의 방향을 Master기준 input으로 변경하고 SCL만 출력한다. (클럭만 내고 처리안하기도 함)
 - 실어보낼 데이터를 전송하고(1byte)
 - ACK를 수신하기 위해 SDA의 방향을 Master기준 input으로 변경하고 SCL만 출력한다. (클럭만 내고 처리안하기도 함) 
 - 더이상 전송할 데이터가 없으면 SDA와 SCL을 high로 설정해 Stop임을 알리고 버스를 놓는다.

i2c 장치에 따라서 다음과 같이 전송을 하게 된다.
(장치내부의 레지스터 주소로 앞의 DATA를 1바이트나 2바이트로 사용하기도 한다.)
 - S / ADDR / ACK / DATA / P
 - S / ADDR / ACK / DATA / ACK / DATA / ACK / P
 - S / ADDR / ACK / DATA / ACK / DATA / ACK / Sr / DATA / ACK / DATA / ACK / P


 

 

 

음.. 이녀석은 STOP이 잘못그려진듯? SCL이 LOW에서 High 변화되어 한다.
[링크 : http://achiven.tistory.com/entry/I2c란]

2011/11/28 - [하드웨어] - I2C

'embeded > i2c' 카테고리의 다른 글

i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
I2C  (2) 2011.11.28
SMBus 넌 머냐? - System Management Bus  (2) 2009.01.14
Posted by 구차니
embeded/i2c2011. 11. 28. 17:54

I2C

SDA의 폭이 SCL 보다 크다는 점은
아마도.. SCL의 Rising edge에 트리거 되서 SDA의 값을 읽기 때문이 아닐까? 라는 망상중

Timing sheet


아무튼, ACK는 slave가 쓰는건데
그렇다면.. Master에서 ACK에 대한 SCL은 생성하지 않아도 되는걸려나?
흐음.. Slave->Master를 보면 ACK가  색상이 다르네 -_- 어렵다 ㅠ.ㅠ

Master -> Slave (Write)


Slave -> Master (Read)


[링크 : http://www.best-microcontroller-projects.com/i2c-tutorial.html]

[링크 : http://en.wikipedia.org/wiki/I2C]
[링크 : http://achiven.tistory.com/entry/I2c란]
[링크 : http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html]

[링크: http://i2c2p.twibright.com/spec/i2c.pdf]

'embeded > i2c' 카테고리의 다른 글

i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
SMBus 넌 머냐? - System Management Bus  (2) 2009.01.14
Posted by 구차니
embeded/i2c2009. 1. 14. 16:08
SMBus는 예전에는 안보였는데, 어느샌가 부터 야곰야곰 보이기 시작한 녀석이다.
눈에 띄기 시작한건 아마도.. 2기가 급이 넘어 가면서 부터였던것 같다.(노트북 제외)

그냥 머하는건지 BUS인가 보다 넘어 갔는데 문득 호기심이 발동하였다.

I2C 처럼 BUS 방식의 시리얼 통신이고, 전원관리 칩들, 온도, 팬 , 전압 센서등 연결하고 있다고 한다.
예전 같으면 BIOS에서 cpu / chasis / system 온도계 3개만 지원했는데 비해서
요즘에는 센서들이 너무 많아서 일일이 하나의 GPIO를 할당하기에는 무리가 있어서 BUS로 돌렸나보다.

The System Management Bus (abbreviated to SMBus or SMB) is a simple two-wire bus, derived from I²C and used for communication with low-bandwidth devices on a motherboard, especially power related chips such as a laptop's rechargeable battery subsystem (see Smart Battery Data). Other devices might include temperature, fan or voltage sensors, lid switches and clock chips. PCI add-in cards may connect to an SMBus segment

The SMBus was defined by Intel in 1995. It carries clock, data, and instructions and is based on Philips' I²C serial bus protocol. Its clock frequency range is 10 kHz to 100 kHz. (PMBus extends this to 400 kHz.) Its voltage levels and timings are more strictly defined than those of I²C, but devices belonging to the two systems are often successfully mixed on the same bus.


[SMBus wikipedia : http://en.wikipedia.org/wiki/System_Management_Bus]

Differences between I2C and SMBus

In general, the I2C bus and SMBus are compatible, but there are some subtle differences between the two that could cause some problems. The following table summarizes the differences between the two buses.


I2C SMBus
Clock Speed
Minimum none 10 kHz
Maximum
100 kHz (Standard mode)
400 kHz (Fast mode)
2 MHz (High Speed mode)
100 kHz
Timeout none 35 ms

Electrical Characteristics
VHIGH
Fixed Voltage 3.0 to VDDmax + 0.5V
VDD Relative 0.7 to VDDmax + 0.5V
2.1V -> VDD
VLOW
Fixed Voltage -0.5 to 1.5
VDD Relative -0.5 to 0.3VDD
to 0.8V
Max Current 3 mA 350 µA


[출처 : http://www.totalphase.com/support/articles/article06/]

'embeded > i2c' 카테고리의 다른 글

i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
I2C  (2) 2011.11.28
Posted by 구차니