- Giao thức truyền thông I2C là gì?
- I2C Communication hoạt động như thế nào?
- Sử dụng giao tiếp I2C ở đâu?
- I2C trong MSP430: Điều khiển chiết áp kỹ thuật số AD5171
MSP430 là một nền tảng mạnh mẽ được cung cấp bởi Texas Instruments cho các dự án nhúng, tính chất linh hoạt của nó đã khiến nó tìm cách đưa vào nhiều ứng dụng và giai đoạn này vẫn đang tiếp tục. Nếu bạn đã theo dõi các hướng dẫn MSP430 của chúng tôi thì bạn sẽ nhận thấy rằng chúng tôi đã bao gồm một loạt các hướng dẫn về vi điều khiển này bắt đầu từ những điều cơ bản. Kể từ bây giờ, chúng tôi đã đề cập đến những điều cơ bản mà chúng tôi có thể tham gia vào những thứ thú vị hơn như cổng giao tiếp.
Trong hệ thống rộng lớn của các ứng dụng nhúng, không có vi điều khiển nào có thể tự thực hiện tất cả các hoạt động. Tại một số thời điểm nó phải giao tiếp với các thiết bị khác để chia sẻ thông tin, có nhiều loại giao thức truyền thông khác nhau để chia sẻ những thông tin này, nhưng được sử dụng nhiều nhất là USART, IIC, SPI và CAN. Mỗi giao thức truyền thông đều có ưu và nhược điểm riêng. Bây giờ chúng ta hãy tập trung vào phần I2C vì đó là những gì chúng ta sẽ tìm hiểu trong hướng dẫn này.
Giao thức truyền thông I2C là gì?
Thuật ngữ IIC là viết tắt của “ Inter Integrated Circuits ”. Nó thường được ký hiệu là I2C hoặc I bình phương C hoặc thậm chí là giao thức giao diện 2 dây (TWI) ở một số nơi nhưng tất cả đều có nghĩa giống nhau. I2C là một giao thức truyền thông đồng bộ có nghĩa là cả hai thiết bị đang chia sẻ thông tin phải chia sẻ một tín hiệu đồng hồ chung. Nó chỉ có hai dây để chia sẻ thông tin, trong đó một dây được sử dụng cho tín hiệu vòi và dây kia được sử dụng để gửi và nhận dữ liệu.
I2C Communication hoạt động như thế nào?
Giao tiếp I2C lần đầu tiên được giới thiệu bởi Phillips. Như đã nói trước đó, nó có hai dây, hai dây này sẽ được kết nối trên hai thiết bị. Ở đây một thiết bị được gọi là chủ và thiết bị còn lại được gọi là tớ. Giao tiếp nên và sẽ luôn xảy ra giữa hai Master và một Slave. Ưu điểm của giao tiếp I2C là có thể kết nối nhiều hơn một nô lệ với một Master.
Giao tiếp hoàn chỉnh diễn ra thông qua hai dây này là Đồng hồ nối tiếp (SCL) và Dữ liệu nối tiếp (SDA).
Đồng hồ nối tiếp (SCL): Chia sẻ tín hiệu đồng hồ được tạo ra bởi chính với phụ
Dữ liệu nối tiếp (SDA): Gửi dữ liệu đến và đi giữa Master và slave.
Tại bất kỳ thời điểm nào, chỉ có chủ mới có thể bắt đầu giao tiếp. Vì có nhiều hơn một slave trong bus, master phải tham chiếu đến mỗi slave bằng cách sử dụng một địa chỉ khác nhau. Khi được giải quyết, chỉ nô lệ có địa chỉ cụ thể đó sẽ trả lời lại thông tin trong khi những người khác tiếp tục thoát. Bằng cách này, chúng ta có thể sử dụng cùng một bus để giao tiếp với nhiều thiết bị.
Các mức điện áp của I2C không được xác định trước. Giao tiếp I2C linh hoạt, có nghĩa là thiết bị được cấp nguồn bằng điện áp 5v, có thể sử dụng 5v cho I2C và thiết bị 3.3v có thể sử dụng 3v cho giao tiếp I2C. Nhưng điều gì sẽ xảy ra nếu hai thiết bị đang chạy trên các điện áp khác nhau, cần giao tiếp bằng I2C? Một 5V I2C xe buýt không thể được kết nối với 3.3V thiết bị. Trong trường hợp này, các bộ dịch chuyển điện áp được sử dụng để phù hợp với các mức điện áp giữa hai bus I2C.
Có một số tập hợp các điều kiện định khung giao dịch. Khởi tạo quá trình truyền bắt đầu với một cạnh xuống của SDA, được định nghĩa là điều kiện 'BẮT ĐẦU' trong sơ đồ dưới đây, nơi cái chính để SCL ở mức cao trong khi đặt SDA ở mức thấp.
Như thể hiện trong sơ đồ bên dưới, Cạnh rơi của SDA là phần cứng kích hoạt điều kiện START. Sau đó, tất cả các thiết bị trên cùng một bus sẽ chuyển sang chế độ nghe.
Theo cách tương tự, cạnh lên của SDA dừng quá trình truyền được hiển thị dưới dạng điều kiện 'DỪNG' trong sơ đồ trên, trong đó thiết bị chính để SCL ở mức cao và cũng giải phóng SDA để ở mức CAO. Vì vậy, cạnh lên của SDA dừng quá trình truyền.
Bit R / W cho biết hướng truyền của các byte tiếp theo, nếu nó là CAO có nghĩa là phụ sẽ truyền và nếu nó thấp có nghĩa là chủ sẽ truyền.
Mỗi bit được truyền trên mỗi chu kỳ đồng hồ, vì vậy cần 8 chu kỳ đồng hồ để truyền một byte. Sau mỗi byte được gửi hoặc nhận, chu kỳ đồng hồ thứ chín được giữ cho ACK / NACK (được thừa nhận / không được thừa nhận). Bit ACK này được tạo ra bởi slave hoặc master tùy thuộc vào tình huống. Đối với bit ACK, SDA được đặt thành mức thấp bởi chính hoặc phụ ở chu kỳ đồng hồ thứ 9. Vì vậy, nó thấp nó được coi là ACK nếu không NACK.
Sử dụng giao tiếp I2C ở đâu?
Giao tiếp I2C chỉ được sử dụng cho giao tiếp khoảng cách ngắn. Nó chắc chắn đáng tin cậy ở một mức độ nào đó vì nó có xung đồng hồ được đồng bộ hóa để làm cho nó trở nên thông minh. Giao thức này chủ yếu được sử dụng để giao tiếp với cảm biến hoặc các thiết bị khác phải gửi thông tin đến chủ. Nó rất tiện dụng khi một bộ vi điều khiển phải giao tiếp với nhiều mô-đun phụ khác bằng cách sử dụng tối thiểu chỉ dây. Nếu bạn đang tìm kiếm một giao tiếp tầm xa, bạn nên thử RS232 và nếu bạn đang tìm kiếm một giao tiếp đáng tin cậy hơn, bạn nên thử giao thức SPI.
I2C trong MSP430: Điều khiển chiết áp kỹ thuật số AD5171
Energia IDE là một trong những phần mềm dễ dàng nhất để lập trình MSP430 của chúng tôi. Nó giống như Arduino IDE. Bạn có thể tìm hiểu thêm về Bắt đầu với MSP430 bằng Energia IDE tại đây.
Vì vậy, để sử dụng I2C trong Energia IDE, chúng ta chỉ cần bao gồm tệp tiêu đề wire.h. Khai báo chân (SDA và SCL) nằm bên trong thư viện dây nên chúng ta không cần khai báo trong hàm setup .
Các ví dụ mẫu có thể được tìm thấy trong menu Ví dụ của IDE. Một trong những ví dụ được giải thích dưới đây:
Ví dụ này cho thấy cách điều khiển Chiết áp kỹ thuật số AD5171 của Thiết bị Analog giao tiếp qua giao thức nối tiếp đồng bộ I2C. Sử dụng Thư viện dây I2C của MSP, nồi kỹ thuật số sẽ vượt qua 64 cấp độ điện trở, làm mờ một đèn LED.
Đầu tiên, chúng tôi sẽ bao gồm thư viện chịu trách nhiệm về giao tiếp i2c tức là thư viện dây
#include
Trong hàm thiết lập , chúng ta sẽ khởi tạo thư viện dây bằng hàm.begin () .
void setup () { Wire.begin (); }
Sau đó khởi tạo một biến val để lưu trữ các giá trị của chiết áp
byte val = 0;
Trong chức năng vòng lặp , chúng tôi sẽ bắt đầu truyền đến thiết bị phụ i2c (trong trường hợp này là IC chiết áp kỹ thuật số) bằng cách chỉ định địa chỉ thiết bị được đưa ra trong biểu dữ liệu của IC.
void loop () { Wire.beginTransmission (44); // truyền tới thiết bị # 44 (0x2c)
Sau đó, xếp hàng byte tức là dữ liệu bạn muốn gửi đến IC để truyền với hàm write () .
Wire.write (byte (0x00)); // gửi byte lệnh Wire.write (val); // gửi byte giá trị chiết áp
Sau đó truyền chúng bằng cách gọi endTransmission () .
Wire.endTransmission (); // ngừng truyền val ++; // tăng giá trị if (val == 64) {// nếu đạt đến vị trí thứ 64 (max) val = 0; // bắt đầu lại từ giá trị thấp nhất } delay (500); }