Professional Documents
Culture Documents
4
8.1 Giới thiệu
▪ Một định dạng khung cơ bản trong truyền nối tiếp bất đồng bộ gồm:
o Start bit (St): luôn là bit 0, dùng để báo hiệu bắt đầu khung truyền.
o Tiếp theo là các bit dữ liệu (từ 5 đến 9 bit, LSB được truyền/nhận trước).
o Kết thúc là stop bit (Sp) luôn là bit 1 (có thể là 1 hoặc 2 bit 1), dùng để báo
hiệu kết thúc khung dữ liệu.
▪ Để tăng thêm độ tin cậy của dữ liệu trong quá trình phát, 1 bit kiểm tra chẵn
lẻ (gọi là parity-check bit) P có thể được thêm vào giữa bit dữ liệu cuối cùng
(MSB) và stop bit.
ATmega324P
hiệu trong giao
thức SPI.
Dùng để thu/nhận
(trên chân RXD) và
truyền/phát (trên
chân TXD) khi giao
thức USART hoạt
động ở chế độ
truyền nối tiếp bất
đồng bộ/đồng bộ.
Baud rate
11
8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate)
▪ Tốc độ baud trong truyền nối tiếp bất đồng bộ (UART) và đồng bộ (USRT)
được xác định như sau:
2U2Xn × 𝑓𝑜𝑠𝑐
Tốc độ baud =
16 × 𝑋 + 1
Trong đó:
o 𝑋 là giá trị (không dấu) được nạp vào thanh ghi UBRRn.
o fosc là tần số clock hệ thống
o U2Xn là bit 1 của thanh ghi UCSRnA. Lưu ý: khi U2Xn = 1: tăng gấp đôi tốc độ baud.
▪ Xác định giá trị nạp vào thanh ghi UBRRn để cài đặt tốc độ baud:
2U2Xn × 𝑓𝑜𝑠𝑐
𝑋= −1
16 × Tốc độ baud
= 1: nếu ký tự tiếp theo trong bộ đệm thu bị lỗi khung truyền. Một
khung truyền bị lỗi nếu stop bit đầu tiên là 0.
= 1: khi dữ liệu trong bộ đệm phát được chuyển đến thanh ghi dịch phát hay
nói cách khác là bộ đệm phát đang trống và sẵn sàng nhận dữ liệu mới. Cờ
UDREn được tự động xóa sau khi ghi dữ liệu mới vào thanh ghi UDRn.
= 1: khi toàn bộ dữ liệu của một frame (start bit, data bit, [parity bit], stop bit) trong
thanh ghi dịch phát (Transmit Shift Register) được dịch hết ra ngoài trên chân TxD và
không có dữ liệu mới nào được ghi vào bộ đệm phát UDRn.
= 1: khi có dữ liệu mới trong bộ đệm thu chưa được đọc, hay nói cách khác là bộ đệm thu đầy. Cờ
RXCn sẽ bị xóa về 0 bằng phần cứng sau khi đọc dữ liệu từ thanh ghi UDRn.
17
8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC
RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n UCSRnB
Bit dữ liệu phát 8 (hay bit phát thứ 9)
trong chế độ phát/thu 9 bit, được ghi
vào bit TXB8n trước khi ghi các bit dữ
liệu thấp vào bộ đệm phát UDRn.
Kết hợp với 2 bit UCSZn1 và UCSZn0 trong thanh ghi UCSRnC
quy định độ dài của dữ liệu phát/thu.
= 1: cho phép phát. Bit TXENn = 0 không cho phép phát. Quá trình phát chỉ
bị vô hiệu hóa sau khi toàn bộ dữ liệu trong thanh ghi dịch phát và bộ đệm
phát (UDRn) được phát hoàn toàn ra đường truyền TxD.
= 1: cho phép thu. Khi RXENn = 0 thì việc không cho phép bộ thu sẽ có tác dụng ngay
lập tức. Dữ liệu đang được thu sẽ bị mất.
= 1: cho phép ngắt bộ đệm phát USART trống (USART Data Register Empty Interrupt) khi bit cho
phép ngắt toàn cục I = 1 và cờ UDREn trong thanh ghi UCSRnA bằng 1.
= 1: cho phép ngắt phát USART hoàn thành (USART Transmit Complete Interrupt) khi bit cho phép ngắt toàn
cục I = 1 và cờ TXCn trong thanh ghi UCSRnA bằng 1.
= 1: cho phép ngắt thu USART hoàn thành (USART Receive Complete Interrupt) khi bit cho phép ngắt toàn cục I =
1 và cờ RXCn trong thanh ghi UCSRnA bằng 1.
18
8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC
UCSZn1/ UCSZn0/ UCSRnC
UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCPOLn
UDORDn UCPHAn
o 𝑃even = 𝑑𝑚−1 ⊕ 𝑑𝑚−2 ⊕ ⋯ ⨁𝑑1 ⨁𝑑0 ⨁0 ▪ Peven: bit kiểm tra chẵn
▪ Podd: bit kiểm tra lẻ
o 𝑃odd = 𝑑𝑚−1 ⊕ 𝑑𝑚−2 ⊕ ⋯ ⨁𝑑1 ⨁𝑑0 ⨁1 ▪ d : bit i của dữ liệu
i
19
8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC
UCSZn1/ UCSZn0/ UCSRnC
UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCPOLn
UDORDn UCPHAn
▪ Bit 3 – USBSn: Stop Bit Select
Bit USBSn dùng để thiết lập số stop bit là 1 stop bit (USBSn = 0) hay 2 stop bit (USBSn = 1).
Bộ thu sẽ bỏ qua stop bit trong quá trình thu.
▪ Bit 2:1 – UCSZn[1:0]: Character Size
Các bit UCSZn1 và UCSZn0 kết hợp với bit UCSZn2 (bit 2 trong thanh ghi UCSRnB) để thiết
lập số bit dữ liệu (hay kích thước ký tự) trong một khung truyền.
UCSZn[2:0] Kích thước ký tự (bit) Lưu ý: trong chế độ master SPI (MSPIM),
000 5 bit 2 là UDORDn (Data Order) dùng để
001 6 thiết lập thứ tự bit được phát/thu.
010 7 UDORDn = 0: MSB được phát/thu trước.
011 8 (mặc định) UDORDn = 1: LSB được phát/thu trước.
100 Bit dành riêng (Chưa định nghĩa) Bit 1 là UCPHAn (Clock Phase) dùng để
thiết lập dữ liệu được lấy mẫu tại cạnh
101 Bit dành riêng (Chưa định nghĩa)
trước (leasing edge) hay cạnh sau (tailing
110 Bit dành riêng (Chưa định nghĩa) edge) của xung XCKn.
111 9
Lưu ý: giá trị mặc định UCSZn[2:0] là 011 (khung truyền 8 bit data).
20
8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC
UCSZn1/ UCSZn0/ UCSRnC
UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCPOLn
UDORDn UCPHAn
▪ Bit 0 – UCPOLn: Clock Polarity
Bit UCPOLn chỉ được sử dụng trong chế độ truyền nối tiếp đồng bộ. Nếu UCPOLn = 0:
từng bit dữ liệu được phát trên chân TxD ở cạnh lên xung XCKn, thu trên chân RxD ở
cạnh xuống xung XCKn. Ngược lại, Nếu UCPOLn = 1: từng bit dữ liệu được phát trên
chân TxD ở cạnh xuống xung XCKn, thu trên chân RxD ở cạnh lên xung XCKn. Lưu ý: nếu
sử dụng chế độ truyền nối tiếp bất đồng bộ thì bit UCPOLn được thiết lập bằng 0.
Dữ liệu phát thay đổi Dữ liệu thu được lấy mẫu
UCPOLn
(Ngõ ra chân TxD) (Ngõ vào chân RxD)
0 Cạnh lên xung XCKn Cạnh xuống xung XCKn
1 Cạnh xuống xung XCKn Cạnh lên xung XCKn
PD0 (RXD0)
44
.EQU OUTPORT=PORTB ;PORTB data 1
.EQU INPORT=PINB
.EQU IOSETB=DDRB
.EQU CONT=PORTC ;PORTC điều khiển
.EQU CONT_DR=DDRC
.EQU CONT_IN=PINC
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.EQU E=2 ;bit E
.EQU ENTER=$0D ;mã xuống dòng
.EQU CHR_ROW=16
.DEF CNT_ROW=R20 ;đếm số ký tự mỗi hàng
▪ Thành phần chính của hệ thống gồm 2 thanh ghi dịch 8 bit (1 thanh ghi dịch cho Master và 1 thanh ghi dịch
cho Slave) và khối tạo xung clock của Master.
▪ Quá trình giao tiếp giữa Master và Slave được bắt đầu bằng cách Master kéo chân /SS của Slave cần muốn
giao tiếp xuống mức thấp.
▪ Master và Slave chuẩn bị dữ liệu được gửi trong thanh ghi dữ liệu SPDR0.
▪ Master sẽ tạo ra xung clock trên chân SCK cho việc dịch chuyển dữ liệu đồng thời giữa Master và Slave.
Cứ mỗi xung nhịp do Master tạo ra trên chân SCK sẽ tương ứng với một bit trong thanh ghi dịch của Master
được truyền đến Slave trên đường MOSI và một bit trong thanh ghi dịch của chip Slave cũng được truyền
đến Master trên đường MISO.
▪ Master kết thúc quá trình giao tiếp với Slave bằng cách kéo tín hiệu trên chân /SS của Slave lên mức cao.
56
Sơ đồ kết nối các tín hiệu giữa Master và Slave trong giao tiếp SPI
https://electrosome.com/spi/
57
❖ Các thanh ghi sử dụng trong giao thức SPI:
Địa chỉ MEM Địa chỉ I/O Ký hiệu Truy xuất bit Chức năng
0x4C 0x2C SPCR0 Có Điều khiển SPI
0x4D 0x2D SPSR0 Có Trạng thái SPI
0x4E 0x2E SPDR0 Không Dữ liệu phát/thu SPI
▪ SPI trên ATmega324P được vận hành bởi 3 thanh ghi bao gồm:
o Thanh ghi điều khiển SPCR0.
o Thanh ghi trạng thái SPSR0.
o Thanh ghi dữ liệu SPDR0.
Sự kết hợp 2 bit này cấu hình 4 chế độ hoạt động của SPI. Chúng
ta cấu hình các bit này sao cho phải đảm bảo Master và Slave
cùng chế độ hoạt động.
Cấu hình chip hoạt động với vai trò là Master hay Slave. Nếu MSTR0 = 1 thì chip là
Master, ngược lại MSTR0 = 0 thì chip là Slave.
Quy định thứ tự dữ liệu các bit được truyền và nhận trên các đường MISO và MOSI. DORD0 = 0:
MSB được truyền/nhận trước, DORD0 = 1: LSB được truyền/nhận trước.
= 1: cho phép giao tiếp SPI. Nếu SPE0 = 0 thì SPI dừng hoạt động.
= 1: cho phép ngắt SPI. Nếu bit này được đặt bằng 1 và bit I trong thanh ghi SREG được đặt bằng 1, ngắt SPI sẽ
xảy ra sau khi một gói dữ liệu (8 bit) được phát hoặc thu (cờ SPIF0 = 1).
59
❖ Thanh ghi điều khiển SPCR0 – SPI Control Register
▪ Các chế độ hoạt động SPI
Chế độ SPI Điều kiện Cạnh trước xung clock Cạnh sau xung clock
0 CPOL0 = 0, CPHA0 = 0 Lấy mẫu dữ liệu ở cạnh lên. Dữ liệu thay đổi ở cạnh xuống.
1 CPOL0 = 0, CPHA0 = 1 Dữ liệu thay đổi ở cạnh lên. Lấy mẫu dữ liệu ở cạnh xuống.
2 CPOL0 = 1, CPHA0 = 0 Lấy mẫu dữ liệu ở cạnh xuống. Dữ liệu thay đổi ở cạnh lên.
3 CPOL0 = 1, CPHA0 = 1 Dữ liệu thay đổi ở cạnh xuống. Lấy mẫu dữ liệu ở cạnh lên.
▪ CPHA0 = 0 ▪ CPHA0 = 1
Giải:
Các bước phát và thu dữ liệu từ SPI như mô tả từ bước 3 đến 5. Chương trình
con SPI_TRANS phát dữ liệu từ R17 và thu dữ liệu vào R18.
SPI_TRANS:
OUT SPDR0,R17 ;ghi data ra SPI
WAIT_SPI:
IN R16,SPSR0 ;đọc cờ SPIF0
SBRS R16,SPIF0 ;cờ SPIF0=1: truyền SPI xong
RJMP WAIT_SPI ;chờ cờ SPIF0=1
IN R18,SPDR0 ;đọc data từ SPI → xóa cờ SPIF0
RET
Trong chương trình chính phải xóa chân /SS=0 trước khi gọi chương trình con
trên, và đặt /SS=1 khi muốn kết thúc truyền SPI.
65
❖ Đối với Slave
▪ Trong chế độ Slave, cổng SPI hoàn toàn phụ thuộc vào tín hiệu /SS.
o Nếu /SS=1: Slave ngưng làm việc, chân MISO=hi-Z (tổng trở cao), chỉ có thể cập nhật
dữ liệu thanh ghi SPDR0.
o Khi /SS=0: xung CK từ Master sẽ dịch dữ liệu phát từ Slave ra chân MISO và dữ liệu
thu từ Master vào chân MOSI. Cấu hình fCK, cạnh lấy mẫu, bit truyền trước do
Master quyết định.
1. Khởi động chế độ Slave gồm:
▪ Khai báo chân MISO (PB6) output, các chân /SS(PB4), MOSI(PB5), SCK(PB7) input
▪ Đặt bit SPE0=1 cho phép SPI, MSTR0=0 mô thức Slave, DORD0, CPOL0, CPHA0
đặt theo cấu hình Master, SPR10:00=xx fCK do Master quyết định (thuộc thanh
ghi SPCR0).
2. Ghi dữ liệu cần phát vào thanh ghi SPDR0.
3. Đọc thanh ghi SPSR0,chờ cờ SPIF0=1 báo đã truyền xong.
4. Đọc thanh ghi SPDR0 thu dữ liệu từ Master (tác vụ bước 3 và 4 tương ứng xóa cờ
SPIF0).
5. Lặp lại từ bước 2 cho đến khi thu dữ liệu từ Master báo kết thúc hay chân /SS=1.
76
▪ Module TWI trên ATmega324P bao gồm 4 thành phần: khối tạo bit rate, khối
giao tiếp bus, khối kiểm tra địa chỉ Slave và khối điều khiển.
Bit cho phép giao tiếp TWI. Khi bit TWEN được
đặt lên 1, TWI sẵn sàng hoạt động và kiểm soát
các chân I/O chuyển sang chức năng SCL, SDA
tương ứng.
Khi cờ TWINT đang ở mức thấp (tức TWI đang bận), nếu
chúng ta ghi dữ liệu vào thanh ghi dữ liệu (TWDR) thì xảy
ra lỗi xung đột dữ liệu. Khi đó bit TWWC tự động được
đặt lên 1 bằng phần cứng. Bit TWWC được xóa khi ghi dữ
liệu vào thanh ghi TWDR trong khi TWINT=1.
Bit tạo điều kiện STOP. Khi bit TWSTO = 1, Master muốn kết thúc
một cuộc gọi, nó sẽ phát ra điều kiện STOP. Bit này được xóa bằng
phần cứng khi điều kiện STOP được gửi.
Bit tạo điều kiện START. Khi một chip muốn trở thành Master để thực hiện 1 cuộc
gọi cho Slave, chúng ta đặt bit này lên 1. Lưu ý là bit TWSTA cần được xóa bằng
phần mềm sau khi điều kiện START đã được gửi (ghi 0 vào bit này để xóa).
Dùng để kích hoạt tín hiệu xác nhận ACK. Đối với chip Slave, cần đặt bit TWEA bằng 1 để Slave
có thể đáp ứng lại Master bất cứ khi nào được gọi.
Cờ báo ngắt TWI. Xem thêm trong giáo trình VXL các trường hợp cờ TWINT = 1.
81
❖ (TWI Data Register)
TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0 TWDR (0xB8)
▪ Thanh ghi dữ liệu 8 bit, địa chỉ MEM = 0xB8, đọc/ghi truy xuất bit được. Trong chế độ
thu, byte nhận được sau cùng được ghi vào TWDR. Trong chế độ phát, chúng ta ghi
byte cần phát vào TWDR để phát đi trên đường SDA. Lưu ý là TWDR chỉ được phép
truy cập khi bit TWINT được đặt lên 1, nếu không xảy ra xung đột dữ liệu.