bai8.giao tiepTWI-I2C - Pdf 19

Bài 8 - Giao tiếp TWI - I2C


1

2

3

4

5
( 21 Votes )
Nội dung Các bài cần tham khảo trước
1. Bạn sẽ đi đến đâu .
2. Giao diện TWI – I2C .
3. TWI trên AVR .
4. Điều khiển AVR TWI.
Download ví dụ
Cấu trúc AVR .
WinAVR .
C cho AVR.
Mô phỏng với Proteus.

I. Bạn sẽ đi đến đâu.
Bài này giới thiệu cách giao tiếp bằng truyền thông nối tiếp đồng bộ Two-Wire
Serial (TWI) tương thích với chuẩn I
2
C. Trong bài này chúng ta sẽ khảo sát 2 mode
truyền và nhận trên chip Master cùng với 2 mode truyền và nhận trên chip Slave.
Công cụ chính cũng là 2 bộ phần mềm WinAVR và Proteus. Vi điều khiển

có thể có nhiều hơn một thiết bị làm Master, đồng thời một Slave có thể trở thành
một Master nếu nó có khả năng. Ví dụ trong một mạng TWI của nhiều AVR kết nối
với nhau, bất kỳ một AVR nào đều có thể trở thành Master ở một thời điểm nào đó.
Tuy nhiên nếu một mạng dùng một AVR điều khiển các chip nhớ (như EEPROM
AT24C1024 chẳng hạn) thì khái niệm “multi-master” không tồn tại vì các chip nhớ
được thiết kế sẵn là Slave, không có khả năng trở thành master. TWI (I2C) được
thực hiện trên 2 đường SDA (Serial DATA) và SCL (Serial Clock) trong đó SDA là
đường truyền/nhận dữ liệu và SCL là đường xung nhịp. Căn cứ theo chuẩn I2C,
các đường SDA và SCL trên các thiết bị có cấu hình “cực góp mở” (open-drain
hoặc open-collector, tham khảo các mạch số dùng transistor để hiểu thêm), nghĩa là
cần có các “điện trở kéo lên” (pull-up resistor) cho các đường này. Ở trạng thái
nghỉ (Idle), 2 chân SDA và SCL ở mức cao. Hình 1 mô tả một mô hình mạng TWI
(I2C) cơ bản.
Hình 1. Mạng TWI (I2C) với nhiều thiết bị và 2 điện trở kéo lên cho SDA, SCL.
Tiếp theo chúng ta tìm hiểu một số khái niệm và đặc điểm của TWI. Các
khái niệm và đặc điểm tôi đề cập dưới đây được dùng cho cả TWI và I2C, nếu có
sự khác biệt tôi sẽ giải thích thêm.
Master: là chip khởi động quá trình truyền nhận, phát đi địa chỉ của thiết bị
cần giao tiếp và tạo xung giữ nhịp trên đường SCL.
Slave: là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu
từ Master.
SDA- Serial Data: là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ
hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit một. Chú ý là
trong chuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền trước nhất, đặc điểm
này ngược lại với chuẩn UART.
SCL –Serial Clock: là đường giữ nhịp nối tiếp. TWI (I2C) là chuần truyền
thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá trình
truyền/nhận, cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ liệu trên đường
SDA sẽ được lấy mẫu (sample). Dữ liệu nối tiếp trên đường SDA được lấy mẫu khi
đường SCL ở mức cao trong một chu kỳ giữ nhịp, vì thế đường SDA không được

