기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
이렇게 빠르게 답변을 주신 김재훈님과 고현철님에게 감사드립니다.
두 분께서 언급하신 곳에서 검색을 한 결과 좋은 소스를 확보하여 참조하고 있습니다.
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];
}
24LCxx EEPROM의 데이터쉬트를 참고해보시면 아시겠지만..
Stop 조건이 되기 전까지 EEPROM에서 계속 데이터를 보냅니다...
아마 위 함수 이외에 I2C 인터럽트 함수가 있어서 같이 연동이 될겁니다...
그래서 위 함수만 가지고는 이해하기가 힘이 들겁니다..
인터럽트 함수도 찾아서 같이 확인해보시길.. ^^;