tut05.01_aurt_i2c

5
Người báo cáo: Nguyn Quang Nam Tài liu: TUT05.01 Ngày: 9/18/2006 Trang: 1/5 Tutorial n o 05.01 Gi đến: Đoàn Hip, www.picvietnam.com Ni dung: Sdng các module UART và I2C ca dsPIC MICROSOFT WORD Tóm tt: Đây là tutorial 4 vlp trình vi dsPIC. Tutorial này hướng dn cách sdng module UART và I2C ca dsPIC, là nhng module ngoi vi có sn trong các chip dsPIC. Các ví dđược viết bng hp ngvà ngôn ngC (dùng trình dch C30 Compiler ca Microchip), và trong đa strường hp hai phiên bn hp ngvà C30 là hoàn toàn tương đương. 1. Gii thiu Tutorial này gi i thi u các module UART và I2C ca dsPIC. Cách thiết lp module UART, cách phát và thu thông tin được đề cp. Mt sthông tin vngt cho module UART và bđệm FIFO 4 mc cũng được nêu ra. Cách dùng module I2C chế độ Master được gii thiu đây, thông qua mt ví dgiao tiếp vi mt vi mch đồng hthi gian thc (DS1307). Các chương trình con để ghi, đọc tbus I2C có thđược dùng để xây dng các chương trình khác nhau. 2. Các quy ước trong tài liu Mô tBiu thVí dFont Palatino Linotype: In nghiêng Tài liu tham kho dsPIC30F/33F Programmer’s Reference Manual Viết hoa chđầu Mt menu, hp thoi Chn Project Wizard Đặt trong du nháy kép Tên riêng (ca tp tin, project, …) “Vidu3” Font Courier: Mã ngun mov #0x8010, W0 Courier thường Tên tp tin Vidu3-1.s

Upload: thienthuy232

Post on 21-Jun-2015

208 views

Category:

Documents


1 download

TRANSCRIPT

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 1/5

Tutorial no 05.01

Gửi đến: Đoàn Hiệp, www.picvietnam.com

Nội dung: Sử dụng các module UART và I2C của dsPIC

MICROSOFT WORD

Tóm tắt: Đây là tutorial 4 về lập trình với dsPIC. Tutorial này hướng dẫn cách sử dụng module UART

và I2C của dsPIC, là những module ngoại vi có sẵn trong các chip dsPIC. Các ví dụ được viết bằng hợp ngữ và ngôn ngữ C (dùng trình dịch C30 Compiler của Microchip), và trong đa số trường hợp hai phiên bản hợp ngữ và C30 là hoàn toàn tương đương.

1. Giới thiệu

Tutorial này giới thiệu các module UART và I2C của dsPIC. Cách thiết lập module UART, cách phát và thu thông tin được đề cập. Một số thông tin về ngắt cho module UART và bộ đệm FIFO 4 mức cũng được nêu ra. Cách dùng module I2C ở chế độ Master được giới thiệu ở đây, thông qua một ví dụ giao tiếp với một vi mạch đồng hồ thời gian thực (DS1307). Các chương trình con để ghi, đọc từ bus I2C có thể được dùng để xây dựng các chương trình khác nhau.

2. Các quy ước trong tài liệu

Mô tả Biểu thị Ví dụ Font Palatino Linotype:

In nghiêng Tài liệu tham khảo dsPIC30F/33F Programmer’s Reference Manual

Viết hoa chữ đầu Một menu, hộp thoại Chọn Project Wizard

Đặt trong dấu nháy kép Tên riêng (của tập tin, project, …) “Vidu3”

Font Courier: Mã nguồn mov #0x8010, W0

Courier thường Tên tập tin Vidu3-1.s

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 2/5

3. Các ví dụ về module UART và I2C

Bạn hãy chép các tập tin nguồn được đính kèm vào một thư mục nào đó mà bạn sẽ dùng để tạo ra project “Vidu4”. Với hai ví dụ 4-1 và 4-2, chúng ta chỉ sử dụng các chân giao tiếp chính (main I/O) của module UART1, do đó sơ đồ nguyên lý không được thể hiện ở đây (vì khá đơn giản). Phần cứng cho hai ví dụ này chỉ dùng thêm một chip RS-232 transceiver (MAX232 hay tương đương) để nối dsPIC với máy tính. Nếu chỉ nối các chip với nhau thì chúng ta có thể bỏ qua transceiver.

