CHƯƠNG 8: TRUYỀN DỮ LIỆU

Một phần của tài liệu Bài giảng lý thuyết vi xử lý kỹ thuật vi xử lý cd rom (Trang 120 - 154)

VI. VI XỬ LÝ VÀ VI ĐIỀU KHIỂN Về cấu trúc phần cứng:

CHƯƠNG 8: TRUYỀN DỮ LIỆU

- Trình bày được cấu trúc và tập lệnh của VĐK PIC và các thanh ghi liên quan đến các Modul UART, Modul MSSP của VĐK PIC

- Trình bày được nguyên lý hoạt động và điều khiển Modul UART, Modul MSSP của VĐK PIC ở các chế độ cơ bản của VĐK PIC.

- Xây dựng được mô hình, phân tích và thiết kế, vẽ lưu đồ và lập trình ứng dụng Modul UART, Modul MSSP của VĐK PIC cho các ứng dụng

8.1 Tổng quan về các kiểu truyền dữ liệu + Truyền dữ liệu đồng bộ và không đồng bộ:

USART viết tắt cho Universal Synchronous Asynchronous Receiver Transmitter (Bộ thu phát đồng bộ/ bất đồng bộ) và cho phép vi điều khiển PIC giao tiếp với một tầm rộng các thiết bị khác từ chip nhớ riêng biệt và LCD hiển thị tinh thể lỏng, tới máy tính! Điều này bao gồm gửi hay nhận gói dữ liệu 8 bit hay 9 bit (nghĩa là 1 byte hay 1 byte cộng thêm bit kiểm tra chẵn/lẻ). Bit chẵn lẻ là bit phụ gửi kèm với dữ liệu mà giúp kiểm tra lỗi. Nếu có 1 số lẻ số 1 trong byte dữ liệu (thí dụ b’00110100’), bit parity sẽ là 1 và nếu có một số chẵn số 1 (thí dụ b’00110011’) thì bit parity sẽ là 0. Trong bài giảng này, nếu có lỗi (ví dụ lật bit) diễn ra đâu đó trong giữa lúc gửi 1 byte và nhận nó bit parity sẽ không còn khớp loại dữ liệu. Bên nhận sẽ biết rằng có gì đó sai sót và nó yêu cầu gửi lại byte. Nếu có 2 bit lỗi xảy ra trong một việc truyền, bit parity sẽ xuất hiện đúng, tuy nhiên có thể hai lỗi diễn ra đồng thời là nhỏ hơn, và vì vậy điều này thường bị bỏ qua.

+ Chế độ USART có 2 chế độ (mode) chính: hoạt động đồng bộ và bất đồng bộ. Trong hoạt động bất đồng bộ, chân phát (TX-transmitter) từ 1 thiết bị được nối với chân thu (RX-Receiver) của thiết bị kia và dữ liệu được hoán đổi (được gọi là song công-full duplex). Trong chế độ đồng bộ, xung clock (CK) và đường dữ liệu (DT) là chia sẻ giữa một số thiết bị (một là chủ (master) và một hay nhiều tớ (Slaves)). Chủ chịu trách nhiệm tạo ra xung clock đồng bộ. Trong cả hai trường hợp, tốc độ tại đó dữ liệu được gửi bởi bộ phát (và mong đợi bởi bộ thu) được biết đến như là tốc độ baud.

+ Master Synchronous Serial Port (MSSP) Module: Môđun port nối tiếp đồng bộ chủ là giao tiếp nối tiếp, có ích cho truyền thông với thiết bị vi điều khiển hay ngoại vi khác. Những thiết bị ngoại vi này có thể là EEPROM nối tiếp, thanh ghi dịch, bộ hiển thị, bộ chuyển đổi A/D,vv… Mô đun MSSP có thể hoạt động trong hai chếđộ: Giao tiếp ngọai vi nối tiếp (Serial Peripheral Interface - SPI) và Mạch tích hợp liên kết (Inter-Integrated Circuit - I2C) .

120 a. Khảo sát các thanh ghi của truyền dữ liệu UART

+ Có hai thanh ghi để cấu hình/kiểm soát việc nhận và phát dữ liệu: RCSTA và TXSTA. Dữ liệu mà được đọc thành công được lưu vào thanh ghi RCREG, và dữ liệu mà được gửi đi nên được đặt trong thanh ghi TXREG. Tốc độ baud được đặt sử dụng thanh ghi SPBRG.

