1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thiết kế lõi I2C trên nền PIC33F

41 395 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 41
Dung lượng 1,05 MB

Nội dung

LỜI NÓI ĐẦU Kể từ khi được phát triển bởi hãng điện tử Phillips vào đầu những năm 1980,chuẩn giao tiếp I2C đã trở thành một chuẩn giao tiếp quốc tế,được công nhận ở hơn 50 quốc gia trên thế giới.Bus I2C hiện nay được rất nhiều các hãng điện tử nổi tiếng tích hợp vào trong các sản phẩm của hãng như vi xử lý,vi điều khiển,…Do đó khả năng ứng dụng của bus I2C trong thiết kế vi mạch và các hệ thống số là rất rộng lớn.Tuy tốc độ giao tiếp không cao bằng nhiều chuẩn giao tiếp ra đời sau này, nhưng nhờ sự đơn giản về phần cứng,bus I2C vẫn là một sự lựa chọn phổ biến cho các hệ thống điều khiển sử dụng vi xử lý hay vi điều khiển.

Trang 1

LỜI NÓI ĐẦU

Kể từ khi được phát triển bởi hãng điện tử Phillips vào đầu những năm1980,chuẩn giao tiếp I2C đã trở thành một chuẩn giao tiếp quốc tế,được côngnhận ở hơn 50 quốc gia trên thế giới.Bus I2C hiện nay được rất nhiều các hãngđiện tử nổi tiếng tích hợp vào trong các sản phẩm của hãng như vi xử lý,vi điềukhiển,…Do đó khả năng ứng dụng của bus I2C trong thiết kế vi mạch và các hệthống số là rất rộng lớn.Tuy tốc độ giao tiếp không cao bằng nhiều chuẩn giaotiếp ra đời sau này, nhưng nhờ sự đơn giản về phần cứng,bus I2C vẫn là một sựlựa chọn phổ biến cho các hệ thống điều khiển sử dụng vi xử lý hay vi điềukhiển

Xuất phát từ các yêu cầu thực tế và khả năng ứng dụng rộng rãi của busI2C,nhóm chúng em quyết định chọn việc nghiên cứu và thiết kế khối giao tiếpnối tiếp đồng bộ I2C theo sơ đồ sau:

Trang 3

Sau đây là bố cục nội dung được trình bày trong đồ án:

• Chương 1: Những vấn đề chung về giao tiếp nối tiếp đồng bộ I2C

• Chương 2: Kết quả mô phỏng và đánh giá kết quả mô phỏng

• Chương 3: Kết luận

Trang 4

Chương 1: Những vấn đề chung về giao tiếp nối tiếp đồng bộ I2C

Ngày nay trong các hệ thống điện tử hiện đại, rất nhiều 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 giao tiếp với thế giới bênngoài Với mục tiêu đạt được hiệu quả cho phần cứng tốt nhất với mạch điện đơngiản, Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là 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

1. Đặc điểm của I2C

1.1. Các chế độ hoạt động

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ộtthiế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 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 thừ B Trong giao tiếp này, A là chủ còn B là tớ

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ướngtrên đường truyền với tốc độ là 100kbit/s – chế độ chuẩn ( standard mode) Tốc

độ truyền có thể lên đến 400 kbit/s – chế độ nhanh ( fast mode) và cao nhất là 3,4Mbit/s- chế độ cao tốc ( High speed mode)

Có 7 loại thanh ghi cho giao tiếp I2C :

I2CxCON : I2C Control Register

Trang 5

I2CxSTAT : I2c Status Register

I2CxADD : I2C Slave Address Register

I2CxMSK : I2C Address Mask Register

Trang 6

I2CxBRG : I2C Baud Rate Generator Register

I2CxTRN : I2C Transmit Data Register

I2CxRCV : I2C Receive Data Register

Trang 7

1.3. Điều kiện start và 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ốnthiết lập giao tiếp với 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ìnhdướ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ẵnsàng cho một giao tiếp Hai điều kiện START và STOP là không thể thiếu trongviệc giao tiếp giữa các thiết bị I2C với nhau

Điều kiện START: một sự chuyển đổi trạng thái từ cao xuống thấp trên đườngSDA trong khi đường SCL đang ở mức cao (cao = 1; thấp = 0) báo hiệu một điềukiệ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 đườngSDA trong khi đường SCL đang ở mức cao Cả hai điều kiện START và STOP

Trang 8

đều được tạo ra bỏi thiết bị chủ.Sau tín hiệu START, bus I2C coi như đang trongtrạng 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ínhiệ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ệuSTART được lặp lại thay vì một tín hiêu STOP thì bus I2C vẫn tiếp tục trongtrạ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

