Khi phát hiện điều kiện START (i2c_start_con_o=1) trên bus thì tín hiệu i2c_busy_ox tích cực (mức thấp), khi đó không thể khởi tạo việc trao đổi dữ liệu mới và phải chờ cho đến khi nào phát hiện trạng thái STOP (i2c_stop_con_o=1) trên bus thì tín hiệu i2c_busy_ox không tích cực nữa (mức cao).
Hình 3.12 Mạch tạo tín hiệu nội i2c_busy_ox
Mạch đồng bộ sdai và scli với xung clock nội: Khi được cho phép hoạt động (con_i2cbus_on_o =1), ngõ vào scl_s và sdai được cập nhật giá trị sau mỗi chu kỳ xung clock hệ thống (clk), và được đồng bộ với clock hệ thống được thực hiện theo mạch logic sau:
85 trang |
Chia sẻ: banmai | Lượt xem: 2113 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Thiết kế core I2C, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ational Semiconductor … 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 khiển 8051, PIC, AVR, ARM... chip 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…
Hình 2.1 BUS I2C và các thiết bị ngoại vi [5]
2.1.2 Đặ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.Như ta thấy trên hình vẽ trên, khi một thiết bị ngoại vi kết nối vào đường bus 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.
Hình 2.2 Kết nối thiết bị vào bus I2C ở chế độ chuẩn (Standard mode) và chế độ nhanh (Fast mode) [3]
Mỗi dây SDA hay SCL đều được nối với điện áp dương của nguồn cấp thông qua một điện trở kéo lên (pullup resistor). Sự cần thiết của các điện trở kéo này là vì chân giao tiếp I2C của các thiết bị ngoại vi thường là dạng cực máng hở (opendrain hay opencollector). Giá trị của các điện trở này khác nhau tùy vào từng thiết bị và chuẩn giao tiếp, thường dao động trong khoảng 1KΩ đến 4.7KΩ.
Trở lại với hình 3.1, ta thấy có rất nhiều thiết bị (ICs) cùng được kết nối vào một bus I2C, tuy nhiên sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi 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. Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyề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).
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ủ hay tớ .Tại sao lại có sự phân biệt này ? Đó là vì trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ . 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 viêc giao tiếp.
Hình 2.3 Truyền nhận dữ liệu giữa chủ/tớ [3]
Nhìn hình trên ta thấy xung đồng hồ chỉ có một hướng từ chủ đến tớ, còn luồng dữ liệu có thể đi theo hai hướng, từ chủ đến tớ hay ngược lại tớ đến chủ.
Về dữ liệu truyền trên bus I2C, một bus I2C chuẩn truyền 8bit dữ liệu có hướng trên đường truyền với tốc độ là 100 kbit/s – Chế độ chuẩn (Standard mode). Tốc độ truyền có thể lên tới 400 kbit/s -Chế độ nhanh (Fast mode) và cao nhất là 3,4 Mbit/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:
-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ớ. Chi tiết việc thiết lập một giao tiếp giữa hai thiết bị sẽ được mô tả chi tiết trong các mục dưới đây.
2.1.2.1 Điều kiện START và STOP (START and STOP conditions)
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 đó trên bus I2C. START là điều kiện khởi đầu, báo hiệu bắt đầu của giao tiếp, còn STOP báo hiệu kết thúc một giao tiếp. Hình dưới đây mô tả điều kiện START và STOP.
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à rỗi (“bus free”), sẵn sàng cho một giao tiếp. Hai điều kiện START và STOP là không thể thiếu trong việc giao tiếp giữa các thiết bị I2C với nhau.
Hình 2.4 Điều kiện START và STOP của bus I2C [3]
Điều kiện START: 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
Điều kiện STOP: 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 quá 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 (Repeated START) đều có chức năng giống nhau là khởi tạo một giao tiếp.
2.1.2.2 Đị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.
Hình 2.5 Quá trình truyền 1 bit dữ liệu [3]
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.
Hình 2.6 Dữ liệu truyền trên bus I2C [3]
Hình 2.7 Bit ACK, Not-ACK trên bus I2C [3]
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.
2.1.2.3 Đị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.
Hình 2.8 Cấu trúc byte dữ liệu đầu tiên [3]
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 10bit địa chỉ.Việc thực hiện đánh dấu địa chỉ theo khung 10bit được thực hiện nếu sau lệnh START ta gửi chuỗi 11110 (số nhị phân) ra đường SDA. [4]
2.1.2.4 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.
Hình 2.9 Quá trình truyền dữ liệu [3]
• 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/= 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.
Hình 2.10 Ghi dữ liệu từ chủ đến tớ [3]
• 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/= 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.
Hình 2.11 Đọc dữ liệu từ thiết bị tớ [3]
• 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.
Hình 2.12 Quá trình phối hợp đọc/ghi dữ liệu [3]
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.
2.1.2.5 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.
2.2 Bộ điều khiển bus I2C PCF8584
Hình 2.13 Hình dạng và sơ đồ chân bộ điều khiển bus I2C PCF8584 [2]
2.2.1 Đặc điểm [2]
- Chế tạo theo công nghệ CMOS, hoạt động ở tần số 1.5MHz.
- Chuyển đổi từ bus song song sang bus I2C và giao tiếp.
- Có thể là chủ hay tớ, có khả năng hoạt động ở chế độ nhiều chủ (Multi-Master), giao tiếp ở chế độ khoảng cách xa (long-distance mode, 4 dây).
- Thích hợp với các vi xử lý giao tiếp dạng song song như 8049, 8051, 6800, 68000, and Z80. Khi giao tiếp với vi xử lý họ nào thì việc chọn bus sẽ được thực hiện tự động.
- Có chứa các vector ngắt khả lập trình.
- Điện áp hoạt động từ 4.5-5.5V, nhiệt độ hoạt động từ -40 – 85oC.
Hình 2.14 Sơ đồ khối PCF8584 [2]
2.2.2 Sơ đồ và chức năng các chân
Sơ đồ chân xem hình 3.13
Bảng 2.1 Sơ đồ và chức năng chân PCF8584 [2]
Tên chân
Số thứ tự
Input /Ouput
Chức năng
CLK
1
I
Xung đồng hồ (điện trở kéo lên nội).
SDA/SDA OUT
2
I/O
Chân dữ liệu vào/ra của I2C- bus, chân dữ liệu ra ở chế độ long-distance
SCL or SCL IN
3
I/O
Chân vào/ra của đường SCL(ở chế độ long-distance thì chỉ là chân vào)
IACK or SDA IN
4
I
Chân vào xác nhận ngắt, ngõ vào dữ liệu ở chế độ long-distance
INT or SCL OUT
5
O
Chân ra ngắt, chân Ngõ ra xung clock ở chế độ long-distance
A0
6
I
Chân vào chọn thanh ghi
DB0
7
I/O
PORT 0 bus 8 bit hai chiều (song song)
DB1
8
I/O
PORT 1 bus 8 bit hai chiều (song song)
DB2
9
I/O
PORT 2 bus 8 bit hai chiều (song song)
VSS
10
-
Nối đất
DB3
11
I/O
PORT 3 bus 8 bit hai chiều (song song)
DB4
12
I/O
PORT 4 bus 8 bit hai chiều (song song)
DB5
13
I/O
PORT 5 bus 8 bit hai chiều (song song)
DB6
14
I/O
PORT 6 bus 8 bit hai chiều (song song)
DB7
15
I/O
PORT 7 bus 8 bit hai chiều (song song)
RD (DTACK)
16
I/O
RD chân vào điều khiển đọc cho các vi xử lý họ 80XX và Z80, DTACK chân ra điều khiển truyền dữ liệu cho họ 68XXX
CS
17
I
Chân vào chọn chip
WR (R/W)
18
I
WR chân vào điều khiển ghi cho họ 80XX,chân vào điều khiển R/W cho họ 68XXX
RESET/STROBE
19
I/O
Ngõ vào reset, ngõ ra xung strobe
Vdd
20
-
Nguồn cấp điện
2.2.3 Miêu tả các thanh ghi [2]
PCF8584 có tổng cộng 5 thanh ghi, chi tiết như sau:
2.2.3.1 Thanh ghi địa chỉ nội S0’
Chứa giá trị địa chỉ riêng của PCF8584. Ngay cả khi PCF8584 đóng vai trò là chủ thì S0’ cũng phải được gán một địa chỉ xác định. Khi cài đặt ban đầu cho PCF8584 thì thanh ghi này phải được gán một giá trị cho dù sau đó nó có được sử dụng hay không.
Khi nhận địa chỉ này (giá trị 2 thanh ghi S0 và S0’ được so sánh với nhau) thì bit AAS trong thanh ghi S1 trạng thái sẽ bằng 1.
Chú ý là giá trị S0 và S0’ bù nhau từng bit một,chẳng hạn gán giá trị địa chỉ cho PCF8584 là 8’h55 thì giá trị địa chỉ thật sự của PCF8584 là 8’hAA.
2.2.3.2 Thanh ghi đồng hồ S2
Thiết lập giá trị tần số đồng hồ nội và tần số đường SCL
Hình 2.15 Thanh ghi đồng hồ S2 [2]
Bảng 2.2 Thiết lập giá trị đường SCL bằng các bit S21,S20 [2]
Bảng 2.3 Giá trị các bit S24, S23, S22 tương ứng với giá trị tần số đồng hồ ở chân CLK [2]
2.2.3.3 Thanh ghi vector ngắt S3
Chứa giá trị vector ngắt 8 bit có khả năng lập trình được, dùng khi giao tiếp với các vi điều khiển có vector ngắt. Giá trị vector ngắt này sẽ được gửi đến bus song song (DB0-DB7) khi có tín hiệu xác nhận ngắt và bit ENI trong thanh ghi điều khiển S1 được bật (= 1).
Giá trị mặc định của thanh ghi ngắt S3 là 00h (ở chế độ giao tiếp với họ 80XX) hoặc 0Fh (ở chế độ giao tiếp với họ 68000).
Khi reset, giá trị mặc định của S3 là 00h do chế độ giao tiếp mặc định là với họ 80XX.
2.2.3.4 Thanh ghi dịch/đệm (shift register/read buffer) dữ liệu S0
Hình 2.16 Thanh ghi dịch/đệm (shift register/read buffer) dữ liệu S0 [2]
Việc đọc và ghi dữ liệu với bus I2C được thực hiện qua thanh ghi này. S0 bao gồm một thanh ghi dịch và một thanh ghi đệm. Dữ liệu song song được ghi vào thanh ghi dịch, đọc từ thanh ghi đệm. Dữ liệu trao đổi qua bus I2C luôn được dịch vào hay ra thanh ghi dịch.
Khi nhận: Dữ liệu từ thanh ghi dịch được sao chép vào thanh ghi đọc, khi đó SCL được giữ mức thấp để không tiếp nhận thêm dữ liệu mới cho tới khi nó được đọc.
Khi truyền: Dữ liệu được truyền vào bus I2C ngay khi nó được ghi vào S0 nếu giao tiếp nối tiếp được kích hoạt (bit ES0 trong thanh ghi điều khiển S1 bằng 1).
Khi hoạt động ở tần số 8 hay 12 Mhz thì giữa các lần truy cập liên tiếp trên bus song song phải cách nhau 6 chu kỳ đồng hồ, thời gian này sẽ giảm xuống 3 chu kỳ đồng hồ khi hoạt động ở các tần số khác.
Để chuyển từ ghi sang đọc ngay lập tức thì phải đọc giá trị byte đầu tiên trong thanh ghi S0 (giá trị địa chỉ con tớ) để phát lệnh nhận byte đầu tiên trong S0. Sau khi có xác nhận thì byte này sẽ được chuyển từ thanh ghi dịch vào thanh ghi đọc, lần đọc tiếp theo mới chuyển chính xác giá trị byte dữ liệu đầu vào bus vi điều khiển. Quá trình này được gọi là “dummy read”. [2]
2.2.3.5 Thanh ghi điều khiển/trạng thái S1
Đây là thanh ghi điều khiển hoạt động của PCF8584 cũng như cho biết trạng thái hiện tại của bus I2C. S1 bao gồm hai thanh ghi 8 bit: Thanh ghi điều khiển chỉ viết và thanh ghi điều khiển chỉ đọc.
Bảng 2.4 Thanh ghi điều khiển/trạng thái S1 [2]
Control/
Status
BITS
Mode
Control
PIN
ESO
ES1
ES2
ENI
STA
STO
ACK
Write only
Status
PIN
0
STS
BER
AD0/LRB
AAS
LAB
BB
Read only
Chi tiết các bit trong thanh ghi S1
Thanh ghi điều khiển S1
- Khi bit này bằng 1 thì tất cả các bit trong S1 trạng thái sẽ bằng 0, có thể coi như reset bằng phần mềm
- ESO (Eable Serial Ouput): Bật tắt giao tiếp nối tiếp theo chuẩn I2C (bằng 0 là tắt, bằng 1 là bật). Khi bit này bằng 1, PCF8584 có thể giao tiếp với một thiết bị khác qua bus I2C.
- ES1 và ES2: Dùng để chọn thanh ghi mong muốn bằng cách gán các giá trị thích hợp cho 2 bit này. Chi tiết xem bảng 3.6
- ENI: Kích hoạt chân ra ngắt ngoài INT, khi bit PIN trong S1 trạng thái bằng 0, nếu ta gán bit này bằng 1 thì chân INT sẽ gửi tín hiệu ngắt mức thấp ra ngoài.
- STA và STO: Điều khiển việc phát lệnh START, REPEATED START và STOP trên bus I2C.
Bảng 2.5 Giá trị bit STA-STO
STA
STO
Chế độ hiện tại
Chức năng
Hoạt động
1
0
Tớ nhận
START
Phát byte địa chỉ, nếu bit R/W=0 thì chuyển sang chủ truyền, R/W=1 thì chuyển sang chủ nhận (1)
1
0
Chủ truyền
REPEATED START
Phát byte địa chỉ, nếu bit R/W=0 thì chuyển sang chủ truyền, R/W=1 thì chuyển sang chủ nhận
0
1
Chủ nhận/chủ truyền
STOP READ/
STOP WRITE
Phát lệnh STOP và chuyển về chế độ tớ truyền
1
1
Chủ
DATA CHAINING
Phát lệnh STOP, START và byte địa chỉ sau frame dữ liệu cuối cùng mà không phát lệnh STOP(2)
0
0
Bất kỳ
NOP
Không làm gì cả
Bit R/W là bit có trọng số nhỏ nhất (LSB) trong byte địa chỉ
Một frame dữ liệu = 8bit dữ liệu +ACK/Not-ACK.
- ACK: Điều khiển việc gửi ACK hay Not-ACK ra bus I2C. ACK=1 tự động gửi ACK ra I2C bus sau mỗi byte dữ liệu nhận được, ACK=0 thì gửi Not-ACK sau byte dữ liệu nhận được.
Thanh ghi trạng thái S1
- PIN(Pending Interrupt Not): Dùng để kiểm tra đã nhận hay truyền xong 1 byte dữ liệu hay chưa.
Bit này bằng 1 khi:
+ Đọc dữ liệu từ thanh ghi S0 hay ghi dữ liệu lên thanh ghi S0.
+ STA bằng 1 thì PIN bằng 1.
Bit này bằng 0 khi:
+ Nhận/truyền thành công một byte.
+ Khi bus lỗi hay khi có điều kiện STOP trên bus I2C (khi PCF8584 là tớ).
- STS: Ở chế độ tớ nhận, bit này bằng 1 khi có điều kiện STOP xuất hiện trên bus I2C.
- BER: Bằng 1 khi bus lỗi, bus lỗi khi điều kiện START/STOP xuất hiện không đúng chỗ. Khi bit này bằng 1 thì BB bằng 1 và PIN bằng 0.
- LRB/AD0: Bit này chỉ có giá trị khi bit PIN bằng 0
+ LRB (Last Received Bit): Chứa giá trị bit nhận được cuối cùng trên bus I2C khi AAS bằng 0 (chính là bit ACK). Dùng để kiểm tra ACK hay Not-ACK từ thiết bị nhận.
+ AD0(Address 0 (General call) ): Khi bit AAS =1, bit này được hiểu là bit AD0, có giá trị là 1 nếu địa chỉ của tớ là 00H (General Call), là 0 nếu tớ có địa chỉ riêng.
- AAS (Addressed As Slave): Chỉ có giá trị khi PIN=0. Ở chế độ tớ nhận AAS=1 khi địa chỉ nhận được trùng với địa chỉ riêng lưu trong thanh ghi S0’ hoặc khi nhận được địa chỉ 00H.
- LAB (Lost Arbitration): Bit này bằng 1 khi quyền điều phối bus I2C bị mất sang một con chủ khác khi hoạt động ở chế độ nhiều chủ (Multi-Master).
- BB (Bus Busy): Đây là cờ chỉ đọc, nó xác định rằng bus I2C đang được sử dụng. Giá trị 1 là bus đang bận và ngược lại. Bit này được set(về 0)/reset (lên 1) bởi điều kiện START/STOP.
2.2.4 Truy cập các thanh ghi
Khi thiết lập các giá trị thích hợp ở chân A0 và thanh ghi điều khiển S1 (3 bit ESO, ES1 và ES2) ta có thể truy cập đến thanh ghi mong muốn.
Bảng 2.6 Cách truy cập các thanh ghi của PCF8584
Địa chỉ thanh ghi nội
A0
ES1
ES2
IACKx
Chức năng
ESO = 0 ; bus I2C off
1
0
X
1
R/W S1
0
0
0
1
R/W S0’
0
0
1
1
R/W S3
0
1
0
1
R/W S2
ESO = 1 ; bus I2C on
1
0
X
1
W S1
1
0
X
1
R S1
0
0
0
1
R/W S0
0
0
1
1
R/W S3
X
0
X
0
R S3
Ghi chú: R(READ) đọc,W(WRITE) ghi
2.2.5 Giản đồ định thì ở các chế độ hoạt động
Hình 2.17 Giản đồ định thì chế độ chủ truyền [2]
Hình 2.18 Giản đồ định thì chế độ chủ nhận [2]
Hình 2.19 Giản đồ định thì chế độ tớ truyền [2]
Hình 2.20 Giản đồ định thì chế độ tớ nhận [2]
2.2.6 RESET và STROBE:
Khi áp xung mức thấp độ dài tối thiểu là 30tclk.vào chân RESET thì PCF8584 sẽ được reset : Tất cả các bit của thanh ghi S1 đều có giá trị là 0 trừ bit PIN và bit BB (có giá trị là 1), các thanh ghi S0’, S3 có giá trị là 00H.
Hình 2.21 Định thì RESET (tw4>=30tclk) [2]
Ngoài ra chân RESET còn dùng làm ngõ ra STROBE (độ dài khoảng 8tclk). STROBE xuất hiện khi PCF8584 nhận được địa chỉ riêng của nó (hoặc địa chỉ 00H) và theo sau là một lệnh STOP.
Hình 2.22 Chu kì STROBE (tw5=8tclk) [2]
2.2.7 Cách chọn chế độ giao tiếp
PCF8584 có thể giao tiếp trực tiếp với các vi điều khiển của INTEL như 80XX, hay các vi điều khiển của MOTOROLA như 68000.Việc chọn lựa chế độ giao tiếp (với INTEL hay MOTOROLA) được thực hiện qua việc điều khiển các chân CS, RW(R/W), DTACK.
Bảng 2.7 Các tín hiệu tự động cài đặt bởi PCF8584 khi giao tiếp với vi điều khiển/vi xử lý [2]
Hình 2.23 Chọn lựa chế độ giao tiếp: (1) Giao tiếp với họ MOTOROLA;(2) giao tiếp với họ INTEL [2]
2.2.8 Sơ đồ giao tiếp với các vi điều khiển/vi xử lý
Hình 2.24 Sơ đồ giao tiếp với vi điều khiển 8051/8048 [2]
Hình 2.25 Sơ đồ giao tiếp với vi điều khiển 68000 [2]
CHƯƠNG 3: THIẾT KẾ VÀ MÔ PHỎNG LÕI IP CORE MỀM ĐIỀU KHIỂN BUS I2C
3.1 Giới thiệu tính năng
I2C sử dụng 2 đường truyền tín hiệu 2 chiều (một đường xung đồng hồ SCL và một đường dữ liệu SDA).
Lập trình hoạt động ở 4 chế độ :
Master Transceiver (Chủ truyền)
Master Receiver (Chủ nhận)
Slave Transceiver (Tớ truyền)
Slave Receiver (Tớ nhận)
Hỗ trợ 2 cấp tốc độ tương thích với những dòng chip bus I2C controller ( PCF8584…): 100Kbit/s (standard mode), 400Kbit/s (fast mode).
Mỗi thiết bị nối đến bus được định địa chỉ bởi một địa chỉ duy nhất (địa chỉ 7 bit). Và trong mọi thời điểm luôn tồn tại mối quan hệ chủ-tớ (master-slave).Master (con chủ) có thể hoạt động ở chế độ master transmitter hoặc master receiver.
Có thể giao tiếp CPU theo chuẩn Intel với độ rộng bus data (dữ liệu) là 8 bit.
3.2 Sơ đồ chân
Hình 3.1 Sơ đồ chân I2C Core
Mô tả chân:
Bảng 3.1 Sơ đồ chân I2C Core
Chân
Kiểu
Mô tả
reset_x
input
Reset hệ thống ( bất đồng bộ)
clk
input
Clock hệ thống
cs_x
input
Chip select
a0
input
Địa chỉ để truy xuất các thanh ghi của i2c
rd_x
input
Cho phép đọc dữ liệu từ bus song song
wr_x
input
Cho phép ghi dữ liệu lên bus song song
iack
input
Tín hiệu xác nhận ngắt, giải mã địa chỉ các thanh ghi
datai[7:0]
input
Data input
scli
input
SCL input (serial clock )
sdai
input
SDA input (serial data)
datao[7:0]
output
Data output
sclo
output
SCL output
sdao
output
SDA output
irq_x
output
Tín hiệu báo ngắt về CPU
cpu_data_en_o
output
Cho phép xuất data về CPU
i2c_sdao_en
output
Cho phép xuất data ra bus I2C
i2c_sclo_en
output
Cho phép xuất xung clock ra bus I2C
3.3 Sơ đồ khối
Hình 3.2 Sơ đồ khối I2C IP Core
3.3.1 Mô tả chức năng và mục đích các khối
cpu_interface: Giao tiếp với CPU, vi điều khiển. Nhiệm vụ chính: đọc và ghi data hoặc lệnh vào các thanh ghi của I2C.
i2c_interface: Khối điều khiển bit dùng để giao tiếp với bus I2C.
interrupt: Khối tạo tín hiệu ngắt báo về cpu.
clock_generator: Tạo xung clock cấp cho bus I2C.
control: Nhận lệnh từ thanh ghi lệnh. Sau đó điều khiển khối tất cả các khối còn lại hoạt động đồng thời với quá trình chuyển data từ song song sang nối tiếp và ngược lại.
compare: Ở mode slave, khối có chức năng so sánh địa chỉ nhận được từ master với địa chỉ của chính nó chứa trong thanh ghi.
3.3.2 Mô tả các thanh ghi
Bảng 3.2 Các thanh ghi
Tên thanh ghi
Giá trị sau reset
Tính năng
Mô tả
S0d
00H
R/W
Thanh ghi đệm
S0a
00H
W
Thanh ghi địa chỉ byte
S1c
00H
W
Thanh ghi lệnh
S1s
00H
R
Thanh ghi trạng thái
S2
00H
W
Thanh ghi xung clock
Bảng 3.3 Chức năng các bit của thanh ghi S1 control (S1c)
Bit
Tên
Mô tả
Tích cực
7
PIN
Set bit PIN trong S1s lên mức 1
“1”
6
ESO
Cho phép bus I2C
“1”
5 : 4
[ES1 :ES2]
Định địa chỉ các thanh ghi
3
ENI
Cho phép ngắt về CPU
“1”
2
STA
Tạo trạng thái START hoặc repeated START
“1”
1
STO
Tạo trạng thái STOP
“1”
0
ACK
Gửi ACK hoặc Not-ACK
Các bit STA, STO, ACK sẽ tự động được xóa khi thực hiện xong 1 lệnh (truyền hoặc nhận 1 byte). Bình thường, các bit này có giá trị 0.
Bảng 3.4 Chức năng các bit của thanh ghi S1 status (S1s)
Bit
Tên
Mô tả
Tích cực
7
PIN
Trạng thái ngắt
“0”
6
T/R
Trạng thái bus I2C ở mode transmitter(“1”) hay receiver(“0”)
5
STS
Nhận điều kiện STOP (slave mode)
“1”
4
BER
Bus lỗi
“1”
3
LRB/AD0
Xác nhận địa chỉ slave nhận đúng khi ASS = 1
Bit ACK nhận được khi ASS = 0.
“1”
2
ASS
Đang nhận byte địa chỉ từ master.
“1”
1
LAB
Mất điều phối bus I2C
“1”
0
BB
Báo trạng thái bus I2C đang bận.
“0”
Bảng 3.5 Thanh ghi data_buffer (S0d)
Bit
Mô tả
7:1
Data [7:1]
0
- Trong trường hợp truyền data, đây là bit LSB của data
- Trong trường hợp truyền địa chỉ slave, nó là bit RW:
‘1’ : đọc từ slave
‘0’ : ghi vào slave
3.4 Thiết kế và phân tích các khối
3.4.1 Khối cpu_interface
3.4.1.1 Tính năng
Khối cpu_interface được dùng để giao tiếp với vi xử lí, vi điều khiển. Mục đích của khối là thiết lập dữ liệu cần phát ra bus I2C cũng như thiết lập các bit điều khiển quá trình hoạt động của bus I2C. Trong quá trình hoạt động, vi điều khiển có thể đọc được dữ liệu mà nó nhận được từ bus I2C cũng như đọc thanh ghi trạng thái để biết được trạng thái hoạt động hiện tại của IC giao tiếp.
Khối cpu_interface cũng nhận những tín hiệu như : bus lỗi, bus bận, báo ngắt, mode hoạt động hay data và bit ACK nhận được… Đồng thời khối này cũng truyền các tín hiệu điều khiển xuống các khối bên dưới như: các lệnh START, STOP, tín hiệu xóa ngắt, cho phép bus I2C hoạt động hay truyền các thông số về địa chỉ của bus I2C, tần số hoạt động hay data cần phát ra bus I2C.
Khối cpu_interface chứa các thanh ghi S0d, S0a, S1c, S1s, S2.
Dữ liệu datai[7:0] sẽ nối trực tiếp đến ngõ vào các thanh ghi: S0d, S0a, S1c, S2. Mỗi thanh ghi sẽ có 1 đường tín hiệu cho phép (en) riêng. Các đường tín hiệu cho phép này là ngõ ra của 1 bộ giãi mã (decoder), trong 1 thời điểm chỉ có 1 tín hiệu cho phép tích cực. Ngõ vào của bộ giải mã này là các tín hiệu: a0, cs_x, wr_x và các bit ES0, ES1, ES2.
Dữ liệu datao[7:0] sẽ nối trực tiếp đến ngõ vào các thanh ghi: S0d, S1s. Mỗi thanh ghi sẽ có 1 đường tín hiệu cho phép (en) riêng. Các đường tín hiệu cho phép này là ngõ ra của 1 bộ giãi mã (decoder), trong 1 thời điểm chỉ có 1 tín hiệu cho phép tích cực. Ngõ vào của bộ giải mã này là các tín hiệu: a0, cs_x, rd_x và các bit ES0, ES1, ES2.
Hình 3.3 Bộ giải mã các thanh ghi
3.4.1.2 Sơ đồ chân
Hình 3.4 Sơ đồ chân khối cpu_interface
Mô tả chân
Bảng 3.6 Mô tả chân khối cpu_interface
Chân
Kiểu
Mô tả
reset_x
input
Reset hệ thống ( bất đồng bộ)
clk
input
Clock hệ thống
cs_x
input
Chip select
a0
input
Địa chỉ để truy xuất các thanh ghi của I2C Core
rd_x
input
Tín hiệu cho phép đọc dữ liệu
wr_x
input
Tín hiệu cho phép đọc dữ liệu đối với
chuẩn Intel
iack
input
Tín hiệu xác nhận ngắt
datai[7:0]
input
Nhận data từ CPU
con_rx_ack_in
input
Nhận bit ACK từ khối control
i_int_flag_o
input
Cờ báo ngắt từ khối interrupt
i2c_busy_ox
input
Cờ busy báo bus đang bận từ khối I2C_interface
i2c_err_o
input
Cờ báo bus I2C lỗi từ khối I2C_interface
i2c _stop_con_o
input
Điều kiện Stop trên bus I2C (slave)
con_rw_o
input
Cờ báo yêu cầu đọc(“1”)\ghi(“0”) từ khối control
con_comp_add_o
input
Cờ báo đang so sánh địa chỉ nhận được(cập nhật bit AAS)
con_rx_data[7:0]
input
Data nhận về từ khối control
con_rx_data_en
input
Cho phép ghi data nhận về từ khối control vào thanh ghi data buffer
cpu_start_cmd_o
output
Lệnh start đến khối control
cpu_stop_cmd_o
output
Lệnh stop đến khối control
cpu_int_ack_o
output
Xác nhận ngắt đến khối interrupt, control
cpu_tx_data[7:0]
output
Ghi data vào thanh ghi transfer khối control
datao[7:0]
output
CPU đọc giá trị các thanh ghi
irq_x
output
Tín hiệu báo ngắt về CPU
cpu_ack_o
output
Bit ACK cần phát ra bus I2C
cpu_master_mode_o
output
Mode master được bật
cpu_i2cbus_en_o
output
Cho phép bus I2C hoạt động (ES0)
cpu_add0_o[7:0]
output
Thanh ghi địa chỉ byte thấp
cpu_prer_o[7:0]
output
Thanh ghi xung clock
cpu_data_en_o
output
Cho phép xuất data ra bus CPU
0 : datai <= data (mặc định)
1 : data <= datao
Bảng 3.7 Giải mã địa chỉ các thanh ghi
Địa chỉ thanh ghi nội
A0
ES1
ES2
IACKx
Chức năng
ESO = 0 ; bus I2C off
1
X
X
1
R/W S1s/S1c : thanh ghi điều khiển
0
0
0
1
W S0a : thanh ghi địa chỉ
0
1
1
1
W S2 : thanh ghi clock
ESO = 1 ; bus I2C on
1
X
X
1
W S1c : control
1
X
X
1
R S1s : status
0
0
0
1
R/W S0d : data
3.4.1.4 Giản đồ định thời
Hình 3.5 Ghi dữ liệu vào thanh ghi
Hình 3.6 Đọc dữ liệu từ thanh ghi
3.4.2 Khối control
3.4.2.1 Tính năng
Nhận/truyền data từ khối cpu_interface (dạng byte) để dịch sang dạng bit truyền đến khối i2c_interface.
Nhận lệnh từ thanh ghi control S1c hoặc từ khối i2c_inteface để điều khiển quá trình hoạt động của các khối khác.
3.4.2.2 Sơ đồ chân
Hình 3.7 Sơ đồ chân khối control
Mô tả chân
Bảng 3.8 Mô tả chân khối control
Chân
Kiểu
Mô tả
clk
input
Clock hệ thống
rst
input
Reset (bất đồng bộ)
cpu_tx_data[7:0]
input
Dữ liệu cần truyền nhận về từ khối cpu_interface
cpu_ack_o
input
Bit ACK cần phát ra bus I2C
cpu_i2cbus_en_o
input
Cho phép bus I2C hoạt động
cpu_start_cmd_o
input
Lệnh start đến khối control
cpu_stop_cmd_o
input
Lệnh stop đến khối control
cpu_int_ack_o
input
Xác nhận ngắt từ khối cpu_interface
i2c_rx_o
input
Nhận data từ khối i2c_interface
fn_stop
input
Nhận điều kiện hoàn thành xong lệnh STOP từ khối i2c_interface
i2c_negedge_o
input
Phát hiện cạnh xuống xung clock scl
i2c_ posedge_o
input
Phát hiện cạnh lên xung clock scl
i2c_err_o
input
Báo bus lỗi từ khối i2c_interface
i2c_start_con_o
input
Phát hiện điều kiện Start trên bus I2C
i2c_stop_con_o
input
Phát hiện điều kiện Stop trên bus I2C
com_addr_val_o
input
Địa chỉ hợp lệ
com_addr_ack_o
input
Bit điều khiển phát ACK từ khối compare sau khi so sánh địa chỉ riêng của I2C Core và địa chỉ nhận được trên bus I2C
con_genclk_wait_o
output
Cờ báo ngưng xuất xung clock ra bus I2C
con_genclk_en_o
output
Cho phép khối clock_generator hoạt động
con_complete_frame
output
Báo truyền/nhận xong một frame (một frame = 1byte dữ liệu + bit ACK/Not-ACK)
con_add_o[7:0]
output
Địa chỉ nhận được từ master xuất đến khối compare
con_compare_en_o
output
Cho phép so sánh địa chỉ
con_rx_data_en
output
Cho phép ghi data từ khối control vào thanh ghi data buffer (S0d)
con_rx_data[7:0]
output
Data nhận về đến khối i2c_interface
con_rx_ack_o
output
Truyền bit ACK đến khối cpu_interface
con_rw_o
output
Cờ báo yêu cầu đọc\ghi gửi đến khối cpu_interface
con_comp_add_o
output
Cờ báo đang so sánh địa chỉ nhận được đến khối cpu_interface.
con_i2cbus_on_o
output
Cho phép bus I2C hoạt động
con_start_cmd_o
output
Lệnh phát START đến khối i2c_interface
con_stop_cmd_o
output
Lệnh phát STOP đến khối i2c_interface
con_tx_o
output
Xuất dữ liệu ra khối i2c_interface
con_rw_cmd_o
output
Cho phép đọc/ghi dữ liệu ra bus I2C
con_cmd_ack_o
output
Cho phép đọc/ghi bit ACK/Not-ACK
3.4.2.4 Quá trình hoạt động :
Khối control nhận dữ liệu từ thanh ghi lệnh S1c ( start, stop, …) và dữ liệu trong thanh ghi trạng thái S1s để thực hiện việc truyền dữ liệu song song từ vi điều khiển/vi xử lý sang dữ liệu nối tiếp đến bus I2C hay ngược lại. Khi cần trao đổi dữ liệu qua bus I2C bộ control sẽ bật cờ con_i2cbus_on_o lên mức cao (bằng 1) để kích hoạt bus I2C.
Quá trình ghi dữ liệu:
- Dữ liệu hay byte địa chỉ cần truyền từ thanh ghi dữ liệu (S0d) của khối cpu_interface sẽ được đưa qua khối control theo đường cpu_tx_data[7:0].
- Khi cần ghi dữ liệu hay byte địa chỉ ra bus I2C bộ control sẽ điều khiển dịch từng bit cần truyền lấy từ cpu_tx_data[7:0] ra ngoài chân ra con_tx_o sau cạnh xuống của xung sclo, thứ tự các bit dịch ra sẽ từ MSB (bit cao nhất) đến LSB (bit thấp nhất).
Quá trình đọc dữ liệu:
- Dữ liệu nhận được từ khối i2c_interface (qua ngõ vào i2c_rx_o) được dịch vào thanh ghi con_rx_data[7:0]. Khi đủ 8 bit thì sẽ bật cờ báo con_rx_data_en lên bằng 1 để chuyển dữ liệu nhận được về bộ cpu_interface và lưu vào thanh ghi S0d.
Để thuận tiện cho việc lập trình, hoạt động của bộ control sẽ dựa vào máy trạng thái trong hình 3.8
Máy trạng thái có 8 trạng thái cơ bản: IDLE, MASTER, SLAVE, READS, WRITES, READM, WRITEM.
Hình 3.8 Sơ đồ máy trạng thái khối control
IDLE : Khi mà Core không trao đổi dữ liệu với các thiết bị khác. Bus I2C đang hoạt động ở chế độ tớ (slave mode).
MASTER: Khi Core nhận lệnh Start từ khối cpu_interface. Core sẽ thực hiện quá trình phát điều kiện Start, sau đó phát byte địa chỉ. Sau khi phát xong byte địa chỉ, nếu có thiết bị slave nào xác nhận ACK thì sẽ chuyển sang trạng thái kế tiếp là READM (chủ nhận) hoặc WRITEM (chủ truyền) tùy vào bit LSB (bit thấp nhất) trong byte địa chỉ phát ra.
SLAVE : Khi Core nhận điều kiện Start từ khối i2c_interface. Core sẽ thực hiện quá trình nhận byte địa chỉ và so sánh với địa chỉ của chính nó. Nếu 2 địa chỉ trùng khớp (com_addr_ack_o=0) thì sẽ chuyển sang trạng thái WRITES (tớ nhận) hay READS (tớ truyền) tùy theo bit LSB (bit thấp nhất) trong byte địa chỉ nhận được. Còn nếu 2 địa chỉ không trùng khớp nhau (com_addr_ack_o=1) thì sẽ chuyển về trạng thái IDLE.
Khi ở trạng thái READM hoặc WRITEM, nếu gặp lệnh Start thì nó sẽ quay lại trạng thái MASTER để phát lại lệnh Start và byte địa chỉ, nếu gặp lệnh Stop thì nó sẽ chuyển sang trạng thái STOP, nếu bus lỗi (i2c_err_o=1) thì chuyển sang trạng thái IDLE. Sau khi có cờ xác nhận đã phát xong lệnh Stop từ bộ i2c_interface truyền đến (fn_stop=1) thì chuyển sang trạng thái IDLE.
Khi ở trạng thái READS hoặc WRITES, nếu gặp điều kiện Start thì nó sẽ quay lại trạng thái SLAVE để nhận địa chỉ, còn nếu gặp điều kiện Stop thì nó sẽ chuyển sang trạng thái IDLE.
3.4.2.5 Lưu đồ hoạt động của từng trạng thái:
Tham khảo phụ lục.
3.4.3 Khối i2c_interface:
3.4.3.1 Tính năng:
Khối i2c_interface có nhiệm vụ giao tiếp với thiết bị I2C khác để truyền hoặc nhận dữ liệu (dạng bit), bit ACK/Not-ACK để gởi về khối control.
Khối còn có chức năng phát hiện : Điều kiện Start, điều kiện Stop, bus bận, bus lỗi đồng thời phát hiện cạnh lên và cạnh xuống của xung SCL truyền cho các khối khác.
Bus lỗi khi đang ở chế độ chủ (Master) không nhận lệnh Start/Stop nhưng ngõ vào bus I2C nhận được điều kiện Start/Stop, khi đó i2c _err_o = “1”.
Ở chế độ chủ (Master), sau khi nhận hay phát xong bit ACK, nếu xung sclo xuất mức “1” trong khi scli nhận vào ở mức “0” thì tín hiệu i2c_clk_wait_o sẽ đặt lên “1”, tín hiệu này sẽ xóa khi scli = 1.
Hình 3.9 Sơ đồ chân khối i2c_interface
3.4.3.2 Mô tả chân
Bảng 3.9 Mô tả chân khối i2c_interface
Chân
Kiểu
Mô tả
clk
input
Clock hệ thống
rst
input
Reset bất đồng bộ
gen_clko
input
Xung clock cấp cho bus I2C từ khối clock_generator
con_rw_cmd_o
input
Lệnh đọc/ghi nhận từ khối control
con_ack_cmd_o
input
Lệnh đọc/bit ACK nhận được từ khối control
con_tx_o
input
Dữ liệu cần phát
con_start_cmd_o
input
Lệnh phát Start từ khối control
con_stop_cmd_o
input
Lệnh phát Stop khối control
sdai
input
SDA input
scli
input
SCL input
cpu_master_mode_o
input
Chế độ hoạt động của bus I2C :
“1” : Master
“0” : Slave
cpu_int_ack_o
input
Xác nhận ngắt từ khối cpu_interface
rst_system
input
Nhận lệnh reset đồng bộ từ khối control
con_i2cbus_on_o
input
Cho phép bus I2C hoạt động
sclo
output
SCL output
sdao
output
SDA output
i2c_sdao_en
output
Cho phép xuất dữ liệu ra bus I2C
i2c_sclo_en
output
Cho phép xuất xung đồng hồ ra bus I2C
i2c_busy_ox
output
Báo bus bận
i2c_rx_out
output
Dữ liệu nhận được
i2c_ posedge_o
output
Cạnh lên xung đồng hồ trên bus I2C
i2c_ negedge_o
output
Cạnh xuống xung đồng hồ trên bus I2C
i2c_start_con_o
output
Phát hiện điều Start trên bus I2C
i2c_stop_con_o
output
Phát hiện điều kiện Stop trên bus I2C
i2c_err_o
output
Báo bus lỗi
i2c_clk_wait_o
output
Trì hoãn ngõ xung đồng hồ đến khối clock_generator
fn_stop
output
Cờ báo đã phát xong lệnh STOP
3.4.3.3 Các trạng thái hoạt động của khối:
Hình 3.10 Sơ đồ máy trạng thái của khối i2c_interface
3.4.3.4 Mô tả hoạt động từng trạng thái:
IDLE: Là trạng thái mà không có quá trình đọc hoặc ghi dữ liệu ra bus I2C, bus I2C đang ở mode Slave.
- Khi nhận lệnh Start từ khối control (con_start_cmd_o=1), khối chuyển sang trạng thái START và hoạt động ở chế độ chủ (Master).
- Khi phát hiện điều kiện Start (i2c_start_con_o=1) khối sẽ chuyển sang trạng thái READ đọc địa chỉ.
START: Là trạng thái phát điều kiện Start ra bus sau đó sẽ chuyển sang trạng thái WRITE ghi địa chỉ ra bus I2C (với con_rw_cmd_o=0).
WRITE: Là trạng thái ghi dữ liệu hay byte địa chỉ ra bus I2C.
- Khi nhận lệnh Repeated Start (con_start_cmd_o=1) thì máy sẽ chuyển sang trạng thái START dể phát lại lệnh Start.
- Nếu nhận lệnh đọc (con_rw_cmd_o=1) từ khối control thì sẽ chuyển sang trạng thái READ.
-Nếu phát hiện điều kiện Stop (i2c_stop_con_o=1) thì sẽ chuyển về trạng thái IDLE.
READ: Là trạng thái đọc dữ liệu hay byte địa chỉ từ bus I2C.
- Khi nhận lệnh Stop (con_stop_cmd_o=1) thì máy sẽ chuyển sang trạng thái STOP.
- Nếu nhận lệnh ghi (con_rw_cmd_o=0) từ khối control thì sẽ chuyển sang trạng thái WRITE.
-Nếu phát hiện điều kiện Stop (i2c_stop_con_o=1) thì sẽ chuyển về trạng thái IDLE.
STOP: Là trạng thái phát điều kiện Stop ra bus I2C (chỉ khi I2C Core là chủ), sau đó sẽ chuyển về trạng thái IDLE.
3.4.3.5 Các loại mạch được sử dụng trong khối i2c_interface
Hình 3.11 Mạch phát hiện điều kiện Start/Stop trên bus I2C
Khi phát hiện điều kiện START (i2c_start_con_o=1) trên bus thì tín hiệu i2c_busy_ox tích cực (mức thấp), khi đó không thể khởi tạo việc trao đổi dữ liệu mới và phải chờ cho đến khi nào phát hiện trạng thái STOP (i2c_stop_con_o=1) trên bus thì tín hiệu i2c_busy_ox không tích cực nữa (mức cao).
Hình 3.12 Mạch tạo tín hiệu nội i2c_busy_ox
Mạch đồng bộ sdai và scli với xung clock nội: Khi được cho phép hoạt động (con_i2cbus_on_o =1), ngõ vào scl_s và sdai được cập nhật giá trị sau mỗi chu kỳ xung clock hệ thống (clk), và được đồng bộ với clock hệ thống được thực hiện theo mạch logic sau:
Hình 3.13 Mạch đồng bộ scl_s và sdai với clock hệ thốn
Hình 3.14 Mạch lấy dữ liệu tại cạnh lên của xung scli
Bảng 3.10 Bảng lựa chọn giữa gen_clko và scli
3.4.3.6 Giản đồ timing hoạt động của khối:
Hình 3.15 Quá trình ghi data ra bus I2C và đọc ACK
Hình 3.16 Quá trình đọc data và ghi ACK ra I2C bus
Hình 3.17 Quá trình trì hoãn xung sclovà khi bus lỗi
Hình 3.18 Timing của một số tín hiệu khác
3.4.4. Khối compare
Hình 3.19 Sơ đồ chân khối compare
3.4.4.1 Mô tả chân
Bảng 3.11 Mô tả chân khối compare
Tên chân
Kiểu chân
Mô tả
clk
input
Clock hệ thống
rst
input
Reset bất đồng bộ
rst_system
Input
Reset hệ thống (đồng bộ)
cpu_addr_o[7:0]
input
Địa chỉ riêng của I2C Core nhận từ cpu_interface
con_add_o[7:0]
input
Địa chỉ nhận về từ master
con_compare_en_o
input
Cho phép so sánh
com_addr_val_o
output
Địa chỉ hợp lệ
com_addr_ack_o
output
Bit điều khiển phát ACK
3.4.4.2 Hoạt động chi tiết của khối compare
Nhiệm vụ của khối compare là so sánh địa chỉ mà slave nhận được từ Master với địa chỉ thực sự của slave. Vì mỗi thiết bị nối đến bus I2C đều có 1 địa chỉ duy nhất.
Hình bên dưới là timing compare địa chỉ. Nếu địa chỉ đúng thì: com_addr_ack_o = 0 và com_addr_val_o = 1. Nếu địa chỉ sai thì com_addr_ack_o = 1 và com_addr_val_o = 0.
Hình 3.20 Timing compare địa chỉ
3.4.5. Clock_generator
Hình 3.21 Sơ đồ chân khối clock_generator
3.4.5.1 Mô tả chân
Bảng 3.12 Mô tả chân khối clock_generator
Chân
Kiểu
Mô tả
clk
input
Clock hệ thống
rst
input
Reset
i2c_clk_wait_o
input
Delay ngõ ra i2c_interface
con_genclk_en_o
input
Cho phép khối hoạt động
con_genclk_wait_o
input
Delay ngõ ra từ khối control
cpu_prer_o[7:0]
input
Giá trị thanh ghi S2 nhận từ khối cpu_interface
gen_clko
output
xung sclo phát ra bus I2C
Bảng 3.13 Bảng chia tần số đường SCL
Bit
fSCL
S21
S20
0
0
100 (KHz)
0
1
400 (KHz)
1
1
Reserved
Bảng 3.14 Bảng chia tần số clock hoạt động của Core
Bit
fclk(MHz)
S27
S26
S25
S24
S23
0
0
0
0
0
3
0
0
0
0
1
4.43
0
0
0
1
0
12
3.4.5.2 Tính năng
Nhiệm vụ khối clock_generator là tạo ra xung SCL có tần số được thiết lập từ CPU, mặc định là tạo ra tần số 100KHz. Khối này chỉ hoạt động ở master mode. Tín hiệu xung clock có tạo delay phụ thuộc vào sự điều khiển của khối i2c_interface và khối control. Mỗi khi nhận lệnh delay thì xung clock ngõ ra sẽ giữ mức hiện tại đến khi lệnh delay này kết thúc.
3.4.6. Khối interrupt
Hình 3.22 Sơ đồ chân khối interrupt
3.4.6.1 Mô tả chân
Bảng 3.15 Mô tả chân khối interrupt
Chân
Kiểu
Mô tả
clk
input
Clock hệ thống
rst
input
Reset bất đồng bộ
rst_system
Input
Reset hệ thống (đồng bộ)
i2c_err_o
input
Tín hiệu bus lỗi từ khối i2c_interface
i2c_stop_con_o
input
Điều kiện stop nhận từ khối i2c_interface
con_complete_frame
input
Xác nhận khi hoàn thành xong 1 frame dữ liệu nhận từ khối control (1 frame = 8 bit + bit ACK/Not-ACK)
cpu_int_ack_ox
input
Tín hiệu ngắt từ khối cpu_interface
i_int_flag_o
output
Cờ báo ngắt đến khối cpu_interface
3.4.6.2 Mục đích
Tạo ra tín hiệu ngắt báo về CPU. Có 3 nguyên nhân gây ra ngắt: Truyền/nhận xong một frame dữ liệu, nhận điều kiện STOP hoặc bus lỗi. Khi có ngắt xảy ra CPU sẽ đọc thanh ghi trạng thái để xác định trạng thái hoạt động của I2C Core. Ứng với mỗi nguyên nhân gây ra ngắt, CPU sẽ có những cách điều khiển khác nhau.
3.4.6.3 Thực hiện
Tín hiệu cpu_int_ack_o dùng để cho phép cờ ngắt, đây là tín hiệu lấy từ bit PIN trong thanh ghi trạng thái. Khi cờ ngắt báo về khối cpu_interface, một clock sau tín hiệu cpu_int_ack_o sẽ kéo xuống “0” và cờ ngắt cũng bị xóa.
Hình 3.23 Mạch tạo cờ ngắt
3.5 Kết quả mô phỏng
Khi viết chương trình mô phỏng, Core sẽ được giả lập thành một con chủ ( ký hiệu là MASTER) và một con tớ tương ứng (ký hiệu là SLAVE). Sau đây là hình chụp kết quả mô phỏng bằng phần mềm mô phỏng ModelSim của Altera.
3.5.1 Chủ truyền – Tớ nhận (Master Transmitter – Slave Receiver)
Hình 3.24 Chủ phát Start + địa chỉ + truyền dữ liệu + phát Stop
Hình 3.25 Tớ nhận điều kiện Start + địa chỉ + nhận dữ liệu + điều kiện Stop
Ở hình 3.24, sau khi phát lệnh Start, địa chỉ 8’h68, khi có xác nhận địa chỉ trùng khớp từ con tớ thì con chủ tiếp tục phát các byte dữ liệu là 8’hb9 , 8’h03 và lệnh Stop.
Hình 3.25 biểu diễn địa chỉ và dữ liệu nhận được ở con tớ tương ứng. Dữ liệu nhận được được đọc từ thanh ghi S0d của con tớ khi tín hiệu read_data =1.
3.5.2 Chủ nhận – Tớ truyền (Master Receiver - Slave Transmitter)
Hình 3.26 Chủ phát Start + địa chỉ + nhận dữ liệu + phát Stop
Hình 3.27 Tớ nhận điều kiện Start + địa chỉ + phát dữ liệu + điều kiện Stop
Ở hình 3.26, sau khi phát lệnh Start, địa chỉ 8’h69 và có xác nhận địa chỉ trùng khớp từ con tớ, con chủ sẽ bắt đầu nhận dữ liệu 8’h24 và 8’h42 từ con tớ, khi nhận đủ số byte dữ liệu cần thiết thì nó sẽ phát lện Stop. Dữ liệu nhận được được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.27 thể hiện việc nhận byte địa chỉ, xác nhận và gửi byte dữ liệu ở con tớ tương ứng. Các byte liệu do con tớ gửi là 8’h24 và 8’h42.
3.5.3 Tiếp tục trao đổi dữ liệu sau khi phát lệnh Stop:
Hình 3.28 Chủ phát Start + địa chỉ + truyền dữ liệu + Stop + Start
Hình 3.29 Chủ tiếp tục phát địa chỉ + truyền dữ liệu và lệnh Stop
Hình 3.30 Tớ nhận điều kiện Start + địa chỉ + nhận dữ liệu + điều kiện Stop + Start
Hình 3.31 Tớ nhận tiếp địa chỉ + nhận dữ liệu + điều kiện Stop
Hình 3.28, 3.29: Chủ phát lệnh Start, byte địa chỉ 8’h2a, khi có xác nhận địa chỉ trùng khớp từ con tớ thì sẽ tiến hành truyền các byte 8’hb9 và 8’h03 (hình 3.28). Sau đó con chủ phát lệnh Stop và thực hiện một trao đổi mới bằng cách phát một lệnh Start, byte địa chỉ và truyền byte dữ liệu 8’h56 ( hình 3.29).
Hình 3.30 và 3.31 thể hiện việc nhận địa chỉ, xác nhận địa chỉ,nhận dữ liệu ở con tớ tương ứng. Hình 3.30: Con tớ nhận các byte dữ liệu 8’hb9,8’h03. Hình 3.31: Con tớ nhận byte dữ liệu 8’h56. Dữ liệu nhận được đọc khi tín hiệu read_data=1.Hình 3.32 Chủ phát Start + địa chỉ + truyền dữ liệu + Stop + Start + địa chỉ +
nhận dữ liệu
Hình 3.33 Tớ nhận điều kiện Start + địa chỉ + nhận dữ liệu + điều kiện Stop + điều kiện Start + địa chỉ + truyền dữ liệu
Hình 3.32: Chủ phát lệnh Start, byte địa chỉ 8’h68, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ truyền các byte dữ liệu 8’h85 và 8’h09. Sau đó thì con chủ phát lệnh Stop để kết thúc. Để tiếp tục trao đổi dữ liệu, con chủ phát lện Start và byte địa chỉ 8’h69, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ nhận byte dữ liệu 8’h22 từ con tớ. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.33: Con tớ nhận byte địa chỉ, xác nhận địa chỉ,nhận các byte dữ liệu 8’h85 và 8’h09, truyền byte dữ liệu 8’h22 tương ứng. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.34 Chủ phát Start + địa chỉ + nhận dữ liệu + Stop + Start + địa chỉ + truyền dữ liệu
Hình 3.35 Tớ nhận điều kiện Start + địa chỉ + truyền dữ liệu + điều kiện Stop + điều kiện Start + địa chỉ + nhận dữ liệu
Hình 3.34: Chủ phát lệnh Start,byte địa chỉ 8’h69, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ nhận các byte dữ liệu 8’h85 và 8’h09. Sau đó thì con chủ phát lệnh Stop để kết thúc. Để tiếp tục trao đổi dữ liệu, con chủ phát lện Start và byte địa chỉ 8’h68, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ truyền byte dữ liệu 8’h27. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.35: Con tớ nhận byte địa chỉ, xác nhận địa chỉ, truyền các byte dữ liệu 8’h85 và 8’h09, nhận byte dữ liệu 8’h27 tương ứng. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.36 Chủ phát Start + địa chỉ + nhận dữ liệu + Stop +Start + địa chỉ +
nhận dữ liệu
Hình 3.37 Tớ nhận điều kiện Start + byte địa chỉ + truyền dữ liệu + điều kiện Stop + điều kiện Start + địa chỉ + truyền dữ liệu
Hình 3.36: Chủ phát lệnh Start, byte địa chỉ 8’h69, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ nhận các byte dữ liệu 8’hd6 và 8’hbc. Sau đó thì con chủ phát lệnh Stop để kết thúc. Để tiếp tục trao đổi dữ liệu, con chủ phát lện Start và byte địa chỉ 8’h69, khi có xác nhận địa chỉ trùng khớp từ con tớ thì chủ truyền byte dữ liệu 8’h19 và 8’h09. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
Hình 3.37: Con tớ nhận byte địa chỉ, xác nhận địa chỉ, truyền các byte dữ liệu 8’hd6 và 8’hbc, truyền tiếp các byte dữ liệu 8’h19 và 8’h09. Dữ liệu nhận được đọc từ thanh ghi S0d khi tín hiệu read_data=1.
3.5.3 Restart khi đang trao đổi dữ liệu:
Hình 3.38 Chủ phát Start + địa chỉ + truyền dữ liệu + Restart + địa chỉ +
truyền dữ liệu
Hình 3.38: Con chủ phát lệnh Start, byte địa chỉ 8’h68, khi có xác nhận địa chỉ trùng khớp từ con tớ thì tiến hành truyền byte dữ liệu 8’h85. Sau đó con chủ phát lại lệnh Start (Restart) và tiếp tục truyền dữ liệu khi có một con tớ xác nhận địa chỉ trùng khớp.
Hình 3.39 Chủ phát Restart + nhận dữ liệu
Hình 3.39: Khi đang trao đổi dữ liệu (truyền dữ liệu chẳng hạn) thì con chủ phát lện Restart, phát byte địa chỉ 8’h69, nếu có con tớ xác nhận địa chỉ trùng khớp thì tiến hành nhận dữ liệu.
Hình 3.40 Tớ nhận điều kiện Start + địa chỉ + nhận dữ liệu + Restart + địa chỉ + nhận dữ liệu
Hình 3.40: Con tớ nhận điều kiện Start, địa chỉ 8’h68, so sánh và xác nhận địa chỉ trùng khớp. Sau đó khi phát hiện điều kiện Restart nó lại quay lại nhận byte địa chỉ 8’h68, so sánh, nếu địa chỉ trùng khớp thì tiếp tục nhận dữ liệu.
Hình 3.41 Tớ nhận điều kiện Restart + địa chỉ + truyền dữ liệu
Hình 3.41: Con tớ khi đang trao đổi dữ liệu (nhận dữ kiệu chẳng hạn) thì phát hiện điều kiện Restart thì quay lại nhận byte địa chỉ 8’h69, so sánh địa chỉ, nếu địa chỉ trùng khớp thì tiến hành truyền dữ liệu.
3.5.4 Bus lỗi:
Hình 3.42 Bus lỗi khi phát hiện điều kiện Start sai vị trí
Hình 3.43 Bus lỗi khi phát hiện điều kiện Stop sai vị trí
Khi phát hiện bus lỗi, tín hiệu i2c_err_o =1 dẫn đến tín hiệu rst_system trong bộ Control ở mức thấp (mức 0) và reset đồng bộ hệ thống (trừ khối cpu_interface).
Trên đây chỉ là những kết quả mô phỏng chính ở các chế độ hoạt động cơ bản, ngoài ra còn một số kết quả mô phỏng khác sẽ trình bày trên chương trình mô phỏng cụ thể để dễ kiểm tra kết quả hơn.
CHƯƠNG 4: KẾT LUẬN CHUNG VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI
4.1 Nhận xét chung
Sau gần bốn tháng thực hiện,đề tài này về cơ bản I2C IP Core thiết kế đã đáp ứng được các mục tiêu đề ra ban đầu như hoạt động được ở bốn chế độ cơ bản: Chủ truyền, chủ nhận, tớ truyền, tớ nhận. Core có thể hoạt động ở tốc độ 100 kbit/s (tiêu chuẩn) hay 400 kbit/s (tốc độ nhanh).
4.1.1 Những kết quả đạt được
Ứng dụng ngôn ngữ miêu tả phần cứng Verilog vào việc thiết kế thực tế.
Nắm được các bước cơ bản đầu tiên trong quá trình thiết kế một IC.
Hiểu rõ về chuẩn giao tiếp I2C và một dòng chip điều khiển bus I2C (PCF8584) cũng như có thêm các kiến thức bổ ích về phần mềm Quartus II và ModelSim.
Vận dụng các kiến thức đã học về mạch số, thiết kế vi mạch, ngôn ngữ Verilog để miêu tả hoàn chỉnh các đặc tính kỹ thuật của một lõi IP mềm (I2C Core).
4.1.2 Những giới hạn tồn tại
I2C Core chưa được thiết kế để có thể hoạt động ở chế độ nhiều chủ (Multi-master).
Tốc độ dịch chuyển dữ liệu giữa bus song song và bus I2C của Core còn thấp, chưa đáp ứng được tốc độ cao nhất của chuẩn giao tiếp I2C (3.4Mbit/s).
Kinh nghiệm lập trình còn nhiều hạn chế nên việc tích hợp Core vào một hệ thống thực tế là khá khó khăn vì khoảng các giữa mô phỏng bằng phần mềm và hoạt động trên một mạch thực tế (FPGA) là rất lớn.
4.2 Hướng phát triển
Đề tài sẽ được phát triển và nâng cao hơn khi chạy chế độ Multi - Master và giao tiếp ở tốc độ cao.
Quá trình thiết kế lõi IP bằng ngôn ngữ lập trình sẽ cho ta nhiều điều kiện thuận hơn trong việc sữa chữa lõi nếu có sai sót một cách dễ dàng. Linh động hơn trong việc nâng cấp theo những yêu cầu đặt ra.
Những thế hệ sản phẩm chip bằng phần mềm ra đời thay thế dần những cấu trúc phần cứng.
“Hệ thống nhúng” là một bước đột phá của vi điều khiển. Trong những năm sắp tới nước ta sẽ phát triển rất mạnh đối với lĩnh vực này.
Mong rằng đề tài này sẽ được các bạn sinh viên khóa sau bổ sung một cách hoàn chỉnh hơn đem lại những ứng dụng cao hơn phục vụ tốt hơn cho đời sống xã hội.
TÀI LIỆU THAM KHẢO
[1] J.Bhasker (1998), Verilog® HDL Synthesisa- A Practical Primer, Star Galaxy Pulishing, Pennsylvania.
[2] Phillips Semiconductor (1997), Data sheet “I2C-bus Controller PCF8584”.
[3] Phillips Semiconductor (2000), I2C-bus Sepcification Version 2.1.
[4] Zainalabedin Navabi (2005), Digital Design and Implementation with Field Programmable Device, Kluwer Academic Pulishers, Massachusetts.
[5]
[6]
Các file đính kèm theo tài liệu này:
- Luan van tot nghiep_Thi_t k_ 1(cu).doc