GIAO TIẾP I2C (PHẦN 2)

0
1997

Định dạng dữ liệu truyền

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 cạnh lên 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.

Giao tiếp i2c

Hình 5: Quá trình truyền 1 bit dữ liệu

Mỗi byte dữ liệu được truyền có độ dài là 8 bit. 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. Bit có trọng số cao nhất (MSB) sẽ được truyền đi đầu tiên, các bit sẽ được truyền đi làn lượt. Sau 8 xung clock trên dây SCL, 8 bit dữ liệu đã được truyền đi. 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.

Giao tiếp i2c

 

Giao tiếp i2c

Một byte truyền đi có kèm theo bit ACK 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. 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.

Đị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ỉ và một bít thứ 8 điều khiển hướng truyền.

Giao tiếp i2c

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. Riêng bit điều khiển hướng sẽ 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ủ.

Hiện nay có thể đánh địa chỉ các thiết bị trên bus I2C dưới dạng 10 bit địa chỉ. Việc thực hiện đánh dấu địa chỉ theo khung 10 bit được thực hiện nếu sau lệnh START ta gửi chuỗi 11110 (số nhị phân) ra đường SDA.

 

Truyền dữ liệu trên bus I2C, chế độ Master – Slave

Việc truyền dữ liệu diễn ra giữa con chủ và con tớ. Dữ liệu truyền có thể theo 2 hướng, từ chủ đến tớ hay ngược lại. Hướng truyền được quy định bởi bit thứ 8 R/W trong byte đầu tiên (byte địa chỉ) được truyền đi.

Giao tiếp i2c

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 STOP báo hiệu kết thúc.

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 R/W = 1 và đợi xung ACK từ phía thiết bị tớ

–   Sau xung ACK từ con tớ, 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.

Giao tiếp i2c

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.

Giao tiếp i2c

Chế độ giao tiếp MasterSlave là chế độ cơ bản trong một bus I2C, toàn bộ bus được quản lý bởi một master duy nhát. Trong chế độ này sẽ không xảy ra tình trạng xung đột bus hay mất đồng bộ xung clock vì chỉ có một con chủ (master) duy nhất có thể tạo xung clock.

Chế độ Multi Master

Trên bus I2C có thể có nhiều hơn một con chủ điều khiển bus. Khi đó bus I2C sẽ hoạt động ở chế độ Multi Master.

Leave a Reply