Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

Phần 1.

I2C
Tổng quan
I2C (Inter-Intergrated Circuit, ñọc là eye-two-see hoặc eye-squared-see) là chuẩn
giao tiếp 2 dây (còn gọi là Two-wired Serial interface) do Philips ñưa ra. Mục tiêu là tạo
kết nối ñơn giản giữa các IC với các IC khác hoặc với các thiết bị ngoại vi.
Chuẩn I2C ñược hỗ trợ bởi nhiều nhà sản xuất IC và trở thành chuẩn công nghiệp
trong giao tiếp ñiều khiển.

Hoạt ñộng
Chế ñộ hoạt ñộng
Giao tiếp I2C có các chế ñộ hoạt ñộng là:
o 1 Master và 1 Slave
o 1 Master và nhiều Slave
o nhiều Master và nhiều Slave
Ở ñây chỉ ñề cập ñến chế ñộ cơ bản nhất là Master - Slave.
I2C sử dụng 2 ñường nối dạng cực máng hở là SDA - Serial Data và SCL - Serial
Clock, do ñó cần ñược nối với ñiện trở kéo lên. ðiện áp sử dụng thường là +5V hoặc
+3.3V.
SDA là chân truyền dữ liệu và theo 2 hướng, trong khi ñó, SCL là chân truyền
xung clock và chỉ theo 1 hướng.

Khi Master truyền data cho Slave

Khi Master nhận data từ Slave

Trang 1
Trong kết nối I2C thì Master giữ vai trò ñiều khiển và giữ nhịp cho toàn hệ thống
bằng xung clock trên chân SCL. Trong khi ñó Slave hoàn toàn thụ ñộng và ñược ñiều
khiển bởi Master (chuẩn không cần chỉnh ☺). Master có thể truyền dữ liệu cho Slave
hoặc nhận dữ liệu từ Slave. Tuy nhiên, các Slave không thể trực tiếp làm việc với nhau
mà chỉ có thể thông qua Master.

ðịa chỉ
Mỗi thiết bị tham gia vào giao tiếp I2C có một ñịa chỉ duy nhất, bao gồm 7 bits.
ðịa chỉ này do nhà sản xuất quy ñịnh (một số IC có thể ñiều chỉnh ñược ñịa chỉ của mình
bằng cách thay ñổi các bit ñịa chỉ thấp). IC STA015 ñược sử dụng trong ñề tài này có ñịa
chỉ quy ñịnh là 1000011b. Master sẽ sử dụng ñịa chỉ này ñể giao tiếp với Slave mong
muốn trên bus I2C.
Một số ñịa chỉ ñặc biệt không ñược sử dụng:
ðịa chỉ R/W Chú thích
0000-000 0 General Call
0000-000 1 START byte
0000-001 x
0000-010 x
0000-011 x
0000-1xx x
1111-1xx x
1111-0xx x ñịa chỉ slave 10 bits

Vận tốc truyền:

Standard mode 100 kHz


Fast mode 400 kHz
High-Speed mode 3.4 MHz

Truyền dữ liệu

Trang 2
Các bước truyền dữ liệu cơ bản có thể tóm tắt như sau:
 - gửi bit START (S)
 - gửi ñịa chỉ slave muốn giao tiếp (ADDR)
 - gửi bit READ(R)-1 hoặc WRITE(W)-0
 - chờ / gửi bit ACK
 - gửi/nhận byte dữ liệu (DATA)
 - chờ / gửi bit ACK
 - quay lại bước 5 nếu muốn gửi/nhận nhiều byte hoặc gửi bit STOP (P)

Truyền dữ liệu từ Master ñến Slave

Master gửi chuỗi S - ADDR - W vào bus I2C và chờ tín hiệu ACK. Nếu có một
Slave có ñịa chỉ ñúng với chuỗi ADDR thì nó sẽ phát tín hiệu ACK. Khi ñó Master sẽ gửi
byte DATA và chờ ACK, cứ lặp ñi lặp lại cho ñến khi ñã truyền xong. Cuối cùng Master
gửi P ñể dừng hoặc S ñể bắt ñầu lại quá trình truyền.

Truyền dữ liệu từ Slave ñến Master

Master gửi chuỗi S - ADDR - R vào bus I2C và chờ tín hiệu ACK. Nếu có một
Slave có ñịa chỉ ñúng với chuỗi ADDR thì nó sẽ phát tín hiệu ACK và gửi tiếp byte
DATA ñầu tiên. Sau khi nhận ñược byte DATA, Master gửi lại ACK và byte DATA tiếp
theo lại ñược Slave gửi. Khi không muốn nhận thêm dữ liệu, Master gửi tín hiệu NACK
và P / S.
Tín hiệu START và STOP chỉ có thể ñược tạo ra từ Master. Ngay khi nhận ñược
tín hiệu này, Slave sẽ tự reset mức giá trị logic của mình. ðiều này cho phép Master khởi
ñộng lại toàn bộ kết nối bất cứ khi nào.