3.1. Ví dụ 4-1

Làm theo các bước như trong tutorial 1 để tạo ra một project có tên là “Vidu4”, sau đó bạn thêm vào project tập tin nguồn “Vidu4-1.s” và kịch bản liên kết “p30f4012.gld” cho trường hợp dùng hợp ngữ. Đối với trường hợp dùng C30, chúng ta cũng tạo một project theo cách tương tự, chỉ khác là chúng ta sẽ chọn “Microchip C30 Toolsuite” ở bước 2, và tập tin nguồn được sử dụng là “Vidu4-1.c”.

Để sử dụng module UART1 (hay UART2), bạn cần khởi tạo ít nhất các thanh ghi sau:

– U1MODE (hay U2MODE): thanh ghi đặt chế độ giao tiếp, với các tham số chọn vị trí chân giao tiếp, số bit thông tin, số bit parity, và số stop bit

– U1STA (hay U2STA): thanh ghi trạng thái, nhưng có chứa một số cờ như UTXEN để cho phép phát ký tự

– U1BRG (hay U2BRG): thanh ghi đếm tạo tốc độ baud, với giá trị được tính theo công thức sau:

116

−×

=Baud

FcyUxBRG

với: x là chỉ số của module (x = 1 hay 2), Fcy là tần số thực thi lệnh (= tần số xung clock/4 với các dsPIC30F), và Baud là tốc độ baud cần thiết.

Nếu muốn sử dụng ngắt, chúng ta cần khởi tạo thêm cờ ngắt, cờ cho phép ngắt, độ ưu tiên ngắt (nếu cần thiết). Cần chú ý là dsPIC hỗ trợ ngắt khi thu (receive) và ngắt khi phát (transmit) một cách độc lập cho từng module UART. Do đó, lấy ví dụ một chip dsPIC có hai module UART1 và UART2, chip sẽ có 4 vectơ ngắt riêng biệt cho trường hợp thu hay phát của module UART1 cũng như thu hay phát của module UART2. Và các cờ ngắt, cờ cho phép ngắt, cũng như các bit thiết lập độ ưu tiên ngắt cũng tồn tại một cách tương ứng cho mỗi vectơ ngắt. Bạn tham khảo tài liệu dsPIC Family Reference Manual (DS70046 – phiên bản hiện tại là DS70046E) và datasheet của chip cụ thể để có thêm thông tin về việc sử dụng ngắt với các module UART.

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 3/5

Để phát thông tin ra bằng module UART, bạn chỉ cần ghi vào thanh ghi U1TXREG

(hay U2TXREG), với điều kiện tất nhiên là chúng ta đã khởi tạo cho chế độ phát. Chú ý là module UART của dsPIC có bộ đệm phát 4 mức, do đó bạn có thể ghi liên tiếp 5 ký tự mà vẫn không làm tràn bộ đệm phát ở lần phát ký tự đầu tiên (vì ngoài bộ đệm phát còn có thanh ghi dịch khi phát, đang còn trống). Mặc dù khả năng này của module UART không được dùng trong các ví dụ, nhưng bạn cần hiểu rằng điều này là có thể đối với dsPIC.

Chú ý: Khi dùng chế độ phát, bit UTXEN (trong thanh ghi UxSTA) chỉ nên được bật khi đã bật bit UARTEN (trong thanh ghi UxMODE).

Tương tự như vậy, bạn đọc từ thanh ghi U1RXREG (hay U2RXREG) để lấy ký tự đã được module UART nhận từ bên ngoài, tất nhiên là chúng ta đã khởi tạo đầy đủ cho chế độ thu. Bộ đệm thu cũng có 4 mức, và bạn có thể thiết lập để module UART chỉ tạo ra ngắt khi có đủ 4 ký tự ở bộ đệm (điều này giúp làm giảm số lần vào ngắt thu).

Ví dụ 4-1 chỉ thực hiện một việc đơn giản là xuất chuỗi ký tự “Xin chao! ” ra cổng RS-232 sau mỗi giây. Chuỗi ký tự dùng định dạng ASCIIZ, tức là chuỗi các ký tự ASCII kết thúc bằng giá trị 0. Chương trình khá trực quan và đã được chú thích đầy đủ, do đó không cần giải thích thêm ở đây.

