I2C-EEPROM을 8051 마이크로 컨트롤러와 인터페이스하는 방법

문제를 제거하기 위해 도구를 사용해보십시오





용어 I2C 또는 IIC 약어는 inter 집적 회로 I 제곱 C라고합니다. I2C는 직렬 컴퓨터 버스입니다. , 이전에 NXP 반도체에서 발명 한이 제품은 Philips 반도체로 명명되었습니다. I2C 버스는 저속 주변 집적 회로를 연결하는 데 사용됩니다. 마이크로 컨트롤러 및 프로세서 . 2006 년에는 I2C 프로토콜을 구현하기 위해 라이센스 비용이 필요하지 않습니다. 그러나 NXP 반도체에서 할당 한 I2C 슬레이브 주소를 얻으려면 요금이 필요합니다.

Texas Instruments, Siemens AG, NEC, Motorola, Intersil 및 STMicroelectronics와 같은 일부 경쟁 업체는 1990 년대 중반에 시장에 적합한 I²C 제품을 발표했습니다. 1995 년에 SMBus는 프로토콜이 더 엄격하다는 I²C의 하위 그룹 인 Intel에서 정의했습니다. SMBus의 주요 목적은 상호 운용성과 견고성을 지원하는 것입니다. 따라서 현재의 I²C 시스템에는 SMBus의 규칙 및 정책이 포함되어 있으며, 때로는 최소한의 재구성으로 I2C와 SMBus를 모두 지원합니다.




I2C 버스

I2C 버스

8051 마이크로 컨트롤러와 인터페이스 I2C 버스 -EEPROM

I2C 버스 란

I2c 버스는 SDA (직렬 데이터 라인) 및 SCl (직렬 클록 라인)과 같은 두 개의 양방향 오픈 드레인 라인을 사용하며 이들은 저항으로 풀업됩니다. I2C 버스를 사용하면 마스터 장치가 슬레이브 장치와 통신을 시작할 수 있습니다. 데이터는이 두 장치간에 교환됩니다. 사용되는 일반적인 전압은 + 3.3V 또는 + 5V이지만 추가 전압이있는 시스템이 허용됩니다.



I2C 인터페이스

I2C 인터페이스

EEPROM

전기적으로 지울 수있는 프로그래밍 가능 ROM (EEPROM)은 사용자가 수정할 수있는 ROM으로 일반 전압보다 높은 전압을인가하여 자주 제거하고 다시 프로그래밍 할 수 있습니다. EEPROM은 컴퓨터와 같은 전자 장치에서 전원이 분리되었을 때 저장해야하는 소량의 데이터를 저장하는 데 사용되는 일종의 비 휘발성 메모리입니다.

8051 슬리커 보드

8051 Slicker 보드는 다음 분야의 기술 학생들을 돕기 위해 특별히 설계되었습니다. 임베디드 시스템 . 이 키트는 모든 기능이 8051 마이크로 컨트롤러 학생들이 사용할 수 있습니다. 이 스트라이커 보드는 직렬 포트를 통해 수행되는 ISP (In System Programming)를 지원합니다. NXP의이 키트와 8051은 속도 8 비트 마이크로 컨트롤러를 둘러싼 많은 설계의 디버깅 진행을 원활하게하기 위해 제안되었습니다.

I2C 인터페이스 – EEPROM

다음 그림은 I2C-EEPROM과 8051 마이크로 컨트롤러의 인터페이스를 보여줍니다. 여기서 I2C는 클럭 펄스와 함께 데이터를 포함하는 마스터-슬레이브 프로토콜입니다. 일반적으로 마스터 장치는 클럭 라인 SCL을 전환했습니다. 이 라인은 I2C 버스에서 전송되는 데이터 타이밍을 지시합니다. 클럭이 작동하지 않는 한 데이터는 전송되지 않습니다. 모든 슬레이브는 동일한 클럭 인 SCL에 의해 제어됩니다.


I2C 인터페이스-EEPROM

I2C 인터페이스 – EEPROM

I2C 버스는 다양한 장치를 지원합니다 각 장치는 LCD 드라이버, 메모리 카드, 마이크로 컨트롤러 등 고유 한 주소로 식별됩니다. 키보드 인터페이스 Tx 또는 Rx로 작동 할 수있는 것은 장치의 기능에 따라 다릅니다. 컨트롤러는 I2C 프로토콜을 통해 EEPROM 장치를 제어하도록 설계되었습니다. 여기에서 I2C 프로토콜은 마스터 장치로 작동하고 EEPROM을 조절하며 슬레이브로 작동합니다. R / W 작업은 주소 AND / OR 데이터 버스를 구성하는 제어 신호 세트를 전송함으로써 능숙합니다. 이러한 신호는 적절한 클록 신호와 함께 처리되어야합니다.

8051 마이크로 컨트롤러와 인터페이스 I2C 버스 -EEPROM

읽고 싶다면 8051 스트라이커 보드에서 I2C 버스를 사용하여 EEPROM을 쓰고 지우십시오. I2 Bus-EEPROM과 8051 마이크로 컨트롤러는 매우 간단합니다. . 이 인터페이싱의 작동은 WRITE와 같은 신호를 보내고 데이터 및 주소 버스를 보내는 것입니다. 이 작업에서 EEPROM은 데이터를 저장하는 데 사용됩니다. 8051 키트에서 두 개의 EEPROM 라인은 I2C 지원 드라이버에 의해 규제됩니다. SCL 및 SDA는 I2C 기반 직렬 EEPROM IC에 연결됩니다.

