EEPROM 은 전기가 없어도 데이터가 보존되는 비휘발성 메모리입니다.
대부분 8핀 소자이고, I2C 통신 또는 SPI 통신방식으로 되어 있습니다. 여기에선 I2C 통신방식인 24LC32를 사용해 보도록 하겠습니다.
24LC32는 4K Byte의 EEPROM 입니다. 디바이스명이 32로 끝난다고 해서 32K 바이트가 아닙니다. 여기서 32는 32K BIT 를 의미합니다. 따라서 나누기 8을 해야 바이트단위의 메모리 양을 알수 있습니다. (모든 메모리 소자가 그렇습니다. 29F512 는 64K바이트입니다.)
큐블록 내부에도 4K BYTE의 EEPROM이 있지만, I2C 통신도 공부할겸 추가로 EEPROM을 달아보겠습니다.
Const Device = CB220 Dim adr As Integer Dim data As Byte Dim a As Byte data = &ha6 adr = &h3 Set I2c 7,6 Do I2cstart If I2cwrite(&b10100000)= 1 Then Goto err_proc a=I2cwrite(adr.byte1) a=I2cwrite(adr.lowbyte) a=I2cwrite(data) I2cstop Delay 10 '10밀리초 대기 I2cstart a=I2cwrite(&b10100000) a=I2cwrite(adr.byte1) a=I2cwrite(adr.lowbyte) I2cstart a=I2cwrite(&b10100001) a=I2creadna(0) I2cstop Debug Hex a,cr ADR = ADR + 1 DATA = DATA + 1 Loop err_proc: Debug "Error !" Do Loop
큐블록에서 I2C 통신을 사용하기 위해서 제일먼저 SET I2C 명령을 써주어야 합니다.큐블록의 수많은 I/O포트중 어떤 포트를 I2C용으로 할당할 지 결정해주는 명령어입니다.
SET I2C 데이터포트, 클록포트
그리고 I2C통신 WRITE 명령어는 I2CWRITE 명령으로 합니다.I2C통신 수신은 I2CREAD 명령으로 합니다.
I2CSTART 와 I2CSTOP은 각각 시작과 끝을 의미합니다.
데이터 시트를 보면 24LC32의 어드레스는 이렇게 3바이트로 보내야 된다고 되어 있습니다. 그래서 큐블록 소스에서 이렇게 명령어를 썼습니다.
If I2cwrite(&b10100000)= 1 Then Goto err_proc
a=I2cwrite(adr.byte1) a=I2cwrite(adr.lowbyte)
첫번째 바이트에서 IF문으로 비교를 한 이유는 통신에러를 검출하기 위해서입니다. EEPROM 이 없거나, 통신선이 단선되었을때, 응답(ACK)이 없습니다. 이 경우 1을 리턴합니다. 1이검출되면 뭔가 잘못된겁니다. 그래서 에러 처리루틴으로 빠집니다.
그 다음부터는 구지 에러검사를 할 필요가 없습니다. 맨앞에 전송데이터에 ACK 가 있었다면, 제대로 연결된것입니다.
EEPROM 에 WRITE하는 동작부터 설명드리겠습니다. 데이터 시트를 보니 다음과 같이 I2C 통신을 하면 EEPROM 에 한바이트를 라이팅할 수 있다고 그림이 나와있습니다.
그래서 큐블록에서 이렇게 프로그램 하였습니다.
I2cstart If I2cwrite(&b10100000)= 1 Then Goto err_proc a=I2cwrite(adr.byte1) a=I2cwrite(adr.lowbyte) a=I2cwrite(data) I2cstop Delay 10
어드레스를 3바이트 보내고, 데이터까지 보낸뒤 STOP을 합니다.
그리고 10밀리초를 대기합니다. EEPROM 에 라이팅하는 시간입니다. 이 시간동안은 EEPROM 에 어떠한 I2C 통신 시도를 해서는 안됩니다.
다음은 읽는 동작입니다.
복잡해 보이지만 크게 두개의 구간으로 나뉩니다.
어드레스를 WRITE 하는 동작과 데이터를 READ 하는 동작입니다.
I2cstart a=I2cwrite(&b10100000) a=I2cwrite(adr.byte1) a=I2cwrite(adr.lowbyte) I2cstart a=I2cwrite(&b10100001) a=I2creadna(0) I2cstop
이 부분이 실행되면, 변수 a 에는 EEPROM 으로 읽어온 데이터가 저장됩니다.
위의 그림을 보면 맨뒤에 DATA READ는 NO ACK 라고 되어 있습니다. 그래서 Readna 함수를 사용하였습니다.
Readna 함수는 ACK를 발생시키지 않고 1 바이트를 읽어오는 함수입니다.