Cách giao diện I2C-EEPROM với Vi điều khiển 8051

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Thuật ngữ I2C hoặc IIC viết tắt là một liên mạch tích hợp và nó được gọi là tôi bình phương C. I2C là một bus máy tính nối tiếp , được phát minh bởi chất bán dẫn NXP trước đây nó được đặt tên là chất bán dẫn Philips. Bus I2C được sử dụng để gắn các mạch tích hợp ngoại vi tốc độ thấp vào bộ vi điều khiển và bộ xử lý . Vào năm 2006, để thực hiện giao thức I2C, không cần phí cấp phép. Nhưng phí là cần thiết để có được địa chỉ nô lệ I2C được gán bởi chất bán dẫn NXP.

Một số đối thủ cạnh tranh như Texas Instruments, Siemens AG, NEC, Motorola, Intersil và STMicroelectronics đã công bố các sản phẩm I²C phù hợp với thị trường vào giữa những năm 1990. Vào năm 1995, SMBus được Intel định nghĩa, đó là một nhóm con của I²C cho biết các giao thức nghiêm ngặt hơn. Mục đích chính của SMBus là hỗ trợ khả năng tương tác và tính mạnh mẽ. Do đó, các hệ thống I²C hiện tại bao gồm các quy tắc và chính sách từ SMBus, đôi khi nó hỗ trợ cả I2C và SMBus với mức cấu hình lại tối thiểu.




Xe buýt I2C

Xe buýt I2C

Giao diện I2C Bus-EEPROM với Vi điều khiển 8051

I2C Bus là gì

Bus I2c sử dụng hai đường dẫn mở hai chiều như SDA (đường dữ liệu nối tiếp) và SCl (đường xung nhịp nối tiếp) và chúng được kéo lên bằng điện trở. Bus I2C cho phép thiết bị chính bắt đầu giao tiếp với thiết bị phụ. Dữ liệu được hoán đổi cho nhau giữa hai thiết bị này. Điện áp điển hình được sử dụng là + 3,3V hoặc + 5V mặc dù hệ thống có điện áp phụ được phép.



Giao diện I2C

Giao diện I2C

EEPROM

ROM lập trình có thể xóa bằng điện (EEPROM) là một ROM có thể sửa đổi của người dùng, có thể được gỡ bỏ và lập trình lại thường xuyên thông qua việc áp dụng điện áp cao hơn điện áp bình thường. EEPROM là một loại bộ nhớ không thay đổi được sử dụng trong các thiết bị điện tử như máy tính để lưu trữ một lượng nhỏ dữ liệu cần được lưu khi ngắt nguồn điện.

8051 Slicker Board

Bo mạch 8051 Slicker được thiết kế đặc biệt để giúp sinh viên kỹ thuật trong lĩnh vực những hệ thống nhúng . Bộ dụng cụ này được thiết kế theo cách mà tất cả các tính năng của Vi điều khiển 8051 sẽ được học sinh sử dụng. Bảng tiền đạo này hỗ trợ ISP (Lập trình hệ thống) được thực hiện thông qua cổng nối tiếp. Bộ công cụ này và 8051 từ NXP được đề xuất để làm suôn sẻ tiến độ gỡ lỗi của nhiều thiết kế xung quanh bộ vi điều khiển 8 bit tốc độ.

Giao diện I2C - EEPROM

Hình dưới đây mô tả giao tiếp I2C-EEPROM với vi điều khiển 8051. Ở đây, I2C là một giao thức chính phụ, bao gồm dữ liệu cùng với xung đồng hồ. Thông thường, thiết bị chủ đã chuyển dòng đồng hồ, SCL. Dòng này sắp xếp thời gian dữ liệu truyền trên bus I2C, trừ khi đồng hồ hoạt động, không có dữ liệu nào sẽ được chuyển. Tất cả các nô lệ được điều khiển bởi cùng một đồng hồ, SCL.


Giao diện I2C - EEPROM

Giao diện I2C - EEPROM

I2C bus hỗ trợ các thiết bị khác nhau trong đó mỗi thiết bị được xác định bằng một địa chỉ duy nhất cho dù đó là trình điều khiển LCD, thẻ nhớ, vi điều khiển hay giao diện của bàn phím có thể hoạt động dưới dạng Tx hoặc Rx tùy thuộc vào hoạt động của thiết bị. Bộ điều khiển được thiết kế để điều khiển thiết bị EEPROM thông qua giao thức I2C. Ở đây, anh ta giao thức I2C hoạt động như một thiết bị chủ và điều chỉnh EEPROM và nó hoạt động như một nô lệ. Các hoạt động R / W thành thạo bằng cách chuyển một tập hợp các tín hiệu điều khiển bao gồm bus dữ liệu địa chỉ VÀ / HOẶC. Các tín hiệu này nên được tham gia với các tín hiệu đồng hồ phù hợp

Giao diện I2C Bus-EEPROM với Vi điều khiển 8051

Nếu bạn muốn đọc, ghi và xóa EEPROM bằng cách sử dụng bus I2C trong bảng tiền đạo 8051. Giao diện của I2 Bus-EEPROM với Bộ vi điều khiển 8051 rất đơn giản . Hoạt động của giao diện này là gửi một tín hiệu như WRITE, tiếp theo là bus dữ liệu và địa chỉ. Trong thao tác này, EEPROM được sử dụng để lưu trữ dữ liệu. Trong bộ 8051, hai số dòng EEPROM được điều chỉnh bởi các trình điều khiển được hỗ trợ I2C. SCL và SDA được kết nối với IC EEPROM nối tiếp dựa trên I2C.