không được dùng). Riêng địa chỉ 0 được dùng cho “cuộc gọi chung” (General call).
Bit READ/WRITE (R/W) được truyền tiếp sau 7 bit địa chỉ là bit báo cho Slave
biết Master muốn “đọc” hay “ghi” vào Slave. Nếu bit này bằng 0 (gọi là W) thì quá
trình “Ghi” dữ liệu từ Master đến Slave được yêu cầu, nếu bit này bằng 1 (gọi là R)
thì Master muốn “đọc” dữ liệu từ Slave về. Tám bits trên (SLA+R/W) được Master
phát ra sau khi phát START condition, nếu một Slave trên mạng nhận ra rằng địa
chỉ mà Master yêu cầu trùng khớp với Device address của chính mình, nó sẽ “đáp
trả” lại Master bằng cách phát ra 1 tín hiệu “xác nhận” ACK bằng cách kéo chân
SDA xuống thấp trong xung thứ 9. Ngược lại, nếu không có Slave đáp ứng lại,
chân SDA vẫn ở mức cao trong xung giữ nhịp thứ 9 thì gọi là tín hiệu “không xác
nhận” – NOT ACK, lúc này Master cần có những ứng xử phù hợp tùy theo mỗi
trường hợp cụ thể, ví dụ Master có thể gởi STOP condition và sau đó phát lại địa
chỉ Slave khác…Như vậy, trong 9 bit của gói địa chỉ thì chỉ có 8 bit được gởi bởi
Master, bit còn lại là do Slave. Ví dụ Master muốn yêu cầu “đọc” dữ liệu từ Slave
có địa chỉ 43, nó cần phát đi một byte như sau trên đường truyền: (43<<1)+1,
trong đó (43<<1) là dịch số 43 về bên trái 1 vị trí vì 7 bit địa chỉ nằm ở các vị trí
cao trong gói địa chỉ, sau đó cộng giá trị này với “1” tức là quá trình “đọc” được
yêu cầu.

General call – Cuộc gọi chung: khi Master phát đi gói địa chỉ có dạng 0
(thực chất là 0+W) tức nó muốn thực hiện một cuộc gọi chung đến tất cả các Slave.
Tất nhiên, cho phép hay không cho phép cuộc gọi chung là do Slave quyết định.
Nếu các Slave được cài đặt cho phép cuộc gọi chung, chúng sẽ đáp lại Master bằng
ACK. Cuộc gọi chung thường xảy ra khi Master muốn gởi dữ liệu chung đến các
Slaves. Chú ý là cuộc gọi chung có dạng 0+R là vô nghĩa vì không thể có chuyện
Master nhận dữ liệu từ tất cả các Slave cùng thời điểm.
Data Packet Format – Định dạng gói dữ liệu: sau khi địa chỉ đã được phát
đi, Slave đã đáp lại Master bằng ACK thì quá trình truyền/nhận dữ liệu sẽ diễn ra
giữa cặp Master/Slave này. Tùy vào bit R/W trong gói địa chỉ, dữ liệu có thể được
truyền theo hướng từ Master đến Slave hay từ Slave đến Master. Dù di chuyển theo

địa chỉ TWAR và thanh ghi dữ liệu TWDR.
- TWBR (TWI Bit Rate Register): là 1 thanh ghi 8 bit quy định tốc độ phát
xung giữ nhịp trên đường SCL của chip Master.

Tốc độ phát xung giữ nhịp được tính theo công thức:
Trong đó CPU Clock frequency là tần số hoạt động chính của AVR, TWBR là
giá trị thanh thi TWBR và TWPS là giá trị của 2 bits TWPS1 và TWPS0 nằm trong
thanh thi trạng thái TWSR. Hai bits này được gọi là bit prescaler, thông thường
người ta hay set TWPS1:0 =00 để chọn Prescaler là 1 (40=1). Bảng 1 tóm tắt tốc
độ xung giữ nhịp tạo ra trên SCL đối với các giá trị của tham số:
Bảng 1. Tốc độ xung giữ nhịp tham khảo.

- TWCR (TWI Control Register): là thanh ghi 8 bit điều khiển hoạt động của
TWI.