Trang 3
START lặp (Sr)
Ngay sau khi hoàn thành việc gửi/nhận dữ liệu với một Slave, Master có thể ngay
lập tức khởi tạo một kết nối mới ñến một Slave khác mà không cần phải qua giai ñoạn
STOP.
Ví dụ: S-ADDR-(R/W)-ACK-DATA-ACK-Sr-ADDR-(R/W)-ACK-DATA-ACK-P
Ứng dụng chủ yếu của Sr là trong kết nối I2C với nhiều Master, khi mà một
Master dù ñã hoàn thành việc truyền dữ liệu nhưng không muốn trả lại quyền kiểm soát
bus cho Master khác. Trong kết nối I2C một Master thì việc này là không cần thiết.

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


Mỗi block truyền bao gồm 8 bits theo quy tắc MSB-first, bit có trọng số cao ñược
truyền ñi trước. Block khởi tạo bao gồm ñịa chỉ 7 bits và 1 bit R/W. Mỗi block ñược ñi
kèm theo sau bởi 1 tín hiệu ACK.

Việc thay ñổi mức tín hiệu trên SDA ñược thực hiện khi SCL ở mức thấp (nếu ở
mức cao sẽ trùng với tín hiệu START và STOP).

Bit ACK / NACK

Sau khi nhận ñược 8 bit DATA thành công, thiết bị nhận sẽ giữ SDA ở mức thấp
trong xung clock kế tiếp ñể tạo tín hiệu ACK nhằm báo hiệu cho bên gửi. Việc gửi/nhận
tín hiệu lại tiếp tục hoặc dừng lại tùy theo Master.
Nếu việc nhận dữ liệu có lỗi, bên nhận sẽ giữ SDA ở mức cao trong xung clock
kế tiếp nhằm tạo tín hiệu NACK. Khi ñó, có 2 trường hợp:
- Slave ñang gửi cho Master: Master sẽ tạo tín hiệu STOP hoặc reSTART.
- Master ñang gửi cho Slave: thông thường, Master sẽ tạo NACK sau khi ñã nhận
ñược byte DATA cuối cùng, nó báo hiệu cho Slave biết việc truyền dữ liệu ñã kết thúc.

Một số lưu ý:
- Khi một Slave cần thời gian ñể thu thập dữ liệu, xử lý ngắt hoặc v.v…, nó có thể
giữ ñường SCL ở mức thấp. Master khi ñó sẽ phải chờ cho ñến khi SCL ñược giải phóng
ñể tiếp tục.

Trang 4
- Số lượng thiết bị gắn kết vào bus I2C không chỉ phụ thuộc vào số lượng ñịa chỉ
có thể cung cấp mà còn bao gồm cả ñiện dung của toàn bus. Mức ñiện dung tối ña cho
phép là 400 pF.

Trang 5
Phần 2. Lập trình I2C
với ATmega8
Tổng quan
Một số ñặc ñiểm
o Two-wire Serial Interface - TWI
o hỗ trợ cả chế ñộ Master và Slave
o sử dụng như thiết bị gửi hoặc nhận
o sử dụng ñịa chỉ 7 bits
o tốc ñộ có thể ñạt 400kHz (Fast Mode)

Module TWI trong ATmega8

Trang 6
Bit Rate Generator Unit
- hoạt ñộng ở chế ñộ Master
- chứa Bit Rate Register (TWBR)
- ñiều khiển chu kỳ của chân SCL
- công thức
CPU _ clock _ frequence
SCL _ frequence =
16 + 2(TWBR ) * 4TWPS

Bus Interface Unit


- Data and Address Shift Register (TWDR), kết hợp (N)ACK
- START/STOP controller tạo / phát hiện các tín hiệu START / reSTART / STOP
- Arbitration detection (dùng trong chế ñộ Multi-Master)

Address Match Unit


- Address Register (TWAR) chứa ñịa chỉ
- Address Comparator kiểm tra ñịa chỉ 7 bit nhận ñược có trùng với ñịa chỉ trong
TWAR hay không

Control Unit
- TWI Control Register (TWCR) thiết lập cho hoạt ñộng của bộ TWI
- khi có một sự kiện xảy ra, cờ TWI Interrupt Flag (TWINT) ñược bật và TWI
Status Register (TWSR) ñược cập nhật
- khi TWINT Flag ñược bật, SCL sẽ ñược giữ ở mức thấp ñể chương trình hoàn
thành công việc trước khi việc truyền / nhận dữ liệu tiếp tục (coi lại phần trên)

***TWINT Flag ñược bật trong những trường hợp sau:


- sau khi gửi START / reSTART
- sau khi gửi SLA+R/W
- sau khi gửi 1 byte ñịa chỉ
- sau khi mất quyền kiểm soát bus I2C
- sau khi ñược Master gọi bằng ñịa chỉ hoặc general call
- sau khi nhận 1 byte dữ liệu
- sau khi nhận ñược STOP / reSTART
- khi có lỗi trên ñường truyền gây ra ñiều kiện START/STOP không hợp lệ