+ Trong chế độ bất đồng bộ, USART lấy kí tự 8 bit hay 9 bit để gửi, và thêm 1 bit bắt đầu (start bit -bit 0) ở đầu, và bit dừng (stop bit - 1 bit) vào cuối để tạo nên chuỗi 10 hay 11 bit. Điều này được chuyển vào thanh ghi dịch mà quay bit vào chân phát (TX) . Môđun nhận sẽ liên tục kiểm tra trạng thái của chân thu RX, mà sẽ bình thường là mức cao. Nếu nó dò thấy chân RX xuống mức thấp (bit start – bit 0), nó sẽ lấy thêm 3 mẫu trong giữa bit (cho phép lên và xuống chậm các lần) và lấy giá trị chính của ba . Nếu giá trị chính là 0, nó khẳng định đây thực sự là bit bắt đầu và tiến hành lấy mẫu các bit tuần tự với 3 mẫu ở giữa mỗi bit. Thời gian của mẫu này được chỉ ra bởi tốc độ baud. Khi nó đạt đến cái là bit dừng, nó phải đọc bit 1, ngược lại nó sẽ khẳng định kí tự thu được bị lỗi. Nhớ rằng với thiết lập phù hợp trong TXSTA và RCSTA, tất cả điều này được thực hiện tự động cho bạn bởi môđun USART.

+ Bạn có thể dùng chế độ bất đồng bộ để giao tiếp với port nối tiếp RS232 trên máy tính PC. Cách đơn giản để gửi byte thông qua port nối tiếp của PC là sử dụng chương trình đi kèm Microsoft Windows được gọi là Hyper Terminal. Bạn có thể tạo ra một kết nối với cổng nối tiếp (ví dụ COM 1), chọn tốc độ baud, số bit, thiết lập parity. Khi Hyper Terminal kết nối với port nối tiếp, bất kì kí tự mà bạn gõ sẽ được gửi (như là mã ASCII) thông qua port nối tiếp. Kí tự mà được nhận được hiển thị lên màn hình. Cả hai chế độ đồng bộ và bất đồng bộ hỗ trợ đặc tính được biết như là dò tìm địa chỉ mà cho phép một số thiết bị được kết nối. Khi gửi dữ liệu, một byte địa chỉ phải được gửi đi đầu tiên để nhận diện nơi nhận dự định.

+ Bộ tạo tốc độ baud hỗ trợ cả chế độ bất đồng bộ và đồng bộ của USART. Nó là bộ tạo tốc độ baud 8 bit. Thanh ghi SPBRG (địa chỉ 99H) điều khiển chu kì của bộ định thì 8 bit chạy tự do. Trong chế độ bất đồng bộ bit BRGH (TXSTA<2>) cũng kiểm soát tốc độ baud. Trong chế độ đồng bộ, bit BRGH bị bỏ qua. Công thức tính tốc độ baud như sau:

123 b. Các kiểu truyền dữ liệu UART của VĐK

+ Trong mode kiểu truyền dữ liệu không đồng bộ (UART), USART sử dung dạng NRZ (Non-Return –to-Zero) chuẩn (một bit bắt đầu(start), 8 hay 9 bit dữ liệu, và một bit dừng(stop)). Dạng dữ liệu thông dụng nhất là 8 bit. Một bộ tạo tốc độ baud 8 bit có sẵn trên chip có thể được dùng để tạo tần số tốc độ baud chuẩn từ tần số thạch anh của hệ thống. USART phát và nhận bit LSB trước tiên. Bộ phát và thu là độc lập chức năng nhưng sử dụng chung dạng dữ liệu và tốc độ baud. Bộ tạo tốc độ baud tạo ra xung clock, hoặc là x16 hay x64 của tốc độ dịch bit phụ thuộc vào bit BRGH (TXSTA<2>).

124

Chẵn lẻ (parity) không được hỗ trợ bởi phần cứng nhưng có thể hiện thực bằng phần mềm (và được lưu như là bit dữ liệu thứ 9). Mode bất đồng bộ bị dừng trong khi Sleep. Mode bất đồng bộ được chọn bằng cách xóa bit SYNC (TXSTA<4>). Môđun bất đồng bộ USART gồm có các phần tử quan trọng sau đây:

 Bộ tạo tốc độ baud.  Mạch lấy mẫu.  Bộ phát bất đồng bộ .  Bộ thu bất đồng bộ.