1.4. Đị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 truyền đi lại mỗi cạnhlên của xung đồng hồ trên dây SCL, quá trình thay đổi bit sữ liệu xảy ra khi SCLđang ở mức thấp

Mỗi byte dữ liệu được truyền có độ dài là 8 bit.Số lượng byte có thể truyền trongmộ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 đầutiên, các bit sẽ được truyền đi lần lượt Sau 8 xung clock trên dây SCL, 8bit dữliệu đã được truyền đi Lúc này thiết bị nhận, sau khi đã nhận đủ 8 bit dữ liệu sẽkéo 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

Trang 9

Mỗi byte truyền đi có kèm theo bit ACK là điều kiện bắt buộc, nhằm đảm bảocho 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 xungNot-ACK ( SDA ở mức cao ) để báo cho thiết bị chủ biết, thiết bị chủ sẽ tạoxung STOP để kết thúc hay lặp lại một xung START để bắt đầu quá trình mới.1.5. Đị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ằmphâ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 được 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ị

Trang 10

đó ra bus ngay sau xung START.Byte đầu tiên được gửi sẽ bao gồm 7 bit địa chỉ

và một bit thứ 8 điều khiển hướng truyền

Cấu trúc byte dữ liệu đầu tiên

Mỗi thiết bị ngoại vi sẽ có một địa chỉ riêng do nhà sản xuất ra nó quy đinh.Địachỉ đó có thể là cố định hay thay đổi.Riêng bit điều khiển hướng sẽ quy địnhchiề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 saubyte đầ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 bitnà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 I2C bus dưới dạng 10 bit địachỉ.Việc thực hiện đánh dấu địa chỉ theo khung 10 bit được thực hiện nếu saulệnh START ta gửi chuỗi 11110(số nhị phân) ra đường SDA

1.6. Truyền dữ liệu trên bus I2C

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 2hướng,từ chủ đến tớ hay ngược lại.Hướng truyền được quy định bởi bit thứ 8R/W trong byte đầu tiên(byte địa chỉ) được truyền đi

Trang 11

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 đếncon 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 rabus 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 xungACK.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áohiệu kết thúc

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:

Trang 12

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à đợixung 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ạoxung STOP để kết thúc

Đọc dữ liệu từ thiết bị tớ

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ựchiệ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

Quá trình phối hợp đọc/ghi dữ liệu

Chế độ giao tiếp Master-Slave 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ìnhtrạ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

Trang 13

2. Sơ đồ khối thiết kế và phân tích hoạt động các khối trong sơ đồ

2.1 Start and stop bit detect

Điều kiện để phát hiện bit start là: sườn xuống của SDA và SCL ở mức cao.Điều kiện để phát hiện bit stop là:Sườn lên của SDA và SCL ở mức cao.Lưu đồ thuật toán:

Trang 14

2.2 Collision detect

Tranh chấp có thể xảy ra khi có làm việc ở chế độ multi master.Vì vậy việc pháthiện tranh chấp là điều không thể thiếu

Phát hiện tranh chấp hay mất quyền phân xử chỉ xảy ra khi:

- TH1: SDA của thiết bị chủ đang ở trạng thái cao nhưng bus I2C lại ở trạng tháithấp

- TH2: Phát hiện trạng thái stop trong khi không có yêu cầu được gửi đến

Lưu đồ thuật toán:

Trang 15

2.3 Generation i2c bus busy

Bus I2C bận khi bắt đầu phát hiện ra trạng thái start cho đến khi phát hiệntrạng thái stop Lúc này trên bus I2C đã có thiết bị hoạt động và không có thiết bịnào được chen vào

Lưu đồ thuật toán:

Trang 17

2.6 Generation Clock Enable Signal

Tín hiệu clk cho phép được phát sinh khi giá trị từ thanh ghi I2C×BRG<8:0>được đưa đến Số đếm sẽ giảm dần đến 0 và dừng khi tín hiệu reload xuất hiện…Lưu đồ thuật toán:

Trang 18

2.7 Generation data out

Trang 19

2.8 Synchronous SCL and SDA

2.9 Generation slave_wait

Trang 20

Chương 2: Kết quả mô phỏng và đánh giá kết quả mô phỏng.

1. Start and stop bit detect

Trang 21

2. Collision detect

3. Generation i2c bus busy

4. Clock stretching

Trang 22

5. Các thanh ghi

6. Generation Clock Enable Signal

7. Generation data out

8. Generation slave_wait

9

Trang 23

KẾT LUẬN