Trang 7
Các thanh ghi

Xác ñịnh hệ số chia cho bộ Bit Rate Generator.

Bit 7 - TWINT: TWINT Interrupt Flag


Cờ TWINT ược bật bằng phần cứng. Khi cờ TWINT ñược bật, SCL sẽ
ñược giữ ở mức thấp.
Cờ TWINT phải ñược xóa bằng cách ghi giá trị 1 vào nó. Lưu ý, cờ không
ñược xóa tự ñộng bằng phần cứng khi thực hiện hàm ngắt. Khi cờ TWINT ñược
xóa, các hoạt ñộng của TWI ñược tiếp tục, do ñó phải hoàn thành công việc với
các thanh ghi TWAR, TWSR, TWDR trước khi xóa cờ.

Bit 6 - TWEA: TWI Enable Acknowledge Bit


Khi ñược set ở giá trị 1, tín hiệu ACK sẽ ñược sinh ra khi gặp các ñiều
kiện sau:
- ñược Master gọi tới bằng ñịa chỉ của mình
- nhận ñược General Call khi bit TWGCE ñược bật
- nhận ñược 1 byte dữ liệu khi làm Receiver
Khi ñược set ở giá trị 0, thiết bị coi như ñược cách ly khỏi kết nối I2C.

Bit 5 - TWSTA: TWI START Condition Bit


Set giá trị 1 cho TWSTA ñể tạo tín hiệu START trên I2C bus. Phải ñược
xóa bằng phần mềm sau khi tín hiệu START ñược chuyển ñi.

Bit 4 - TWSTO: TWI STOP Condition Bit


Ở chế ñộ Master, ghi giá trị 1 vào TWSTO sẽ tạo tín hiệu STOP, sau ñó
bit sẽ ñược xóa tự ñộng bằng phần cứng.
Ở chế ñộ Slave, bit này ñược dùng ñể giải quyết lỗi. Khi ghi giá trị 1 vào
nó, thiết bị coi như ñược tách khỏi I2C bus và sẽ không bị gọi tới bằng ñịa chỉ, nó
cũng giải phóng chân SCL và SDA.

Bit 3 - TWWC: TWI Write Collision Flag

Trang 8
Bit 2 - TWEN: TWI Enable Bit
Set TWEN ở giá trị 1 ñể cho phép TWI, ñồng thời quản lý chân SCL và
SDA. Ngược lại, set TWEN ở giá trị 0 sẽ cấm TWI, mọi hoạt ñộng TWI dù ñang
diễn ra cũng bị ngưng lại.

Bit 0 - TWIE: TWI Interrupr Enable


Set ở giá trị 1 ñể cho phép ngắt TWI. (Xem thêm I-bit trong thanh ghi
SREG).

Bit 7..3 - TWS: TWI Status


Thể hiện trạng thái của kết nối I2C.
Bit 1..0 - TWPS: TWI Prescaler Bits
Xem Bit Rate Generator Unit.

Bit 7..0 - TWD: TWI Data Register


Ở chế ñộ truyền, TWDR chứa byte dữ liệu sẽ ñược truyền kế tiếp. Ở chế
ñộ nhận, TWDR chứa byte dữ liệu nhận ñược cuối cùng.

Bit 7..1 - TWA: TWI Address


Cần thiết lập ñịa chỉ khi hoạt ñộng trong chế ñộ Slave hoặc Master với kết
nối Multi-Master.
Bit 0 - TWGCE: TWI General Call Enable
Set giá trị TWGCE lên 1 ñể cho phép General Call.

Trang 9
Sử dụng module TWI trong AVR
Kết nối TWI trong AVR theo ñịnh dạng byte và dựa trên ngắt. Ngắt ñược sinh ra
sau mọi sự kiện trong TWI. Dĩ nhiên, ngắt phải ñược cho phép bởi bit TWIE trong
TWCR và bit Global Interrupt Enable.
Khi ngắt ñược sinh ra, TWSR sẽ chứa giá trị tương ứng với trạng thái của TWI
bus. Chương trình có thể quyết ñịnh khối TWI sẽ hoạt ñộng thế nào ở xung TWI-clock
tiếp theo bằng cách tác ñộng vào TWCR và TWDR.

Code ví dụ
ðoạn code ví dụ về cách thức Master truyền 1 byte dữ liệu cho Slave trong kết nối
TWI:

Trang 10
Bảng giá trị của TWI Status Register với chế ñộ Master Transmitter.

Bảng giá trị của TWI Status Register với chế ñộ Master Receiver.

***Chế ñộ Slave Transmitter/Receiver tham khảo thêm trong Datasheet Atmega8

***Nguồn tham khảo:


http://en.wikipedia.org/
http://atmel.com/

Trang 11

You might also like