วิธีการเชื่อมต่อ I2C-EEPROM กับไมโครคอนโทรลเลอร์ 8051

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





คำว่า I2C หรือตัวย่อ IIC เป็นอินเตอร์ วงจรรวม และเรียกว่าเป็นฉันกำลังสอง C I2C เป็นบัสคอมพิวเตอร์แบบอนุกรม ซึ่งคิดค้นโดยเซมิคอนดักเตอร์ NXP ก่อนหน้านี้มีชื่อว่าเซมิคอนดักเตอร์ของ Philips บัส I2C ใช้เพื่อต่อวงจรรวมอุปกรณ์ต่อพ่วงความเร็วต่ำเข้ากับ ไมโครคอนโทรลเลอร์และโปรเซสเซอร์ . ในปี 2549 ในการใช้โปรโตคอล I2C ไม่จำเป็นต้องมีค่าธรรมเนียมการออกใบอนุญาต แต่ค่าธรรมเนียมเป็นสิ่งจำเป็นในการรับที่อยู่ทาส I2C ที่กำหนดโดยเซมิคอนดักเตอร์ NXP

คู่แข่งบางรายเช่น Texas Instruments, Siemens AG, NEC, Motorola, Intersil และ STMicroelectronics ได้ประกาศผลิตภัณฑ์I²Cที่เหมาะสมอย่างยิ่งสู่ตลาดในช่วงกลางปี ​​1990 ในปี 1995 SMBus กำหนดโดย Intel ซึ่งเป็นกลุ่มย่อยของI²Cที่ระบุว่าโปรโตคอลมีความเข้มงวดมากขึ้น วัตถุประสงค์หลักของ SMBus คือเพื่อรองรับการทำงานร่วมกันและความทนทาน ดังนั้นระบบI²Cในปัจจุบันจึงรวมกฎและนโยบายจาก SMBus บางครั้งก็รองรับทั้ง I2C และ SMBus โดยมีการกำหนดค่าใหม่เพียงเล็กน้อย




บัส I2C

บัส I2C

อินเตอร์เฟส I2C Bus-EEPROM พร้อมไมโครคอนโทรลเลอร์ 8051

I2C Bus คืออะไร

บัส I2c ใช้สายระบายน้ำแบบเปิดสองทิศทางสองเส้นเช่น SDA (สายข้อมูลอนุกรม) และ SCl (สายนาฬิกาอนุกรม) และสิ่งเหล่านี้ถูกดึงขึ้นด้วยตัวต้านทาน บัส I2C อนุญาตให้อุปกรณ์หลักเริ่มการสื่อสารกับอุปกรณ์ทาส ข้อมูลมีการเปลี่ยนแปลงระหว่างอุปกรณ์ทั้งสองนี้ แรงดันไฟฟ้าทั่วไปที่ใช้คือ + 3.3V หรือ + 5V แม้ว่าระบบที่มีแรงดันไฟฟ้าพิเศษจะได้รับอนุญาต



อินเทอร์เฟซ I2C

อินเทอร์เฟซ I2C

EEPROM

ROM โปรแกรมที่ลบได้ด้วยไฟฟ้า (EEPROM) เป็น ROM ที่ผู้ใช้สามารถปรับเปลี่ยนได้ซึ่งสามารถถอดออกและตั้งโปรแกรมใหม่ได้บ่อยครั้งโดยใช้แรงดันไฟฟ้าที่สูงกว่าปกติ EEPROM เป็นหน่วยความจำแบบไม่ลบเลือนชนิดหนึ่งที่ใช้ในอุปกรณ์อิเล็กทรอนิกส์เช่นคอมพิวเตอร์เพื่อจัดเก็บข้อมูลจำนวนเล็กน้อยที่ควรบันทึกเมื่อถอดปลั๊กออก

8051 กระดาน Slicker

กระดาน 8051 Slicker ได้รับการออกแบบมาเป็นพิเศษเพื่อช่วยนักเรียนเทคนิคในพื้นที่ ระบบฝังตัว . ชุดนี้ได้รับการออกแบบในลักษณะที่มีคุณสมบัติทั้งหมดของ ไมโครคอนโทรลเลอร์ 8051 นักเรียนอาจถูกนำไปใช้ บอร์ดกองหน้านี้รองรับ ISP (In System Programming) ที่ทำผ่านพอร์ตอนุกรม ชุดนี้และ 8051 จาก NXP ได้รับการเสนอเพื่อให้ความคืบหน้าของการดีบักของการออกแบบจำนวนมากรอบไมโครคอนโทรลเลอร์ความเร็ว 8 บิตเป็นไปอย่างราบรื่น

