Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 29 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
29
Dung lượng
1,3 MB
Nội dung
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 ATmega32 sẽ được dùng làm minh họa. Sau bài này, tôi hy vọng bạn có thể hiểu và thực hiện được: - Nguyên lý truyền thông nối tiếp TWI và I 2 C. - Sử dụng module TWI trong AVR ở các chế độ Master. - Sử dụng module TWI trong AVR ở các chế độ Slave. - Ví dụ giao tiếp giữa các AVR bằng TWI. II. Giao diện TWI – I 2 C. TWI (Two-Wire Serial Intereafce) là một module truyền thông nối tiếp đồng bộ trên các chip AVR dựa trên chuẩn truyền thông I 2 C. I 2 C là viết tắc của từ Inter- Integrated Circuit là một chuẩn truyền thông do hãng điện tử Philips
Semiconductor sáng lập và xây dựng thành chuẩn năm 1990. Phiên bản mới nhất của I2C là V3.0 phát hành năm 2007. Để hiểu thêm về I2C bạn có thể tham khảo các tài liệu “I2C Specification” từ trang web của NXP- http://www.nxp.com (lập bởi Philips). Trong phạm vi bài học này tôi chỉ giới thiệu giao thức TWI được giới thiệu trong datasheet của các chip AVR từ Atmel. Tuy nhiên, về cơ bản TWI trong AVR hoàn toàn tương thích I2C, do đó tìm hiểu TWI của AVR không chỉ giúp bạn giao tiếp giữa các AVR với nhau mà có thể dùng TWI để điều khiển bất kỳ một thiết bị nào theo chuẩn I2C (các chip nhớ, bộ chuyển đổi ADC, DCA, đồng hồ thời gian thực…). TWI (I2C) là một truyền thông nối tiếp đa chip chủ (tạm dịch của cụm từ multi-master serial computer bus). Khái niệm “multi-master” (tôi sẽ dùng từ tiếng anh multi-master thay vì dùng “đa chip chủ”) được hiểu là trong trên cùng một bus 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 đổi trạng thái khi SCL ở mức cao (trừ START và STOP condition). Chân SDA có thể được đổi trạng thái khi SCL ở mức thấp. START Condition-Điều kiện bắt đầu: từ trạng thái nghỉ, khi cả SDA và SCL ở mức cao nếu Master muốn thực hiện một “cuộc gọi”, Master sẽ kéo chân SDA xuống thấp trong khi SCL vẫn cao. Trạng thái này gọi là START Condition (chúng ta gọi tắt là S). STOP Condition-Điều kiện kết thúc: sau khi thực hiện truyền/nhận dữ liệu, nếu Master muốn kết thúc quá trình nó sẽ tạo ra một STOP condition. STOP condition được Master thực hiện bằng cách kéo chân SDA lên cao khi đường SCL đang ở mức cao. STOP condition chỉ được tạo ra sau khi địa chỉ hoặc dữ liệu đã được truyền/nhận. REPEAT START – Bắt đầu lặp lại: khoảng giữa START và STOP condition là khoảng bận của đường truyền, các Master khác không tác động được vào đường
truyền trong khoảng này. Trường hợp sau khi kết thúc truyền/nhận mà Master không gởi STOP condition lại gởi thêm 1 START condition gọi là REPEAT START. Khả năng này thường được dùng khi Master muốn lấy dữ liệu liên tiếp từ các Slaves. Hình bên dưới mô tả các Master tạo ra START, STOP và REPEAT START. Address Packet Format – Định dạng gói địa chỉ: trên mạng TWI (I2C), tất cả các thiết bị (chip) đều có thể là Master hay Slave. Mỗi thiết bị có một địa chỉ cố định gọi là Device address. Khi một Master muốn giao tiếp với một Slave nào đó, nó trước hết tạo ra một START condition và tiếp theo là gởi địa chỉ Device address của Slave cần giao tiếp trên đường truyền, vì thế xuất hiện khái niệm “gói địa chỉ” (Address Packet). Gói địa chỉ trong TWI (I2C) có định dạng 9 bits trong đó 7 bit đầu (gọi là SLA, được gởi liền sau START condition) chứa địa chỉ Slave, một bit READ/WRITE và một bit ACK-Ackknowledge (xác nhận). Do bit địa chỉ có độ dài 7 bits nên về mặt lý thuyết, trên 1 mạng TWI (I2C) có thể tồn tại tối đa 2^7=128 thiết bị có địa chỉ riêng biệt. Tuy nhiên, có một số địa chỉ không được sử dụng như các địa chỉ có định dạng 1111xxx (tức các địa chỉ lớn hơn hoặc bằng 120 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 hướng nào, gói dữ liệu luôn bao gồm 9 bits trong đó 8 bits đầu là dữ liệu và 1 bit cuối là bit ACK. Tám bits dữ liệu do thiết bị phát gởi và bit ACK do thiết bị nhận tạo ra. Ví dụ khi Master thực hiện quá trình gởi dữ liệu đến Slave, nó sẽ phát ra 8 bits dữ liệu, Slave nhận và phát lại ACK (kéo SDA xuống 0 ở xung thứ 9), sau đó Master sẽ quyết định gợi tiếp byte dữ liệu khác hay không. Nếu Slave phát tín hiệu NOT ACK (không tác động SDA ở xung thứ 9) sau khi nhận dữ liệu thì Master sẽ kết thúc quá trình gởi bằng cách phát đi STOP condition. Hình bên dưới mô tả định dạng gói dữ liệu trong TWI (I2C).
Phối hợp gói địa chỉ và dữ liệu: một quá trình truyền/nhận TWI (I2C) thường được bắt đầu từ Master, Master phát đi một START condition sau đó gởi gói địa chỉ SLA+R/W trên đường truyền. Tiếp theo nếu có một Slave đáp ứng lại, dữ liệu có thể truyền/nhận liên tiếp trên đường truyền (1 hoặc nhiều byte liên tiếp). Khung truyền thông thường được mô tả như hình bên dưới. Multi-Master Bus –Đường truyền đa chip chủ: như đã trình bày ở trên, TWI (I2C) là chuẩn truyền thông đa chip chủ, nghĩa là tại một thời điểm có thể có nhiều hơn 1 chip làm Master nếu các chip này phát ra START condition cùng lúc. Nếu các Master có cùng yêu cầu và thao tác đối với Slave thì chúng có thể “cùng tồn tại” và quá trình truyền/nhận có thể thành công. Tuy nhiên, trong đa số trường hợp sẽ có một số Master bị “thất lạc” (lost). Một Master bị lost khi nó truyền/nhận 1 mức cao trên SDA trong khi các Master khác truyền/nhận 1 mức thấp. Truyền thông đa chip chủ tương đối phức tạp và vì thế tôi sẽ không đề cập trường hợp này trong lúc thực hiện ví dụ giao tiếp trong bài học này. Nắm được các khái niệm và đặc điểm trên của truyền thông TWI (I2C) là bạn đã sẵn sàng để điều khiển module TWI trên AVR. Phần tiếp theo tôi sẽ hướng dẫn cách thao tác module TWI trên AVR thông qua một ví dụ cụ thể. III. TWI trên AVR.
1. Thanh ghi: TWI trên AVR được vận hành bởi 5 thanh ghi bao gồm thanh ghi tốc độ giữ nhịp TWBR, thanh ghi điều khiển TWCR , thanh ghi trạng thái TWSR, thanh ghi đị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 gọi. Đối với chip Master, tín hiệu ACK chỉ được phát trong 1 trường hợp duy nhất đó là khi Master nhận dữ liệu từ Slave, Master phát ACK để báo cho Slave là mình đã nhận được và muốn tiếp tục nhận từ Slave. • Bit 5 – TWSTA (TWI START Condition Bit): là bit tạo START condition. Khi một chip muốn trở thành Master để thực hiện 1 cuộc gọi, bit này cần được set và một START condition được tạo ra trên đường truyền nếu đường truyền đang rảnh. Nếu đường truyền không rảnh, TWI sẽ chờ cho đến khi nó rảnh (nhận ra 1 STOP condition) và tiếp tục gởi START condition. Chú là là bit nay cần được xóa bởi phần mềm sau khi START condition đã được gởi (viết 0 vào bit này để xóa nó). • Bit 4 – TWSTO (TWI STOP Condition Bit): là bit tạo STOP condition cho TWI. Khi Master muốn kết thúc một cuộc gọi, nó sẽ phát STOP condition bằng cách viết giá trị 1 vào bit TWSTO. Slave cũng có thể tác động vào bit này, nếu một cuộc gọi bị lỗi, viết 1 vào TWSTO trên Slave sẽ reset đường truyền về trạng thái rảnh ban đầu. • Bit 3 – TWWC (TWI Write Collision Flag): khi cờ TWINT đang ở mức thấp tức TWI đang bận, nếu chúng ta viết dữ liệu vào thanh ghi dữ liệu (TWDR) thì một lỗi xảy ra, khi đó bit TWWC tự động được set lên 1. Vì thế, trong quá trình truyền dữ liệu, bit TWINT cần được giữ mức cao khi ghi dữ liệu vào thanh ghi TWDR và sau đó xóa khi dữ liệu đã sẵn sàng. • Bit 2 – TWEN (TWI Enable Bit): bit kích hoạt TWI trên AVR, khi TWEN được set lên 1, TWI sẵn sàng hoạt động. • Bit 1 – Reserve: không sử dụng. • Bit 0 – TWIE (TWI Interrupt Enable Bit): bit cho phép ngắt TWI, khi bit nay được set bằng 1 đồng thời bit I trong thanh ghi trạng thái chung được set, một ngắt TWI xảy ra khi bit TWINT được set bởi phần cứng. Ngắt TWI có thể xảy ra sau bất kỳ hoạt động nào liên quan đến TWI. Do đó cần sử dụng ngắt hợp lý. Thông thường, ngắt chỉ được sử dụng cho Slave, đối với Master ngắt không cần thiết vì Master chủ động khởi động một cuộc gọi. Một điều cần chú ý là các bit trong thanh ghi TWCR không cần được set cùng lúc, tùy vào từng giai đoạn trong quá trình giao tiếp TWI các bit có thể được set 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.
. 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. module TWI trong AVR ở các chế độ Slave. - Ví dụ giao tiếp giữa các AVR bằng TWI. II. Giao diện TWI – I 2 C. TWI (Two-Wire Serial Intereafce)