8051 마이크로 컨트롤러와 인터페이스 I2C 버스 -EEPROM

8051 마이크로 컨트롤러와 인터페이스 I2C 버스 -EEPROM

SDA 및 SCL I2C 라인을 사용하여 EEPROM의 읽기 및 쓰기 작업이 8051 Slicker Kit에서 수행됩니다.

I2C의 인터페이스는 EEPROM의 모든 단일 데이터 읽기 / 쓰기에서 매우 간단합니다. 지연은 컴파일러가 선택 사항을 변경하자마자 루프를 향상시키는 방법에 따라 달라집니다.

I2C 인터페이스를위한 소스 코드

#포함
#포함
#포함

# 정의 ACK 1
# 정의 NO_ACK 0

서명되지 않은 char i
부호없는 문자 EData [5]
부호없는 문자 데이터
무효 InitSerial (무효)
무효 DelayMs (부호없는 정수)
무효 WriteI2C (부호없는 문자)
무효 시작 (무효)
무효 중지 (무효)
무효 ReadBYTE (부호없는 정수)
무효 WriteBYTE (부호없는 정수)
부호없는 문자 ReadI2C (비트)

sbit SCL = P2 ^ 0 // SCL 핀에 연결 (클록)
sbit SDA = P2 ^ 1 // SDA 핀에 연결 (데이터)

// —————————————
// 메인 프로그램
// —————————————
무효 메인 (무효)
{
InitSerial () // 직렬 포트 초기화
putchar (0x0C) // 하이퍼 터미널 지우기
지연 Ms (5)
WriteBYTE (0x0000)
WriteI2C (‘A’) // 여기에 데이터 쓰기
WriteI2C (‘B’)
WriteI2C (‘C’)
WriteI2C (‘D’)
WriteI2C (‘E’)
WriteI2C (‘F’)
중지()
지연 Ms (10)

ReadBYTE (0x0000)
EData [0] = ReadI2C (NO_ACK)
EData [1] = ReadI2C (NO_ACK)
EData [2] = ReadI2C (NO_ACK)
EData [3] = ReadI2C (NO_ACK)
EData [4] = ReadI2C (NO_ACK)
EData [5] = ReadI2C (NO_ACK)

for (i = 0i<6i++)
{
printf (“value = % c n”, EData [i]) // 데이터 표시 * /
지연 Ms (100)
}

동안 (1)
}

// —————————————
// 직렬 포트 초기화
// —————————————
무효 InitSerial (무효)
{
SCON = 0x52 // 직렬 포트 제어 설정
TMOD = 0x20 // 하드웨어 (9600 BAUD @ 11.0592MHZ)
TH1 = 0xFD // TH1
TR1 = 1 // 타이머 1 켜짐
}

// ———————————-
// I2C 시작
// ———————————-
무효 시작 (무효)
{
SDA = 1
SCL = 1
_ 버튼 _ () _ nop_ ()
SDA = 0
_ 버튼 _ () _ nop_ ()
SCL = 0
_ 버튼 _ () _ nop_ ()
}

// ———————————-
// I2C 중지
// ———————————-
무효 중지 (무효)
{
SDA = 0
_ 버튼 _ () _ nop_ ()
SCL = 1
_ 버튼 _ () _ nop_ ()
SDA = 1
}

// ———————————-
// I2C 쓰기
// ———————————-
무효 WriteI2C (부호없는 문자 데이터)
{

(i = 0i<8i++)
{
SDA = (데이터 & 0x80)? 1 : 0
SCL = 1SCL = 0
데이터<<=1
}

SCL = 1
_ 버튼 _ () _ nop_ ()
SCL = 0

}

// ———————————-
// I2C 읽기
// ———————————-
부호없는 문자 ReadI2C (비트 ACK_Bit)
{

스타트()
쓰기 I2C (0xA1)

SDA = 1
(i = 0i<8i++)

SCL = 1
데이터<<= 1
날짜 = (날짜

if (ACK_Bit == 1)
SDA = 0 // ACK 보내기
그밖에
SDA = 1 // ACK 없음

_ 버튼 _ () _ nop_ ()
SCL = 1
_ 버튼 _ () _ nop_ ()
SCL = 0
중지()
반환 데이터
}

// ———————————-
// I2C 형식으로 1 바이트 읽기
// ———————————-
void ReadBYTE (unsigned int Addr)
{
스타트()
쓰기 I2C (0xA0)
WriteI2C ((부호없는 문자) (Addr >> 8) & 0xFF)
WriteI2C ((부호없는 문자) Addr & 0xFF)
}

// ———————————-
// I2C에 1 바이트 쓰기
// ———————————-
void WriteBYTE (unsigned int Addr)
{
스타트()
쓰기 I2C (0xA0)
WriteI2C ((unsigned char) (Addr >> 8) & 0xFF) // 높은 주소 보내기
WriteI2C ((unsigned char) Addr & 0xFF) // 낮은 주소 보내기
}

// —————————————
// mS 기능 지연
// —————————————
무효 DelayMs (부호없는 정수 수)
{// mSec 지연 11.0592Mhz
unsigned int i // Keil v7.5a
동안 (수)
{
나는 = 115
동안 (i> 0) i–
카운트-
}
}

따라서 이것은 I2C 인터페이스의 구현에 관한 것입니다. 이 개념을 더 잘 이해 하셨기를 바랍니다. 또한이 개념 또는 인터페이스 장치 아래 댓글 섹션에 댓글을 달아 소중한 제안을 해주세요.