II. VI ĐIỀU KHIỂN PIC16F877A
9. Giao tiếp I2C
I2C là tên viết tắt của cụm từ Inter Intergrated Circuit – Bus giao tiếp giữa các IC với nhau. Đây là chuẩn giao tiếp nối tiếp 2 dây .
Dùng để giao tiếp IC hay thiết bị ngoại vi cần phải giao tiếp với các IC hay thiết bị khác (tức giao tiếp với thế giới bên ngoài). Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau như các loại Vi điều
34 | P a g e khiển 8051, PIC, AVR, ARM, chíp nhớ như RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tụ (DAC), IC điểu khiển LCD, LED…
9.1. Đặc điểm giao tiếp I2C
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock
(SCL).
SDA là đường truyền dữ liệu 2 hướng, còn SCL là đường truyền xung
đồng hồ và chỉ theo một hướng .
Khi một thiết bị ngoại vi kết nối vào đường I2C thì chân SDA của nó sẽ
nối với dây SDA của bus, chân SCL sẽ nối với dây SCL.
Kết nối thiết bị vào bus I2C ở chế độ chuẩn (Standard mode) và chế độ nhanh (Fast mode)
35 | P a g e
Quy ƣớc:
Một thiết bị hay một IC khi kết nối với bus I2C, ngoài một địa chỉ (duy
nhất) để phân biệt, nó còn được cấu hình là thiết bị chủ (master) hay tớ (slave). mỗi thiết bị sẽ được nhận ra bởi một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại trong suốt thời gian kết nối.
Trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ (master).
Thiết bị chủ nắm vai trò tạo xung đồng hồ cho toàn hệ thống, khi giữa hai thiết bị chủ/tớ giao tiếp thì thiết bị chủ có nhiệm vụ tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trò chủ động, còn thiết bị tớ giữ vai trò bị động trong giao tiếp.
Mỗi thiết bị có thể hoạt đông như là thiết bị nhận dữ liệu hay có thể vừa
truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc vào việc thiết bị đó là chủ (master) hay tớ(slave).
Về dữ liệu truyền trên bus I2C, một bus I2C chuẩn truyền 8‐bit dữ liệu
có hướng trên đường truyền với tốc độ là 100Kbits/s – Chế độ chuẩn (Standard mode). Tốc độ truyền có thể lên tới 400Kbits/s – Chế độ nhanh
(Fast mode) và cao nhất là 3,4Mbits/s – Chế độ cao tốc (High‐speed
mode).
Một bus I2C có thể hoạt động ở nhiều chế độ khác nhau:
Một chủ một tớ (one master – one slave)
Một chủ nhiều tớ (one master – multi slave)
Nhiều chủ nhiều tớ (Multi master – multi slave)
Dù ở chế độ nào, một giao tiếp I2C đều dựa vào quan hệ chủ/tớ.
Giả thiết một thiết bị A muốn gửi dữ liệu đến thiết bị B, quá trình được thực hiện như sau:
36 | P a g e
Thiết bị A (Chủ) xác định đúng địa chỉ của thiết bị B
(tớ), cùng với việc xác định địa chỉ, thiết bị A sẽ quyết định việc đọc hay ghi vào thiết bị tớ
Thiết bị A gửi dữ liệu tới thiết bị B
Thiết bị A kết thúc quá trình truyền dữ liệu
Khi A muốn nhận dữ liệu từ B, quá trình diễn ra như trên, chỉ khác là A sẽ nhận dữ liệu từ B. Trong giao tiếp này, A là chủ còn B vẫn là tớ.
9.2. Điều kiện START-STOP
START và STOP là những điều kiện bắt buộc phải có khi một thiết bị chủ muốn thiết lập giao tiếp với một thiết bị nào đó trong mạng I2C.Ban đầu khi chưa thực hiện quá trình giao tiếp, cả hai đường SDA và SCL đều ở mức cao (SDA = SCL = HIGH). Lúc này bus I2C được coi là dỗi (“bus free”), sẵn sàng
cho một giao tiếp.
Điều kiện START: là điều kiện khởi đầu, báo hiệu bắt đầu của giao tiếp.Một sự chuyển đổi trạng thái từ cao xuống thấp trên đường SDA trong khi đường SCL đang ở mức cao (cao = 1; thấp = 0) báo hiệu một điều kiện START
37 | P a g e Điều kiện STOP: báo hiệu kết thúc một giao tiếp. Một sự chuyển đổi trạng thái từ mức thấp lên cao trên đường SDA trong khi đường SCL đang ở mức cao.
Cả hai điều kiện START và STOP đều được tạo ra bởi thiết bị chủ. Sau tín hiệu START, bus I2C coi như đang trong trang thái làm việc (busy). Bus I2C sẽ rỗi, sẵn sàng cho một giao tiếp mới sau tín hiệu STOP từ phía thiết bị chủ.
Sau khi có một điều kiện START, trong qua trình giao tiếp, khi có một tín hiệu START được lặp lại thay vì một tín hiệu STOP thì bus I2C vẫn tiếp tục trong trạng thái bận. Tín hiệu START và lặp lại START đều có chức năng giống nhau là khởi tạo một giao tiếp.
9.3. Định dạng truyền dữ liệu
Dữ liệu được truyền trên bus I2C theo từng bit, bit dữ liệu được truyền đi tại mỗi sườn dương của xung đồng hồ trên dây SCL, quá trình thay đổi bit dữ liệu xảy ra khi SCL đang ở mức thấp.
Quá trình truyền 1 bit dữ liệu
Mỗi byte dữ liệu được truyền có độ dài là 8 bits.
Số lượng byte có thể truyền trong một lần là không hạn chế.
Mỗi byte được truyền đi theo sau là một bit ACK để báo hiệu đã
nhận dữ liệu. Đây là điều kiên bắt buộc, nhằm đảm bảo cho quá trình truyền nhận được diễn ra chính xác.
38 | P a g e Dữ liệu truyền trên bus I2C
Bit ACK trên bus I2C
Mô tả việc truyền dữ liệu
Bit có trọng số cao nhất (MSB) sẽ được truyền đi đầu tiên, các bít
sẽ được truyền đi lần lượt.
39 | P a g e
Lúc này thiết bị nhận, sau khi đã nhận đủ 8 bít dữ liệu sẽ kéo SDA
xuống mức thấp tạo một xung ACK ứng với xung clock thứ 9 trên dây SDA để báo hiệu đã nhận đủ 8 bit.
Thiết bị truyền khi nhận được bit ACK sẽ tiếp tục thực hiện quá
trình truyền hoặc kết thúc.
Khi không nhận được đúng địa chỉ hay khi muốn kết thúc quá trình
giao tiếp, thiết bị nhận sẽ gửi một xung Not‐ACK (SDA ở mức
cao) để báo cho thiết bị chủ biết, thiết bị chủ sẽ tạo xung STOP để kết thúc hay lặp lại một xung START để bắt đầu quá trình mới.
9.4. Định dạng địa chỉ thiết bị
Mỗi thiết bị ngoại vi tham gia vào bus i2c đều có một địa chỉ duy nhất, nhằm phân biệt giữa các thiết bị với nhau. Độ dài địa chỉ là 7 – bit, điều đó có nghĩa là trên một bus I2C ta có thể phân biệt tối đa 128 thiết bị.
Khi thiết bị chủ muốn giao tiếp với ngoại vi nào trên bus I2C, nó sẽ gửi 7 bit địa chỉ của thiết bị đó ra bus ngay sau xung START. Byte đầu tiên được gửi sẽ bao gồm
7 bit địa chỉ . Mỗi một thiết bị ngoại vi sẽ có một địa chỉ riêng do
nhà sản xuất ra nó quy định. Địa chỉ đó có thể là cố định hay thay đổi.
Bít thứ 8 (R/W) quy định chiều truyền dữ liệu. Nếu bit này bằng
“0” có nghĩa là byte dữ liệu tiếp theo sau sẽ được truyền từ chủ đến tớ, còn ngược lại nếu bằng “1” thì các byte theo sau byte đầu tiên sẽ là dữ liệu từ con tớ gửi đến con chủ. Việc thiết lập giá trị cho bit này do con chủ thi hành, con tớ sẽ tùy theo giá trị đó mà có sự phản hồi tương ứng đến con chủ.
40 | P a g e Quá trình truyền dữ liệu
Truyền dữ liệu từ chủ đến tớ (ghi dữ liệu): Thiết bị chủ khi muốn ghi dữ liệu đến con tớ, quá trình thực hiện là:
Thiết bị chủ tạo xung START
Thiết bị chủ gửi địa chỉ của thiết bị tớ mà nó cần giao tiếp cùng với bit
R/W= 0 ra bus và đợi xung ACK phản hồi từ con tớ
Khi nhận được xung ACK báo đã nhận diện đúng thiết bị tớ, con chủ bắt
đầu gửi dữ liệu đến con tớ theo từng byte một. Theo sau mỗi byte này đều là một xung ACK. Số lượng byte truyền là không hạn chế.
Kết thúc quá trình truyền, con chủ sau khi truyền byte cuối sẽ tạo xung
41 | P a g e Ghi dữ liệu từ chủ đến tớ
Truyền dữ liệu từ tớ đến chủ (đọc dữ liệu): Thiết bị chủ muốn đọc dữ liệu từ thiết bị tớ, quá trình thực hiện như sau:
Khi bus rỗi, thiết bị chủ tạo xung START, báo hiệu bắt đầu giao tiếp
Thiết bị chủ gửi địa chỉ của thiết bị tớ cần giao tiếp cùng với bit = 1 và
đợi xung ACK từ phía thiết bị tớ
Sau xung ACK dầu tiên, thiết bị tớ sẽ gửi từng byte ra bus, thiết bị chủ
sẽ
nhận dữ liệu và trả về xung ACK. Số lượng byte không hạn chế
Khi muốn kết thúc quá trình giao tiếp, thiết bị chủ gửi xung Not‐ACK
và tạo xung STOP để kết thúc.
Quá trình kết hợp ghi và đọc dữ liệu: giữa hai xung START và STOP, thiết bị chủ có thể thực hiện việc đọc hay ghi nhiều lần, với một hay nhiều thiết bị. Để thực hiện việc đó, sau một quá trình ghi hay đọc, thiết bị chủ lặp lại một xung START và lại gửi lại địa chỉ của thiết bị tớ và bắt đầu một quá trình mới.
42 | P a g e