3.2. Ví dụ 4-2

Thực hiện các thao tác tương tự như trong tutorial 2, bạn hãy loại bỏ tập tin “Vidu4-1.s” khỏi project, và thêm tập tin “Vidu4-2.s” vào project (với project viết bằng C30 thì bạn sẽ thay “Vidu4-1.c” bằng “Vidu4-2.c”).

Ví dụ này cũng thực hiện một việc khá đơn giản là đọc ký tự qua cổng RS-232, sau đó cộng thêm 1 vào mã của ký tự đã nhận và gửi trả về nơi phát qua cổng RS-232.

3.3. Ví dụ 4-3

Bạn hãy loại bỏ tập tin “Vidu4-2.s” khỏi project, và thêm vào project tập tin “Vidu4-3.s” (hay thay “Vidu4-2.c” bằng “Vidu4-3.c” đối với phiên bản C30).

Sơ đồ nguyên lý dùng cho ví dụ này và ví dụ 4-4 dưới đây được thể hiện ở hình 3.1.

Chúng ta làm quen với module I2C của dsPIC thông qua việc thiết lập các tham số cho một vi mạch đồng hồ thời gian thực (RTC-Real-Time Clock), cụ thể là DS1307. Ví dụ 4-3 chỉ thực hiện việc khởi tạo các tham số cần thiết cho DS1307, tuy nhiên các chương trình con cần thiết cho việc giao tiếp ở chế độ Master dùng module I2C đều được thực hiện đầy đủ ở đây.

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 4/5

CLKIN/OSC19

RC15/CLKO/OSC210

MCLR1

RB0/CN2/VREF+/AN0/EMUD32

RB1/CN3/VREF-/AN1/EMUC33

RB2/CN4/SS1/AN24

RB3/CN5/INDX/AN35

RB4/CN6/IC7/QEA/AN46

RB5/CN7/IC8/QEB/AN57

RC13/CN1/U1ATX/T2CK/SOSCI/EMUD11

RC14/CN0/U1ARX/T1CK/SOSCO/EMUC12

EMUC2/OC1/IC1/INT1/RD015

EMUD2/OC2/IC2/INT2/RD114

RE0/PWM1L 26

RE1/PWM1H 25

RE2/PWM2L 24

RE3/PWM2H 23

RE4/PWM3L 22

RE5/PWM3H 21

FLTA/INT0/RE8 16

RF2/SDA/SDI1/U1RX/EMUC/PGC 18

RF3/SCL/SDO1/U1TX/EMUD/PGD 17

AVDD 28

AVSS 27

U1

DSPIC30F4012DIP

Vdd

X1

8MHz

C133pF

C2

33pF

Vdd

R1 33k

X1 1

X2 2

VBAT 3

SQW/OUT7

SDA5

SCL6

VC

C8

GN

D4

U2

DS1307

Vdd

R2 4.7k

R3 4.7k

R4 4.7k

X232kHz

T1IN 11

R1OUT 12

T2IN 10

R2OUT 9

T1OUT14

R1IN13

T2OUT7

R2IN8

C2+

4

C2-

5

C1+

1

C1-

3

VS+2

VS-6

U3

MAX232

C3

1u

C4

1u

C5

1u

C61u

Vdd

Chan 2Chan 3

Hình 3.1: Sơ đồ nguyên lý phần cứng dùng cho các ví dụ 4-3 và 4-4

Để sử dụng module I2C của dsPIC ở chế độ Master, chúng ta thiết lập các thanh ghi:

– I2CCON: thanh ghi điều khiển module, thường chỉ cần quan tâm đến các bit I2CEN (bật/tắt module) và DISSLW (tắt/bật bộ điều khiển slew rate)

– I2CBRG: thanh ghi đếm tạo tốc độ baud, với giá trị được tính theo công thức sau:

11111111

2 −

−= Fcy

BaudFcyCBRGI

với: Fcy là tần số thực thi lệnh (= tần số xung clock/4 với các dsPIC30F) và Baud là tốc độ baud cần thiết.

