성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • ARM Reverse Engineering
  • MFC
  • 문자열 나누기
  • WINAPI
  • Boot Code 분석

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

AVR2560

2013.06.07_EEPROM에_직접_읽고/쓰기

2013. 6. 7. 12:13

▶ EEPROM에_직접_읽고/쓰기

(1) EEPROM 에는 다이렉트로 직접 접근이 불가하다.

 1-1 EEPROM에 쓰고싶은 주소는 EEAR(어드레스 레지스터)에 주소를 입력하고, 이 EEAR 레지는 EEARH(4bit)+EEARL(8bit) = 12bit 를 사용한다.  

 1-2 EEPROM에 쓰고싶은 데이터는 EEDR(데이터 레지스터)에 입력을 한다. EEPROM 의 범위는 0x0000 ~ 0x0FFF 이고, 각 칸당 1byte 소모한다. 

 1-3 EEPROM에 Write 가 가능하도록 허용할지 여부를 결정하는 레지스터는 EEMPE로 EEMPE = 1 일때 값이 EEPROM에 입력이된다.


▶ EEPROM.c

#include "EEPROM.h"


// 첫번째인자는 12byte의 주소를넘겨주어야하므로, int형(16bit)으로 주소를 넘겨줌.

// 두번째인자에는 EEPROM이 0x0000~0x0FFF 의 범위를 가지고

void EEPROM_write(unsigned int ui_addr,unsigned char uc_data) // 1byte의 크기를 가지므로 char 형으로 값을 넘겨줌. 

{ // 1. 앞의 라이트 동작이 완료되어 EEPE = 0 으로 될때까지 기다린다.

while(0 != (EECR  & (1<<EEPE))); // EEPE=0으로 될때까지 기다린다. 값이 2(0x00000010)일때 참이어야 한다. 0이면 while 빠져나감


// 2. SPMCSR 레지스터에서 SPMEN = 0 으로 될때까지 기다린다. 

//while(0 != (SPMCSR & (1<<SPMEN))); // DataSheet의 샘플코드에는 이부분이 생략됨.


// 3. 새로 라이트할 EEPROM 어드레스를 EEAR 레지스터에 저장한다.

EEAR = ui_addr;


// 4. 새로 라이트할 EEPROM 데이터를 EEDR 레지스터에 저장한다.

EEDR = uc_data;


// 5. EECR 레지스터에  EEMPE = 1, EEPE = 0 으로 설정한다.

EECR = (1<<EEMPE) | (0<<EEPE);


// 6. 4사이클 이내에 EEPE =1 로 설정한다.

EECR = (1<<EEPE);

return;

}


unsigned char EEPROM_read(unsigned int ui_addr)

{ // 1. 앞의 라이트 동작이 완료되어 EEPE = 0 으로 될때까지 기다린다.

while(0 != (EECR & (1<<EEPE)))


// 2. 리드할 EEPROM 어드레스를 EEAR 레지스터에 저장한다.

EEAR = ui_addr;


// 3. EECR 레지스터에 EERE = 1 로 설정한다.

EECR = (1<<EERE);


// 4. EEPROM 데이터를 EEDR 레지스터로 부터 읽는다.

return(EEDR);

}



▶ EEPROM.h


#ifndef _EEPROM_H

#define _EEPROM_H



#define EEARH (*((volatile unsigned char *)0x42)) // 어드레스 레지스터.

#define EEARL (*((volatile unsigned char *)0x41))

#define EEAR (*((volatile unsigned int *)0x41)) // int 형으로 바꿔서 한번에 보냄

#define EEDR (*((volatile unsigned char *)0x40))

#define EECR (*((volatile unsigned char *)0x3F))

#define SPMCSR (*((volatile unsigned char *)0x57))


/**** EECR 레지 ******/    // 제어 레지스터

#define EEPM1 5

#define EEPM0 4

#define EERIE 3

#define EEMPE 2

#define EEPE 1

#define EERE 0


/**** SPMCSR 레지 ****/  // SPMCSR – Store Program Memory Control and Status Register

#define SPMIE 7

#define RWWSB 6

#define SIGRD 5

#define RWWSRE 4

#define BLBSET 3

#define PGWRT 2

#define PGERS 1

#define SPMEN 0   // SPMEN: Store Program Memory Enable


void EEPROM_write(unsigned int ui_addr,unsigned char uc_data);

unsigned char EEPROM_read(unsigned int ui_addr);



#endif // _EEPROM_H




저작자표시 (새창열림)

'AVR2560' 카테고리의 다른 글

2013.06.10_초음파센서_활용  (0) 2013.06.11
2013.06.07_인터럽트에 대한 이론_  (0) 2013.06.07
2013.06.05_AVR_ADC동작.  (0) 2013.06.07
2013.05.30_AVR_한글띄우기_포팅_BSD(퍼온자료_종영이형꺼)  (0) 2013.05.31
2013.05.30_ARM_LCD에 한글띄우기.  (0) 2013.05.30
    'AVR2560' 카테고리의 다른 글
    • 2013.06.10_초음파센서_활용
    • 2013.06.07_인터럽트에 대한 이론_
    • 2013.06.05_AVR_ADC동작.
    • 2013.05.30_AVR_한글띄우기_포팅_BSD(퍼온자료_종영이형꺼)
    성엽이
    성엽이

    티스토리툴바