기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

이렇게 빠르게 답변을 주신 김재훈님과 고현철님에게 감사드립니다.

두 분께서 언급하신 곳에서 검색을 한 결과 좋은 소스를 확보하여 참조하고 있습니다.

Read 관련하여  S3C44B0x의 Data Sheet에 나온 I2C Master/Receiver Mode의 Flowchart에 의문이 있어 질문을 하나 더 드립니다.

Data Sheet에 나온 진행 순서를 적어보면 다음과 같습니다.

  1. Master Rx Mode로 설정
  2. IICDS에 slave address를 설정
  3. IICSTAT에 0xF0 write 
        ==> 이 부분은 문서 오류로 보이네요. Master/Receiver Mode에 대한 start는 0xB0인것으로 보여짐
  4. IICDS에 저장된 값이 slave device로 전송됨
  5. ACK 신호를 받기 위해 Interrupt를 기다림
  6. IICDS값을 읽음
  7. Clear Pending bit
  8. 5번 상태로 진입
   ....

이런 순서로 진행이 된다고 적혀져있습니다.

여기서, 질문 하나가 있습니다.

I2C통신에서 Slave Device의 특정 Resiger에 있는 값을 읽기 위해서는
Slave Device Addree와 Register Address를 Slave Device로 전달해야 될것 같은데,
위의 flowchart에서 Register Address를 주는 부분이 없이 단지 Slave Device Address만을 전달하고 있습니다.

이것이 의미하는 것이 단지 Slave Device에 존재하는 모든 Register를 순차적으로 전부 전달하겠다라는 의미인지
궁금합니다.

Flow Chart를 여러번 봐도 도저히 답이 나오질 않는 상태입니다.

P.S. 참고하는 소스에선, read하기 위해 Master/Transmitter 모드로 시작하여 재차 Master/Receiver모드로 전환하는 구조로 되어져 있어
더 의문만 생기는 입장이네요.

현재 제가 보고 있는 소스의 Read 함수입니다.
void Rd24LCxx(U32 slvAddr,U32 addr,U8 *data)
{
    _iicMode=SETRDADDR;
    _iicPt=0;
    _iicData[0]=(U8)addr;
    _iicDataCount=1;

    rIICDS=slvAddr;
    rIICSTAT=0xf0; //MasTx,Start 
    //Clearing the pending bit isn't needed because the pending bit has been cleared.
    while(_iicDataCount!=-1);

    _iicMode=RDDATA;

    _iicPt=0;
    _iicDataCount=1;
   
    rIICDS=slvAddr;
    rIICSTAT=0xb0; //MasRx,Start
    rIICCON=0xaf;  //resumes IIC operation.  
    while(_iicDataCount!=-1);

    *data=_iicData[1];
}











just4you

2009.03.28 07:34:34
*.254.248.156

참고하시는 함수는 24LCxx라는 시리얼 EEPROM을 읽는 함수입니다...

24LCxx EEPROM의 데이터쉬트를 참고해보시면 아시겠지만..
Stop 조건이 되기 전까지 EEPROM에서 계속 데이터를 보냅니다...

아마 위 함수 이외에 I2C 인터럽트 함수가 있어서 같이 연동이 될겁니다...
그래서 위 함수만 가지고는 이해하기가 힘이 들겁니다..
인터럽트 함수도 찾아서 같이 확인해보시길.. ^^;

이훈기

2009.04.07 14:06:03
*.76.137.41

자료실에 I2C spec을 올렸습니다. 참고하시기 바랍니다. I2C는 여러가지 모드 (7bit or 10 bit addressing mode, combined read/write, fast mode)가 가능하기 때문에, I2C 디바이스가 보드상에 어떻게 구성되어 있느냐, 어떤 캐패빌리티를 가지고 있느냐를 같이 보셔야 할 겁니다.
짧은 지식으로나마, 님의 질문에 제 생각을 적어보자면,

원글: I2C통신에서 Slave Device의 특정 Resiger에 있는 값을 읽기 위해서는 Slave Device Addree와 Register Address를 Slave Device로 전달해야 될것 같은데, 위의 flowchart에서 Register Address를 주는 부분이 없이 단지 Slave Device Address만을 전달하고 있습니다.

이훈기: I2C 스펙에 의하면, StartCondition 이후에 무조건 첫번째 바이트는 SlaveDevice의 address가 되어야 하고요. 두번째 바이트는 정의가 없습니다. 만약 마스터가 두번째 바이트에 sub-address를 적는다면, 그것은 I2C device가 두번째 바이트를 인터널 레지스터의 주소로 이해하는 디바이스라는 의미입니다. (Page 10, Note 1). 플로우 차트에는 없지만 소스에 보시면, 처음 while문에서 SlvAddr와 인자로 들어온 addr를 쓰고 있는 것처럼 보입니다. (iicData[0] = addr, iicDataCount = 1;)

원글: 이것이 의미하는 것이 단지 Slave Device에 존재하는 모든 Register를 순차적으로 전부 전달하겠다라는 의미인지
궁금합니다.