+ Khi thiết lập sự phát bất đồng bộ, bạn theo các bước sau:

 Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao là mong muốn thì ta bật (lên 1) bit BRGH.

 Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bật bit SPEN.  Nếu ngắt là mong muốn, thì ta bật bit cho phép TXIE.

 Nếu sự truyền 9 bit là mong muốn, thì ta bật bit truyền TX9.  Cho phép truyền bằng cách bật bit TXEN mà sẽ bật bit TXIF.

125

 Nếu sự truyền 9 bit được chọn, bit thứ 9 sẽ được nạp vào bit TX9D.

 Kiểm tra bộ nhớ đệm (thanh ghi dịch – bit TRMT)đang trống trước khi nạp dữ liệu truyền  Nạp dữ liệu vào thanh ghi TXREG (bắt đầu truyền).

 Nếu dùng ngắt, đảm bảo rằng GIE và PEIE (bit 7 và 6) của thanh ghi INTCON được bật. + Các thanh ghi được dùng trong phát bất đồng bộ USART:

+ Dữ liệu được nhận trên chân RC7/RX/DT và đến khối phục hồi dữ liệu. Khối khôi phục dữ liệu thực chất là bộ dịch tốc độ cao, hoạt động ở 16x tốc độ baud, trong khi bộ dịch nối tiếp thu chính hoạt động ở tốc độ bit hay Fosc.

+ Khi thiết lập sự thu bất đồng bộ, bạn theo các bước sau:

 Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao được chọn, thì ta bật bit BRGH.

 Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bật bit SPEN.  Nếu ngắt là mong muốn, thì ta bật bit cho phép RCIE.

 Nếu sự nhận 9 bit là mong muốn, thì ta bật bit RX9.  Cho phép nhận bằng cách bật bit CREN.

 Bit cờ RCIF được bật (=1) khi sự nhận hoàn thành và ngắt sẽ tạo ra nếu bit cho phép RCIE được bật. (adsbygoogle = window.adsbygoogle || []).push({});

 Đọc thanh ghi RCSTA để nhận bit thứ 9 (nếu cho phép) và xác định xem có lỗi nào xảy ra trong quá trình nhận (thu).

 Đọc dữ liệu nhận 8 bit bằng cách đọc thanh ghi CRREG.  Nếu có lỗi xảy ra, xoá lỗi bằng cách xóa bit cho phép CREN.

126 + Các thanh ghi được dung trong phát bất đồng bộ USART:

127 c. Ứng dụng truyền dữ liệu UART

Ví dụ 1:

Viết chương trình cho vđk phát một chuỗi ký tự dùng kiểu truyền bất đồng bộ 8 bit (UART). Khi vđk nhận 1 ký tự (dùng phương pháp ngắt) thì sẽ hồi âm (feedback/echo) chính ký tự vừa nhận được.

#define _XTAL_FREQ 4000000 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #include <htc.h>

__CONFIG(0x3FFA);

void senddata_uart(uchar cdd); void sendstring_uart(const uchar *dd);

//*************** main ******************** void main(void)

{

SYNC=0; // uart mode BRGH=1; // hi-speed mode

SPBRG=25; // 9600 baud with 4Mhz crytal SPEN=1; // Enable serial port

TRISC7=1; // Rx - Input TRISC6=0; // Tx - Output TXEN=1; // Enable Tx

CREN=1; // Enable Continue Receive GIE=1; // Enable Interrupt Receive PEIE=1;

128 sendstring_uart("***string 1****\r\n"); sendstring_uart("***STRING 2****\r\n"); sendstring_uart("***STRING 3****\r\n");

sendstring_uart("\r\n"); // \r\n means new lines while(1)

{ } }

//********************* INTTERUPT ***************** void interrupt isr(void)

{

uchar cd;

if(RCIE&&RCIF) // map with Rx UART Int {

cd=RCREG; // read byte to cd

while(!TRMT); // wait until reading complete

TXREG= cd; // echo read byte back to UART sender TRISD = 0;

PORTD = cd; // display received byte to 8 led }

}

//****************** UART send Subroutin ******************* void senddata_uart(uchar cdd)