การเชื่อมต่อ I2C - EEPROM

รูปต่อไปนี้แสดงการเชื่อมต่อ I2C-EEPROM กับไมโครคอนโทรลเลอร์ 8051 ที่นี่ I2C เป็นโปรโตคอล master-slave ซึ่งรวมข้อมูลพร้อมกับสัญญาณนาฬิกา โดยปกติอุปกรณ์หลักจะเปลี่ยนสายนาฬิกา SCL บรรทัดนี้สั่งการกำหนดเวลาข้อมูลที่ถ่ายโอนบนบัส I2C หากไม่ใช้นาฬิกาจะไม่มีการถ่ายโอนข้อมูล ทาสทั้งหมดถูกควบคุมโดยนาฬิกาเดียวกัน SCL


การเชื่อมต่อ I2C - EEPROM

การเชื่อมต่อ I2C - EEPROM

I2C บัสรองรับอุปกรณ์ต่างๆ โดยที่อุปกรณ์แต่ละชิ้นถูกระบุด้วยที่อยู่ที่ไม่ซ้ำกันไม่ว่าจะเป็นไดรเวอร์ LCD การ์ดหน่วยความจำไมโครคอนโทรลเลอร์หรือ การเชื่อมต่อของแป้นพิมพ์ ซึ่งสามารถทำงานเป็น Tx หรือ Rx ขึ้นอยู่กับการทำงานของอุปกรณ์ คอนโทรลเลอร์ได้รับการออกแบบมาเพื่อควบคุมอุปกรณ์ EEPROM ผ่านโปรโตคอล I2C ที่นี่โปรโตคอล I2C ทำงานเป็นอุปกรณ์หลักและควบคุม EEPROM และทำงานเหมือนทาส การดำเนินการ R / W มีความเชี่ยวชาญโดยการถ่ายโอนชุดของสัญญาณควบคุมซึ่งประกอบด้วยแอดเดรสและ / หรือบัสข้อมูล สัญญาณเหล่านี้ควรเข้าร่วมกับสัญญาณนาฬิกาที่เหมาะสม

อินเตอร์เฟส I2C Bus-EEPROM พร้อมไมโครคอนโทรลเลอร์ 8051

หากคุณต้องการอ่านเขียนและลบ EEPROM โดยใช้บัส I2C ในบอร์ดกองหน้า 8051 การเชื่อมต่อของ I2 Bus-EEPROM กับ ไมโครคอนโทรลเลอร์ 8051 นั้นง่ายมาก . การทำงานของการเชื่อมต่อนี้คือการส่งสัญญาณเช่น WRITE ตามด้วย data และ address bus ในการดำเนินการนี้ EEPROM จะใช้ในการจัดเก็บข้อมูล ในชุด 8051 จำนวนบรรทัด EEPROM สองเส้นถูกควบคุมโดยไดรเวอร์ที่รองรับ I2C SCL และ SDA เชื่อมต่อกับ I2C Serial EEPROM IC

อินเตอร์เฟส I2C Bus-EEPROM พร้อมไมโครคอนโทรลเลอร์ 8051

อินเตอร์เฟส I2C Bus-EEPROM พร้อมไมโครคอนโทรลเลอร์ 8051

โดยใช้เส้น SDA และ SCL I2C การอ่านและเขียน EEPROM จะทำใน 8051 Slicker Kit

การเชื่อมต่อของ I2C นั้นง่ายมากและในทุกๆข้อมูลอ่าน / เขียนใน EEPROM ความล่าช้าขึ้นอยู่กับคอมไพเลอร์ว่าจะเพิ่มลูปได้อย่างไรทันทีที่คุณทำการเปลี่ยนแปลงในตัวเลือกความล่าช้าจะแตกต่างกันไป

ซอร์สโค้ดสำหรับการเชื่อมต่อ I2C

# รวม
# รวม
# รวม

#define ACK 1
#define NO_ACK 0