Giao diện I2C Bus-EEPROM với Vi điều khiển 8051

Giao diện I2C Bus-EEPROM với Vi điều khiển 8051

Bằng cách sử dụng các dòng SDA và SCL I2C, các hoạt động đọc và ghi của EEPROM được thực hiện trong 8051 Slicker Kit

Giao diện của I2C rất đơn giản và trong mỗi dữ liệu Đọc / Ghi trong EEPROM. Độ trễ phụ thuộc vào trình biên dịch cách nó tăng cường các vòng lặp ngay sau khi bạn thực hiện thay đổi trong các lựa chọn, độ trễ thay đổi.

Mã nguồn cho giao diện I2C

#include
#include
#include

#define ACK 1
#define NO_ACK 0

ký tự không dấu tôi
unsigned char EData [5]
Dữ liệu char không dấu
void InitSerial (vô hiệu)
void DelayMs (unsigned int)
void WriteI2C (ký tự không dấu)
void Start (vô hiệu)
void Stop (vô hiệu)
void ReadBYTE (unsigned int)
void WriteBYTE (int unsigned)
không dấu char ReadI2C (bit)

sbit SCL = P2 ^ 0 // kết nối với chân SCL (Đồng hồ)
sbit SDA = P2 ^ 1 // kết nối với chân SDA (Dữ liệu)

// —————————————
// Chương trình chính
// —————————————
void main (void)
{
InitSerial () // Khởi tạo cổng nối tiếp
putchar (0x0C) // xóa siêu thiết bị đầu cuối
Độ trễMs (5)
WriteBYTE (0x0000)
WriteI2C (‘A’) // Ghi dữ liệu ở đây
WriteI2C (‘B’)
WriteI2C (‘C’)
WriteI2C (‘D’)
WriteI2C (‘E’)
WriteI2C (‘F’)
Dừng lại()
Độ trễ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)

cho (i = 0i<6i++)
{
printf (“value =% c n”, EData [i]) // hiển thị dữ liệu * /
Độ trễMs (100)
}

trong khi (1)
}

// —————————————
// Khởi tạo cổng nối tiếp
// —————————————
void InitSerial (vô hiệu)
{
SCON = 0x52 // thiết lập điều khiển cổng nối tiếp
TMOD = 0x20 // phần cứng (9600 BAUD @ 11.0592MHZ)
TH1 = 0xFD // TH1
TR1 = 1 // Bộ hẹn giờ 1 đang bật
}

// ———————————-
// bắt đầu I2C
// ———————————-
void Start (vô hiệu)
{
SDA = 1
SCL = 1
_button _ () _ nop_ ()
SDA = 0
_button _ () _ nop_ ()
SCL = 0
_button _ () _ nop_ ()
}

// ———————————-
// dừng I2C
// ———————————-
void Stop (vô hiệu)
{
SDA = 0
_button _ () _ nop_ ()
SCL = 1
_button _ () _ nop_ ()
SDA = 1
}

// ———————————-
// Viết I2C
// ———————————-
void WriteI2C (Dữ liệu char không dấu)
{

cho (i = 0i<8i++)
{
SDA = (Dữ liệu & 0x80)? 1: 0
SCL = 1SCL = 0
Dữ liệu<<=1
}

SCL = 1
_button _ () _ nop_ ()
SCL = 0

}

// ———————————-
// Đọc I2C
// ———————————-
unsigned char ReadI2C (bit ACK_Bit)
{

Khởi đầu()
WriteI2C (0xA1)

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

SCL = 1
Dữ liệu<<= 1
Ngày = (Ngày

if (ACK_Bit == 1)
SDA = 0 // Gửi ACK
khác
SDA = 1 // Gửi KHÔNG ACK

_button _ () _ nop_ ()
SCL = 1
_button _ () _ nop_ ()
SCL = 0
Dừng lại()
trả lại dữ liệu
}

// ———————————-
// Đọc 1 byte biểu mẫu I2C
// ———————————-
void ReadBYTE (unsigned int Addr)
{
Khởi đầu()
WriteI2C (0xA0)
WriteI2C ((unsigned char) (Addr >> 8) & 0xFF)
WriteI2C ((ký tự không dấu) Addr & 0xFF)
}

// ———————————-
// Ghi 1 byte vào I2C
// ———————————-
void WriteBYTE (unsigned int Addr)
{
Khởi đầu()
WriteI2C (0xA0)
WriteI2C ((unsigned char) (Addr >> 8) & 0xFF) // gửi địa chỉ cao
WriteI2C ((unsigned char) Addr & 0xFF) // gửi địa chỉ thấp
}

// —————————————
// Hàm mS trì hoãn
// —————————————
void DelayMs (số int không dấu)
{// mSec Độ trễ 11.0592 Mhz
unsigned int i // Keil v7.5a
trong khi (đếm)
{
i = 115
trong khi (i> 0) i–
đếm-
}
}

Vì vậy, đây là tất cả về việc triển khai giao diện I2C. Chúng tôi hy vọng rằng bạn đã hiểu rõ hơn về khái niệm này. Hơn nữa, bất kỳ truy vấn nào liên quan đến khái niệm này hoặc thiết bị giao tiếp hãy đóng góp ý kiến ​​quý báu của bạn bằng cách bình luận trong phần bình luận bên dưới