Qua quá trình thực hiện đồ án, nhóm đã giải quyết được một số vấn đề cơbản để thiết kế khối giao tiếp đồng bộ nối tiếp I2C, thiết kế được các khối conlàm việc đảm bảo yêu cầu bài toán, hiểu rõ hơn về ngôn ngữ thiết kế phần cứngVHDL

Tuy nhiên về mặt tổng thể bài toán chưa được giải quyết, bài toán cònvướng mắc ở việc đồng bộ giữa các khối làm việc dẫn đến việc lắp ráp các khốicon với nhau gặp nhiều khó khăn Đồ án chưa thực sự hoàn thiện nên chưa thểthực hiện hóa trên mạch thật

Trong thời gian tới nhóm đồ án sẽ tiếp tục hoàn thiện theo đúng yêu cầubài toán, chú trọng việc đồng bộ giữa các khối Từ đó phát triển để thực hiện hóatrên mạch thật

Trang 24

PHỤ LỤC

1. Start and stop bit detect

- Start - Stop detect

sta_detect : out std_logic;

sto_detect : out std_logic);

end entity i2c_start_stop_detect;

-architecture arch of i2c_start_stop_detect is

signal sta_condition : std_logic;

signal sto_condition : std_logic;

begin

detect start condition => detect falling edge on SDA while SCL is high detect stop condition => detect rising edge on SDA while SCL is highprocess(clk,nReset)

Trang 25

sta_condition <= NOT(sSDA) AND dSDA AND sSCL;sto_condition <= sSDA AND NOT(dSDA) AND sSCL;end if;

sta_detect : out std_logic;

sto_detect : out std_logic);

signal sSDA: std_logic:='0';

signal dSDA: std_logic:='0';

signal sta_detect:std_logic;

signal sto_detect: std_logic;

Trang 26

begin

Trang 27

-architecture arch of i2c_gen_arbitration_lost is

signal cmd_stop : std_logic;

signal al_int_i : std_logic;

state machine variable

signal c_state : std_logic_vector(16 downto 0);

constant idle : std_logic_vector(16 downto 0) :=

"00000000000000000";

constant I2C_CMD_STOP : std_logic_vector(3 downto 0) := "0010";

generate arbitration lost signal

arbitration lost when:

Trang 28

1) master drives SDA high, but the i2c bus is low

2) stop detected while not requested

Trang 29

signal nReset : std_logic:='0';

signal cmd :std_logic_vector(3 downto 0):="0010";

signal clk_en : std_logic:='1';

signal sda_chk : std_logic:='1';

signal sSDA : std_logic:='1';

signal sda_oen_int : std_logic:='1';

signal sto_detect : std_logic:='1';

signal al_int : std_logic;

begin

clock: process

beginwait for 5 ns;

Trang 30

clk<= not clk after 5 ns;end process clock;

data: process

beginnReset<='1';

Trang 31

port map(clk,rst,nReset,cmd,clk_en,sda_chk,sSDA,sda_oen_int,sto_detect,al_int);

end test;

3. Generation i2c bus busy

- Gen i2c bus busy

-architecture arch of i2c_gen_bus_busy is

signal busy_int: std_logic;

Trang 32

signal nReset : std_logic:='1';

signal sta_detect: std_logic:='0';

signal sto_detect: std_logic:='0';

Trang 33

end process data;

DUT: component i2c_gen_bus_busy

port map(clk,rst,nReset,sta_detect,sto_detect,busy);end test;

-port(

clk : in std_logic;

scl_oen_int : in std_logic;

Trang 34

dscl_oen : out std_logic

);

end entity i2c_delay_scl_oen;

architecture arch of i2c_delay_scl_oen is

-signal dscl_oen_i :std_logic;

-end entity test_i2c_delay_scl_oen;

architecture test of test_i2c_delay_scl_oen is

signal scl_oen_int :std_logic:='0';

signal dscl_oen :std_logic;

-begin

clock: process

Trang 35

end process data;

DUT: component i2c_delay_scl_oen

port map(clk, scl_oen_int, dscl_oen);

end test;

5. Các thanh ghi

6. Generation Clock Enable Signal

- Gen Clock Enable Signal

Trang 36

signal clk_en_i : std_logic; clock generation signalssignal cnt : std_logic_vector(15 downto 0); clock divider counterbegin

Trang 37

signal nReset : std_logic:='1';

signal clk_cnt: std_logic_vector(15 downto 0):="0010000010000000";

signal ena: std_logic:='0';

signal slave_wait: std_logic:='0';

signal clk_en :std_logic;

Trang 38

7. Generation data out

- Gen Data out

-port(

clk : in std_logic;

sSCL : in std_logic;

sSDA : in std_logic;

Ngày đăng: 17/06/2015, 21:46

TỪ KHÓA LIÊN QUAN

w