• Bit 7- TWINT (TWI Interrupt Flag): là một cờ báo rất quan trọng. TWINT
được tự động set lên 1 khi TWI kết thúc một quá trình bất kỳ nào đó (như
phát/nhận START, phát nhận địa chỉ…). Chú ý là bit này không tự động được xóa
bởi phần cứng như các cờ báo trong các module khác. Vì thế, khi lập trình điều
khiển TWI chúng ta luôn phải xóa TWINT trước khi muốn thực hiện một quá trình
nào đó. Một điểm quan trọng cần lưu ý là bit TWINT được xóa khi chúng ta viết
giá trị 1 vào nó. Trong khi lập trình cho TWI, chúng ta thường xóa TWINT bằng
cách viết 1 vào nó, sau đó liên tục kiểm tra TWINT, nếu bit này được set lên 1 thì
quá trình đã hoàn thành.
• Bit 6 – TWEA (TWI Enable Acknowledge Bit): tạm hiểu là bit kích hoạt tín
hiệu xác nhận. Đối với chip Slave, nếu bit này được set thì tín hiệu xác ACK sẽ
được gởi trong các trường hợp sau: địa chỉ do Master phát ra trùng khớp với địa
chỉ của Slave; một cuộc gọi chung đang xảy ra và Slave này cho phép cuộc gọi
chung; dữ liệu đã được Slave nhận từ Master. Như thế, khi set một chip ở chế độ
Slave, chúng ta cần set bit này để nó có thể đáp ứng lại Master bất cứ khi nào được

riêng lẻ.
- TWSR (TWI Status Register): là 1 thanh ghi 8 bit trong đó có 5 bit chứa
code trạng thái của TWI và 2 bit chọn prescaler.

Có rất nhiều bước, nhiều tình huống xảy ra khi giao tiếp bằng TWI cho cả
Master và Slave. Ứng với mỗi trường hợp TWI sẽ tạo ra 1 code trong thanh ghi
TWSR . Lập trình cho TWI cần xét code trong 5 bit cao của thanh ghi TWSR và
đưa ra các ứng xử hợp lý ứng với từng code.
- TWDR (TWI Data Register): là thanh ghi dữ liệu chính của TWI. Trong
quá trình nhận, dữ liệu nhận về sẽ được lưu trong TWDR. Trong quá trình gởi, dữ
liệu chứa trong TWDR sẽ được chuyển ra đường SDA.
- TWAR (TWI Address Register): là thanh ghi chứa device address của chip
Slave. Cấu trúc thanh ghi được trình bày trong hình dưới.

Nhớ lại địa chỉ Slave được tạo thành từ 7 bits, trên thanh ghi TWAR 7 bits địa
chỉ này nằm ở 7 vị trí cao. Trước khi sử dụng TWI như Slave, chúng ta phải gán
địa chỉ cho chip, việc viết địa chỉ thường được thực hiện bằng lệnh TWAR =
(Device_address<<1)+TWGCE. Trong đó TWGCE (TWI General Call Enable) là
bit cho phép cuộc gọi chung. Như tôi đề cập bên trên, Slave co quyền cho phép
Master thực hiện cuộc gọi chung với nó hay không. Nếu TWGCE=1, Slave sẽ đáp
ứng lại cuộc gọi chung nếu có, nếu TWGCE=0 thì Slave sẽ bỏ qua cuộc gọi
chung.
2. Hoạt động của TWI:
TWI trên AVR được gọi là byte-oriented (tạm dịch là hướng byte) và
interrupt-based (dựa trên ngắt). Bất kỳ một sự kiện nào trong quá trình truyền/nhận
TWI cũng có thể gây ra 1 ngắt TWI. TWI trên AVR vì thế hoạt động tương đối độc
lập với chip. Tuy nhiên, cần khai thác ngắt trên AVR một cách hơp lý. Ví dụ, đối
với Master, chúng ta không cần sử dụng ngắt vì chip này hoàn toàn chủ động trong
việc truyền và nhận. Riêng với Slave, sử dụng ngắt để tránh bỏ lỡ các cuộc gọi là
cần thiết.

TWSR (chỉ 5 bit cao). Chúng ta chỉ thanh ghi này và đối chiếu với bảng code quy
định sẵn để biết trạng thái đường truyền và đưa ra quyết định tiếp theo. Hình 2 mô
tả một quá trình Master truyền dữ liệu, các khả năng có thể xảy ra và giá trị tương
ứng của thanh ghi TWSR. Ý nghĩa các code trong thanh ghi TWSR trong lúc
Master truyền dữ liệu có thể tham khảo thêm datasheet của chip.


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status