Trong bài này, chúng ta sẽ tìm hiểu về cách lập trình I2C trong LPC2148 ARM7 Microcontroller. Ngoài ra, chúng tôi sẽ giao diện nối tiếp EEPROM 24LC512 tới LPC2148 Microchip. Chúng tôi sẽ kiểm tra EEPROM bằng cách viết và đọc từ nó. Giao thức truyền thông I2C là giao thức nổi tiếng nhất trong các hệ thống nhúng.
I2C là gì và nó hoạt động như thế nào?
Bus I2C đã trở thành một trong những hệ thống con vi điều khiển quan trọng nhất được sử dụng để giao tiếp các thiết bị vi mạch khác nhau với vi điều khiển. Nó là duy nhất cho khả năng của nó để tối đa hóa hiệu quả phần cứng và đơn giản mạch. Bus I2C chỉ sử dụng các đường dữ liệu 2 chiều để giao tiếp với vi điều khiển. Xe buýt này được gọi là liên IC hoặc tôi 2 C xe buýt . Tất cả các thiết bị tương thích I2C-bus kết hợp một giao diện on-chip cho phép chúng giao tiếp trực tiếp với nhau thông qua I2C-bus. Đặc tả giao thức I2C có thể hỗ trợ lên tới 128 thiết bị được gắn vào cùng một bus. Ngày nay nhiều thiết bị IC I2C có sẵn trên thị trường như Serial EEPROM, I / O Expander, RTC, ADC, DAC, Cảm biến, v.v.
Giao thức I2C sử dụng phương thức master và slave, master chủ yếu là vi điều khiển trong khi slave có thể là bất kỳ thiết bị I2C nào như Serial EEPROM, RTC vv Giao thức I2C chỉ sử dụng hai tín hiệu: đồng hồ và dữ liệu. Đồng hồ được gọi là SCL (Serial Clock) trong khi dữ liệu được gọi là SDA (Serial Data) .
Trong giao thức I2C chúng ta phải sử dụng các kết hợp đặc biệt của các điều kiện tín hiệu. Về cơ bản, chỉ có hai điều kiện START và STOP. Một điều kiện START được tạo ra bởi master, theo sau là 7-bit của địa chỉ, sau đó là một Read / Write (R / W) bit. Nếu một thiết bị nô lệ phát hiện một địa chỉ phù hợp thì nó sẽ gửi ACK bằng cách lái SDA thấp trong chu kỳ đồng hồ tiếp theo; nếu không có nô lệ nào nhận ra địa chỉ thì dòng SDA sẽ bị bỏ lại một mình và kéo lên cao. Khi ACK nhận được, dữ liệu sẽ được gửi đến thiết bị phụ hoặc đọc từ thiết bị phụ thuộc (tùy thuộc vào trạng thái của bit R / W) .
Vì vậy, mỗi byte là 9-bit, trong đó 7-bit, trong đó 7-bit cho địa chỉ và một R / W cộng với một ACK / NAK, hoặc dữ liệu 8-bit cộng với một ACK / NAK. Byte dữ liệu cuối cùng của một giao dịch nên được theo sau bởi NAK, để chỉ ra rằng nó được dự định là byte cuối cùng. Sau đó, một STOP hoặc một ReSTART sẽ được cấp bởi master. Lỗi xe buýt hiếm khi được giới thiệu khi sử dụng thiết bị ngoại vi I2C chuyên dụng trên máy chủ.
Các tính năng của I2C trong LPC2148 vi điều khiển ARM7
- LPC2148 hỗ trợ hai bus I2C nhanh ( I2C0 & I2C1 ).
- Giao diện bus I2C có thể được cấu hình như Master, Slave hoặc Master / Slave.
- Hỗ trợ lập trình đồng hồ để cho phép điều chỉnh tốc độ dữ liệu nhiều: tiêu chuẩn (100 kbps), nhanh (400 kbps) và tốc độ cao (3,4 Mbps).
- Hỗ trợ truyền dữ liệu hai hướng giữa chủ và phụ.
- Giao thức I2C rất hữu ích khi nhiều thiết bị kết nối trên bus. Điều này giúp giảm chi phí và độ phức tạp của mạch khi nhiều thiết bị được phép truyền thông qua cùng một bus.
- Bus I2C có thể được sử dụng cho mục đích kiểm tra và chẩn đoán.
- Ứng dụng: Giao diện với các bộ phận tiêu chuẩn I2C bên ngoài như EEPROM nối tiếp, Ram và LCD.
Đăng ký I2C trong LPC2148 vi điều khiển ARM7
Trước khi chúng tôi tiến hành thêm và viết chương trình C để giao tiếp EEPROM sử dụng I2C trong LPC2148 ARM7 Microcontroller . Chúng ta hãy xem các thanh ghi mà chúng ta cần cấu hình trong mã của chúng ta. Giao diện ngoại vi I2C bao gồm bảy thanh ghi. Các chi tiết chức năng của các thanh ghi này được cung cấp dưới đây:
Tên đăng ký | Mô tả & chức năng |
I2C0CONSET | I2C0 Control Set Register : Thanh ghi này kiểm soát thiết lập các bit trong thanh ghi I2CON điều khiển hoạt động của giao diện I2C. Viết một cho một bit của thanh ghi này làm cho bit tương ứng trong I2C Control Register được thiết lập. Viết một số không có hiệu lực. I2C0CONSET chứa các bit điều khiển sau:
I2EN (Enable): được thiết lập để kích hoạt giao diện I2C. STA (Bắt đầu): được thiết lập để vào chế độ chủ và gửi điều kiện START. STO (Dừng): gửi tình trạng STOP ở chế độ chủ, và phục hồi từ một lỗi trong chế độ phụ. AA (Assert ACK): được đặt để yêu cầu xác nhận được trả về từ thiết bị phụ. SI (Interrupt): được thiết lập để chỉ ra một sự thay đổi trạng thái trong I2C Controller.
|
I2C0CONCLR | I2C0 Control Clear Register : Thanh ghi điều khiển thanh toán bù trừ các bit trong I2CON đăng ký hoạt động điều khiển của giao diện I2C. Viết một bit cho thanh ghi này làm cho bit tương ứng trong thanh ghi điều khiển I2C bị xóa. Viết số không có hiệu lực. I2C0CONCLR chứa các bit điều khiển sau: I2ENC: vô hiệu hóa Bộ điều khiển I2C. STAC:xóa cờ START. AAC: Xóa cờ ACK khẳng định. SIC: Xóa cờ ngắt I2C. |
I2C0STAT | Đăng ký trạng thái I2C0: Trong hoạt động I2C thanh ghi này cung cấp mã trạng thái chi tiết cho phép phần mềm xác định hành động tiếp theo cần thiết. |
I2C0DAT | Đăng ký dữ liệu I2C0: Trong chế độ truyền chính hoặc phụ, dữ liệu được truyền được ghi vào thanh ghi này. Trong chế độ nhận chủ hoặc phụ, dữ liệu đã nhận được có thể được đọc từ thanh ghi này. |
I2C0ADR | I2C0 Slave Address Register: Thanh ghi này có thể đọc được và có thể ghi được, và chỉ được sử dụng khi giao diện I2C được đặt ở chế độ slave. Trong chế độ chủ, thanh ghi này không có hiệu lực. I2C0ADR chứa địa chỉ nô lệ 7 bit cho hoạt động của giao diện I2C ở chế độ nô lệ. Bit ít quan trọng nhất (LSB) xác định liệu một nô lệ có đáp ứng với địa chỉ cuộc gọi chung hay không. |
I2C0SCLH | I2C0 SCH Duty Cycle Đăng ký High Half Word: Thanh ghi này xác định thời gian cao của Đồng hồ I2C (chứa số chu kỳ nhiệm vụ cao SCL) |
I2C0SCLL | I2C0 SCL Duty Cycle Đăng ký High Half Word: Thanh ghi này xác định thời gian thấp của Đồng hồ I2C. (Chứa số chu kỳ nhiệm vụ thấp SCL). I2C0SCLL và I2C0SCLH cùng xác định tần số xung nhịp được tạo ra bởi một bậc thầy I2C và một số thời gian nhất định được sử dụng trong chế độ nô lệ. |
Để biết thêm chi tiết về đăng ký i2C và mô tả bit, chúng tôi khuyên bạn nên giữ bảng dữ liệu mở UM10139[Chương: 14.7, Trang số: 215]
Dự án ví dụ: Hãy giao diện nối tiếp EEPROM 24LC512 sử dụng I2C trong vi điều khiển ARM7 LPC2148. Giao tiếp I2C-EEPROM với LPC2148 rất đơn giản và thẳng về phía trước. Ở đây chúng ta sẽ thực hiện các thao tác đọc, ghi và xóa trên EEPROM bằng cách sử dụng I2C và giá trị sẽ được hiển thị trên cổng nối tiếp sử dụng UART0. Sự chậm trễ xảy ra trong mọi dữ liệu đọc từ EEPROM. Sự chậm trễ phụ thuộc vào trình biên dịch làm thế nào nó tối ưu hóa vòng lặp ngay sau khi bạn thực hiện thay đổi trong các tùy chọn thay đổi chậm trễ.
Thiết lập mạch: I2C trong LPC2148 vi điều khiển ARM7
MÃ NGUỒN: I2C trong LPC2148 vi điều khiển ARM7
Để tải xuống toàn bộ tệp dự án, hãy nhấp vào đây
Dự án được kiểm tra và hoạt động đầy đủ. Chúng tôi chỉ phải biên dịch và tải về hex tập tin vào LPC2148 Vi điều khiển. Để xem đầu ra trên máy tính, chúng ta sẽ phải cấu hình PuTTY để thiết lập giao tiếp nối tiếp để đọc dữ liệu từ EEPROM 24LC512.
QUAN TRỌNG: Sau khi tải tập tin .hex, Hãy chắc chắn rằng bạn không vào chế độ ISP. Chúng tôi sẽ sử dụng UART0 để lập trình cũng như đọc dữ liệu từ 24LC512 EEPROM. Trong trường hợp nếu bạn đang sử dụng STK2148-UltraLite Board thì tắt SW7 switch để đọc dữ liệu trên PuTTY / HyperTerminal.
Khi chúng tôi đã thực hiện xong tất cả các cài đặt, chỉ cần mở bảng điều khiển. Và chúng ta sẽ bắt đầu nhận chuỗi từ EEPROM trên PuTTY. Đây là một đầu ra từ dự án của chúng tôi:
Hiệu trưởng chúng ta học về thiết bị EEPROM nối tiếp I2C này có thể được áp dụng cho các thiết bị I2C khác, sự khác biệt chỉ dựa trên các thuật ngữ được sử dụng; trên EEPROM nối tiếp chúng tôi sử dụng địa chỉ bộ nhớ để lưu trữ và truy xuất dữ liệu, trong khi trên các thiết bị I2C khác như Microchip MCP23008 8-bit I / O expander hoặc Dallas DS1307 Real Time Clock, chúng tôi sử dụng địa chỉ đăng ký để ghi và đọc dữ liệu.
Đó là tất cả những gì bạn cần biết để sử dụng chip EEPROM I ²C bên ngoài. Tôi hy vọng bài viết này sẽ giúp bạn có được chương trình I2C trong LPC2148 ARM7 Vi điều khiển để đọc, ghi và xóa dữ liệu của EEPROM. Trong các bài viết tương lai của chúng tôi, chúng tôi sẽ tìm hiểu về giao thức SPI của vi điều khiển LPC2148 ARM7