I2C 스펙 Page 10, Note 2 에 의하면,  연속적인 읽기/쓰기시에 자동으로 증가/감소는 디바이스의 디자이너가 결정한다고 합니다. 만약, 마스터가 두번째 바이트에 인터널 레지스터의 주소를 적은 다음에 (Start/Stop Condition 없이) 계속 읽거나 쓰면, 증가/혹은 감소된 주소를 억세스 할 것입니다 (증가/감소의 결정은 디바이스-디펜던트하겠지만요) . I2C 스펙상으로는 말씀하신대로 여러 레지스터를 순차적으로 접근하는 것이 가능합니다만. 올려주신 소스만 보자면, 제 느낌에는, 여러 레지스터를 한꺼번에 많이 읽는 것이 아니라, 두번째 인자로 전달된 addr 즉, 슬레이브 디바이스내의 레지스터, 주소를 딱 한개만 읽는것 같습니다. ( 두번째 while문에서, _iicDataCount=1; 이니까요)

원글 : P.S. 참고하는 소스에선, read하기 위해 Master/Transmitter 모드로 시작하여 재차 Master/Receiver모드로 전환하는 구조로 되어져 있어 더 의문만 생기는 입장이네요.

이훈기: I2C는 언제나 마스터가 슬레이브 디바이스 어드레스와 sub address 주소를 인보크하기 때문에, 읽는 오퍼레이션도 처음는 마스터의 Tx로 설정하는 것이 맞습니다. slave device address의 LSB가 '0'이면 마스터가 쓰는 것이고, '1' 이면 마스터가 읽는 (슬레이브가 쓰는) 작업입니다. 위의 소스에서는 SlvAddr의 LSB를 체크하지 않았지만, caller가 아마도 홀수 어드레스를 주었을 것입니다. 일반적으로 좋은 서브루틴을 짜실때에는 Read 오퍼레이션시 SlvAddr |= 1, Write 오퍼레이션시 SlvAddr &= ~0x1; 같이 슬레이브 어드레스의 LSB를 make sure 해주셔야 합니다.
그 다음에 slave addres가 홀수라면, 이제부터 SDA는 device가 구동하는 것입니다. 호스트는 SCL만 올렸다 내렸다 하면서, SDA를 읽으면 됩니다. 읽기 모드에 대해서는 I2C 스펙 8.0 절에 "Master reads slave immediately after first byte) 과 그림 13을 참고하시기 바랍니다.
스펙에는 첫번째 바이트라고 나와있지만, 만약 디바이스가 두번째 바이트를 인터널 주소로 이해한다면, 두번째 바이트라고 읽으셔야 합니다.
SDA 핀이 만약에 마스터디바이스의 GPIO로 되어 있다면, 쓰기시에는 output direction, 읽기시에는 input direction으로 바꾸시는 것 잊지 마시구요. (SCL핀은 언제나 output direction 입니다.)
List of Articles
번호 제목 글쓴이 날짜 조회 수
428 clock 변경 관련 질문 [6] 최영진 2009-04-23 890
427 6410 보드 카메라 & 무선랜 관련 세미나 질문드려요 ^-^; [2] 서덕재 2009-04-22 852
426 Bootloader 기초적인 질문.. [4] 김형태 2009-04-17 1008
425 g.711 포맷의 음성파일2개 합치는 방법 [4] 최강산 2009-04-17 1132
424 Bootloader 분석중... [3] 김형태 2009-04-17 1051
423 RealView Multi-ICE에 대해서... [5] 김형태 2009-04-14 1161
422 USB 와 YAFFS2 파일시스템 문의 [2] 한진희 2009-04-12 1605
421 kernel 2.6 uart device driver관련질문 [4] 문철민 2009-04-10 953
420 compile error 좀 부탁드립니다. [2] 최영진 2009-04-09 704
419 ( aESOP S3C6410 보드) LMS350DF01 LCD 및 터치 스크린 구매관... [2] 김성도 2009-04-09 1955
418 임베디드리눅스 GUI 설계쪽 경험자분께 문의드립니다 [3] 장석원 2009-04-09 1128
417 6410 칩 수급 관련해서 질문드립니다. [1] 홍경동 2009-04-06 635
416 TFT-LCD 16bit 모드상에서의 문제 [3] 한석준 2009-04-04 879
415 [재질문]u-boot의 pxa255소스에서 16bit bitmap 이미지 지원을 안하... [2] 한석준 2009-03-30 824
414 virtualbox linux apt-get timeout [2] 오태호 2009-03-30 1337
413 몇차보드인걸까여?; [2] 서승원 2009-03-28 982
» FW에서 I2C 제어하기 - 2탄 [2] 최현정 2009-03-27 2257
411 기존의 u-boot소스에서 16bit bitmap 이미지 지원을 안하나요? [3] 한석준 2009-03-27 1191
410 FW에서 I2C 제어하기 [2] 최현정 2009-03-27 1344
409 이더넷 MAC내장한 CPU중에 제일 가격이 싼것은? [3] 민세홍 2009-03-27 1081

사용자 로그인