{

while(!TRMT); // wait for free buffer TXREG=cdd; (adsbygoogle = window.adsbygoogle || []).push({});

}

//************************UART send one string************** void sendstring_uart(const uchar *dd)

{ while((*dd)!=0) { senddata_uart(*dd); dd++; } }

d. Giao tiếp truyền dữ liệu giữa máy tính và VĐK theo kiểu truyền UART.

129 e. Kiểu truyền dữ liệu đồng bộ USRT:

+ Trong mode chủ đồng bộ, dữ liệu được truyền theo cách bán song công (half-duplex)(nghĩa là phát và thu không diễn ra cùng một thời điểm). Khi phát dữ liệu, sự nhận (thu) bị cấm và ngược lại. Mode đồng bộ đưa vào bằng cách bật bit, SYNC(TXSTA<4>). Hơn nữa, bit cho phép SPEN (RCSTA<7>) được bật (=1) để cấu hình chân RC6/TX/CK và RC7/RX/DT tới đường CK (clock) và DT (dữ liệu-data) tương ứng. Mode chủ chỉ ra rằng bộ xử lí phát clock chủ trên đường CK. Mode chủ được đưa vào bằng cách bật bit CSRC (TXSTA<7>).

+ Việc thu phát đồng bộ giống như thu phát không đồng bộ.

8.3 Modul MSSP

8.3.1 SPI

a. Truyền dữ liệu SPI.

+ Giao tiếp SPI được hãng motorola giới thiệp ở giữa năm 1980 và được sử dụng trong các dòng vi điều khiển của họ. Ngày nay giao tiếp SPI được sử dụng phổ biến để giao tiếp với các vi điều khiển, eeprom, IC thời gian thực...

+ SPI là giao thức nối tiếp đồng bộ đa mục đích (general-purpose synchronous serial interface), trong khi thực hiện giao tiếp SPI dữ liệu truyền và nhận được diễn ra một các đồng thời. Một xung clock đồng bộ (Synchronous Clock – SCK) dùng để dịch và lấy mẫu thông tin trên hai đường dữ liệu. Thiết bị giao tiếp SPI sử dụng mối quan hệ master- slaver (chủ-tớ), do thiết bị tớ không được định địa chỉ nên khi giao tiếp một master với nhiều slaver ta cần đường chọn chíp CS, để chọn slave nào cần truyền nhận dữ liệu. Vậy số bus cho giao tiếp này là 3 + (1....n) dây.

+ Chế độ SPI cho phép 8 bit dữ liệu được phát đồng bộ và nhận đồng thời. Tất cả 4 chế độ của SPI được hỗ trợ. Để hoàn thành truyền thông, ba chân tiêu biểu được dùng:

 Dữ liệu ra nối tiếp (Serial Data Output -SDO)-RC5/SDO.  Dữ liệu vào nối tiếp (Serial Data Input -SDI)-RC4/SDI/SDA.  Clock nối tiếp (Synchronous Clock -SCK)-RC3/SCK/SCL.

 Trong trường hợp vđk hoạt động ở chế độ Slave, Slave Select (SS) – RA5/AN4/SS/C2OUT cần thêm vào để sử dụng cho việc chọn thiết bị Slave.

130 b. Khảo sát các thanh ghi của truyền dữ liệu SPI. + Có 4 thanh ghi được sử dụng cho SPI:

 MSSP Control Register (SSPCON)  MSSP Status Register (SSPSTAT)

 Serial Receive/Transmit Buffer Register (SSPBUF)  MSSP Shift Register (SSPSR) – Not directly accessible + Các bước thực hiện cho việc truyền/ nhận dữ liệu SPI

 Master mode (SCK is the clock output)  Slave mode (SCK is the clock input)  Clock Polarity (Idle state of SCK)

 Data Input Sample Phase (middle or end of data output time)  Clock Edge (output data on rising/falling edge of SCK)

 Clock Rate (Master mode only)  Slave Select mode (Slave mode only)

+ Chú ý, việc cấu hình các thông số phải đồng bộ giữa master và các slave: ví dụ như: Clock Polarity, Clock Edge, Clock Rate…

131

