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 1LỜ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 3Sau đâ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 4Chươ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 5I2CxSTAT : I2c Status Register
I2CxADD : I2C Slave Address Register
I2CxMSK : I2C Address Mask Register
Trang 6I2CxBRG : I2C Baud Rate Generator Register
I2CxTRN : I2C Transmit Data Register
I2CxRCV : I2C Receive Data Register
Trang 71.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 9Mỗ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 11Quá 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 12Khi 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 132. 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 142.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 152.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 172.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 182.7 Generation data out
Trang 192.8 Synchronous SCL and SDA
2.9 Generation slave_wait
Trang 20Chương 2: Kết quả mô phỏng và đánh giá kết quả mô phỏng.
1. Start and stop bit detect
Trang 212. Collision detect
3. Generation i2c bus busy
4. Clock stretching
Trang 225. Các thanh ghi
6. Generation Clock Enable Signal
7. Generation data out
8. Generation slave_wait
9
Trang 23KẾ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 24PHỤ 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 25sta_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 26begin
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 281) master drives SDA high, but the i2c bus is low
2) stop detected while not requested
Trang 29signal 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 30clk<= not clk after 5 ns;end process clock;
data: process
beginnReset<='1';
Trang 31port 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 32signal nReset : std_logic:='1';
signal sta_detect: std_logic:='0';
signal sto_detect: std_logic:='0';
Trang 33end 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 34dscl_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 35end 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 36signal clk_en_i : std_logic; clock generation signalssignal cnt : std_logic_vector(15 downto 0); clock divider counterbegin
Trang 37signal 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 387. Generation data out
- Gen Data out
-port(
clk : in std_logic;
sSCL : in std_logic;
sSDA : in std_logic;