Điều cần chú ý là sau mỗi hoạt động của module, như tạo điều kiện START, STOP hay xuất dữ liệu ra bus I2C, chúng ta đều phải chờ cho phần cứng hoàn tất hoạt động, và nếu cần thì kiểm tra trạng thái ACK/NACK trước khi thực hiện thao tác tiếp theo.

Mã nguồn chương trình đã chú thích khá chi tiết, do đó không cần giải thích thêm ở đây. Khi chạy thử chương trình, nếu không có lỗi gì đối với DS1307, sẽ có xung 1 Hz ở ngõ ra SQW/OUT. Nếu có lỗi thì chân RE0 sẽ ở mức 0, ngược lại thì RE0 sẽ ở mức 1.

3.4. Ví dụ 4-4

Bạn hãy loại bỏ tập tin “Vidu4-3.s” khỏi project, và thêm vào project tập tin “Vidu4-4.s” (hay thay “Vidu4-3.c” bằng “Vidu4-4.c” đối với phiên bản C30).

Trong ví dụ này, các chân của module I2C được dùng chung với các chân I/O chính của module UART1 của dsPIC, do đó chúng ta sẽ dùng các chân thay thế của module UART1 để thực hiện giao tiếp RS-232.

dsPIC sẽ khởi tạo DS1307, sau đó đọc giá trị thời gian sau mỗi 11 giây, và gửi thông tin về thời gian ở dạng chuỗi ký tự ra cổng RS-232.

Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 5/5

Chúng ta sử dụng cờ flag1 để báo lỗi cho các thao tác I2C, và cờ flag2 để đặt

trạng thái ACK/NACK khi đọc thông tin từ bus I2C. Chương trình con Write_I2C() sẽ cập nhật trạng thái cờ flag1, còn chương trình con Read_I2C() sẽ dùng trạng thái của cờ flag2.

buff là bộ đệm cho dữ liệu xuất ra bus I2C, còn str là bộ đệm cho chuỗi ký tự thể hiện thông tin thời gian. Khi đọc dữ liệu từ DS1307, do đặc điểm là địa chỉ của thanh ghi tiếp theo được cập nhật tự động, chúng ta sẽ đọc thông tin về giây, rồi đến phút, và giờ. Nhưng khi xuất thông tin thì chúng ta thường thể hiện giờ, rồi đến phút, và giây. Do đó, bộ đệm str được ghi dữ liệu theo chiều xuôi, và thao tác xuất các ký tự sẽ được thực hiện theo chiều ngược lại.

Nếu chỉ xuất dữ liệu ra bus I2C, chúng ta thực hiện theo trình tự: điều kiện START, xuất địa chỉ của ngoại vi với cờ thao tác ghi, xuất địa chỉ của thanh ghi sắp thao tác (nếu cần thiết), các thao tác ghi (các chip ngoại vi thường hỗ trợ ghi liên tiếp và tự động cập nhật thanh ghi địa chỉ), và điều kiện STOP.

Nếu chúng ta đọc dữ liệu từ bus I2C, chúng ta thực hiện theo trình tự: điều kiện START, xuất địa chỉ của ngoại vi với cờ thao tác ghi, xuất địa chỉ của thanh ghi sắp thao tác (nếu cần thiết), điều kiện RESTART, xuất địa chỉ của ngoại vi với cờ thao tác đọc, các thao tác đọc (các chip ngoại vi thường hỗ trợ đọc liên tiếp và tự động cập nhật thanh ghi địa chỉ), sau mỗi thao tác đọc chúng ta sẽ ACK, ngoại trừ thao tác đọc cuối cùng cần NACK, và điều kiện STOP.

4. Tóm tắt

Qua tutorial này, các module UART và I2C của dsPIC đã được giới thiệu. Cách thiết lập các tham số cho module UART, cách đọc/ghi thông tin từ module UART đã được minh họa. Cách thiết lập và sử dụng module I2C ở chế độ Master cũng đã được đề cập. Một số điểm cần chú ý đối với module I2C của dsPIC, cũng như giao tiếp I2C đã được nêu ra ở đây. Các ví dụ ở đây tuy đơn giản nhưng đã cung cấp các chức năng cơ bản để phát triển các ứng dụng dựa vào các giao tiếp RS-232 và I2C. Hy vọng bạn có thể xây dựng được những chương trình ứng dụng tốt dựa vào những chương trình con cơ bản này.

Chúc bạn thành công!