+ Như đã giới thiệu, Module MSSP của PIC có 2 thanh ghi chức năng Truyền/Nhận là Thanh ghi-dịch SSPSR và thanh ghi đệm SSPBUF. SSPSR sẽ dịch chuyển data vào hoặc ra khỏi thiết bj, bit MSB trước. SSPBUF sẽ giữ dữ liệu mà dữ liệu này đã được ghi vào SSPSR cho đến khi nhận được byte dữ liệu kế tiếp. Nếu SSPBUF đã nhận đủ 8 bit dữ liệu thì bit BF (Buffer Full detect bit) và SSPIF (Interrupt Flag bit) của thanh ghi SSPSTAT được set. Bất cứ việc ghi/đọc dữ liệu trong thanh ghi SSPBUF trong qua trình truyền/nhận đều bị cấm và bit WCOL sẽ được set lên 1. Bit này cần được xóa để nếu dữ liệu tiếp theo được ghi vào SSPBUF hoàn tất thành công.

+ Cần phải đọc dữ liệu trong SSPBUF ngay sau khi nhận về để cho phép các dữ liệu tiếp theo được ghi vào. Bit BF sẽ cho biết khi nào SSPBUF đầy dữ liệu (quá trình truyền hoàn tất). Khi ta đọc giá trị trong thanh ghi SSPBUF, bit BF sẽ được xóa.

+ Một cách tổng quát, Ngắt của Module MSSP thường dùng để xét xem quá trình truyền/ nhận xong hay chưa. Nếu bit SSPIF = 1 thì chứng tỏ quá trình truyền nhận đã hoàn tất. Ngược lại, nếu bit SSPIF = 0 thì quá trình chưa hoàn thành.

133

+ Cực tính của xung SCK được chọn bằng cách thao tác lên bit CKP (SSPCON1). Dạng sóng của giao tiếp SPI được biểu diễn như hình bên dưới với bit MSB được truyền đi trước. Ở Master Mode, tốc độ xung SCK của giao tiếp SPI được chọn một trong số 4 tùy chọn sau:

 Fosc/4 ( hoặc Tcy)  Fosc/16 (hoặc 4 - Tcy)  Fosc/64 (hoặc 16 – Tcy)  Timer2 output/2

134 + PIC ở mode slave spi: (adsbygoogle = window.adsbygoogle || []).push({});

- Ở chế độ Slave, dữ liệu chỉ được truyền đi hay nhận về khi có xung SCK. Khi bit cuối cùng đã được chốt, cờ ngắt SSPIF sẽ được set.

- Trước khi cho phép PIC hoạt động ở Slave Mode ta cần phải chú ý đến xung SCK. Xung clock phải khớp với trạng thái nghỉ của xung SCK. Trạng thái nghỉ được lựa chọn bằng việc thao tác lên bit CKP.

- Trong khi đang ở SPI Slave Mode, xung clock cần thiết cho việc trao đổi dữ liệu được lấy từ chân SCK. PIC có thể truyền/ nhận trong lúc đang sleep (trạng thái tiết kiệm năng lượng). Nếu có 1 byte dữ liệu được nhận thì PIC sẽ wake-up (trạng thái hoạt động).

+ Thiết bị slave tự động lựa chọn sự đồng bộ hóa:

- Chân Slave Select (SS) cho phép đồng bộ hóa ở chế độ SPI Slave. Do đó, nếu đặt cấu hình hoạt động ở chế độ Slave thì ta nên cho phép chân SS để điều khiển (đặt các bit SSPCON1 =

135

0x04). Khi chân SS được đưa xuống mức thấp, sự truyền/ nhận dữ liệu được cho phép và chân SDO sẽ được thúc để tải dữ liệu. Khi chân SS được đưa lên mức cao, chân SDO sẽ không được thúc nữa, dữ liệu sẽ không được lưu thông.

- Nếu SPI Slave Mode có chân SS điều khiển được kích hoạt, thì mô-đun SPI sẽ reset khi chân SS được đưa lên Vdd. Lúc này bit counter bị xóa về ‘0’. Ta cũng có thể xóa bit counter bằng cách xóa bit SSPEN.

136

d. Ứng dụng truyền dữ liệu SPI,

Ví dụ 2:

Sử dụng Module SPI như là công cụ mở rộng Port I/O cho vđk bằng cách giao tiếp SPI out với IC

Một phần của tài liệu Bài giảng lý thuyết vi xử lý kỹ thuật vi xử lý cd rom (Trang 120 - 154)