ถ่าน i
ถ่าน EData ที่ไม่ได้ลงชื่อ [5]
ข้อมูลถ่านที่ไม่ได้ลงชื่อ
เป็นโมฆะ InitSerial (โมฆะ)
เป็นโมฆะ DelayMs (int ไม่ได้ลงนาม)
โมฆะ WriteI2C (ถ่านที่ไม่ได้ลงชื่อ)
เป็นโมฆะเริ่ม (โมฆะ)
เป็นโมฆะ Stop (โมฆะ)
เป็นโมฆะ ReadBYTE (int ไม่ได้ลงนาม)
โมฆะ WriteBYTE (int ไม่ได้ลงนาม)
ถ่าน ReadI2C ที่ไม่ได้ลงชื่อ (บิต)

sbit SCL = P2 ^ 0 // เชื่อมต่อกับพิน SCL (นาฬิกา)
sbit SDA = P2 ^ 1 // เชื่อมต่อกับพิน SDA (ข้อมูล)

// —————————————
// โปรแกรมหลัก
// —————————————
โมฆะหลัก (โมฆะ)
{
InitSerial () // เริ่มต้นพอร์ตอนุกรม
putchar (0x0C) // ล้างไฮเปอร์เทอร์มินัล
DelayMs (5)
เขียนไบต์ (0x0000)
WriteI2C ('A') // เขียนข้อมูลอยู่ที่นี่
WriteI2C ('B')
WriteI2C ('C')
WriteI2C ('D')
WriteI2C ('E')
WriteI2C ('F')
หยุด()
DelayMs (10)

อ่านไบต์ (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)

สำหรับ (i = 0i<6i++)
{
printf (“ value =% c n”, EData [i]) // แสดงข้อมูล * /
DelayMs (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
// ———————————-
เป็นโมฆะ Stop (โมฆะ)
{
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
Date = (วันที่

ถ้า (ACK_Bit == 1)
SDA = 0 // ส่ง ACK
อื่น
SDA = 1 // ส่งไม่มี ACK

_ ปุ่ม _ () _ nop_ ()
SCL = 1
_ ปุ่ม _ () _ nop_ ()
SCL = 0
หยุด()
ส่งคืนข้อมูล
}

// ———————————-
// อ่าน 1 ไบต์แบบฟอร์ม I2C
// ———————————-
เป็นโมฆะ ReadBYTE (int Addr ที่ไม่ได้ลงชื่อ)
{
เริ่มต้น ()
เขียน I2C (0xA0)
WriteI2C ((ถ่านที่ไม่ได้ลงชื่อ) (Addr >> 8) & 0xFF)
WriteI2C ((ถ่านที่ไม่ได้ลงชื่อ) Addr & 0xFF)
}

// ———————————-
// เขียน 1 ไบต์ถึง I2C
// ———————————-
โมฆะ WriteBYTE (int Addr ที่ไม่ได้ลงชื่อ)
{
เริ่มต้น ()
เขียน I2C (0xA0)
WriteI2C ((ถ่านที่ไม่ได้ลงชื่อ) (Addr >> 8) & 0xFF) // ส่งที่อยู่สูง
WriteI2C ((ถ่านที่ไม่ได้ลงชื่อ) Addr & 0xFF) // ส่งที่อยู่ต่ำ
}

// —————————————
// ฟังก์ชัน Delay mS
// —————————————
เป็นโมฆะ DelayMs (จำนวน int ที่ไม่ได้ลงชื่อ)
{// mSec Delay 11.0592 Mhz
int ที่ไม่ได้ลงนาม i // Keil v7.5a
ในขณะที่ (นับ)
{
ผม = 115
ในขณะที่ (i> 0) i–
นับ-
}
}

ดังนั้นทั้งหมดนี้เกี่ยวกับการใช้งานอินเทอร์เฟซ I2C เราหวังว่าคุณจะเข้าใจแนวคิดนี้ดีขึ้น นอกจากนี้ข้อสงสัยใด ๆ เกี่ยวกับแนวคิดนี้หรือ อุปกรณ์เชื่อมต่อ โปรดให้ข้อเสนอแนะที่มีค่าของคุณโดยการแสดงความคิดเห็นในส่วนความคิดเห็นด้านล่าง