MSB LSB SPDR Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu x x x x x x x x Không xác định Hình 8.4 Thanh ghi SPDR
Đây là thanh ghi truyền nhận dữ liệu, viết dữ liệu vào thanh ghi này dùng truyền dữ liệu, đọc dữ liệu khi ở chế độ nhận.
8.3 CÁC CHẾ ĐỘ LÀM VIỆC CỦA SPI
Thời điểm lấy
mẫu Thời điểm đỗi dữ liệu Giá trị ban đầu Chế độ SPI CPOL = 0, CPHA = 0 Cạnh lên Cạnh xuống Mức thấp 0 CPOL = 0, CPHA = 1 Cạnh xuống Cạnh lên Mức thấp 1 CPOL = 1, CPHA = 0 Cạnh xuống Cạnh lên Mức cao 2 CPOL = 1, CPHA = 1 Cạnh lên Cạnh xuống Mức cao 3
Bảng 8.2 Các thời điểm lấy mẫu nhận dữ liệu
Hình 8.6 Thời điểm lấy mẫu khi bit CPHA = 1 8.4 BÀI TẬP VÍ DỤ
Viết chương trình giao tiếp giữa 1 Master và 2 Slaver, theo yêu cầu sau:
Khi nhấn nút 1 thì Master sẽ gởi dữ liệu từ PORTA đến Slaver 1, nút 2 thì Master gởi dữ liệu từ PORTA đến Slaver 2.
Phân tích: Các bước thực hiện Chọn Master và Slaver
Chọn tốc độ truyền dữ liệu Xác định ngắt/ không ngắt
Xác định kiểu truyền dữ liệu (LSB trước hay MSB trước) Chọn mode hoạt động 0,1,2,3
Chương trình cho Master:
/*****************************************************
This program was produced by the CodeWizardAVR V2.05.0 Advanced
Date : 28/01/2012
Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM Chip type : ATmega16
Program type : Application AVR Core Clock frequency: 1,000000 MHz
*****************************************************/
// SPI functions
#include <spi.h>
// Declare your global variables here
void main(void) { // Port A initialization PORTA=0xff; DDRA=0x00; // Port B initialization PORTB=0x07; DDRB=0xB0; // Port C initialization PORTC=0x00; DDRC=0x00; // Port D initialization PORTD=0x00; DDRD=0x00;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80; SFIOR=0x00;
// SPI initialization // SPI Type: Master
// SPI Clock Rate: 250,000 kHz // SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70; SPSR=0x00; // TWI initialization // TWI disabled TWCR=0x00; while (1) {
// Place your code here
while(PINB.2); spi(PINA); }
Chương trình cho Slave
/***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Date : 28/01/2012
Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM Chip type : ATmega16
AVR Core Clock frequency: 1,000000 MHz
*****************************************************/
#include <mega16.h>
// SPI functions
#include <spi.h> void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x40; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xFF;
// Analog Comparator initialization
ACSR=0x80; SFIOR=0x00;
// SPI initialization // SPI Type: Slave
// SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x60; SPSR=0x00; while (1) {
// Place your code here
PORTD = SPDR; SPSR.7 = 1; }
8.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG
Câu 1: Chân SS là ngõ vào hay ngõ ra đối với Master và Slaver Câu 2: Chân SS của Slaver phải luôn ở mức cao hay mức thấp
Câu 3: Hãy cài đặc vi điều khiển ở chế độ Master, tần số xung SCK = 62,500Khz, mức logic của chân SCK ban đầu bằng 1, thời điểm lấy mẫu cạnh lên của xung clock, truyền LSB trước, biết tần số thạch anh là 4Mhz.
Chương 9
GIAO TIẾP THIẾT BỊ THEO NGHI THỨC I2C
9.1. GIỚI THIỆU:
Là hoạt động truyền dữ liệu dạng nối tiếp có định địa chỉ, hỗ trợ cả Master và Slave, hoạt động I2C sử dụng 2 chân giao tiếp SDA và SCL, hoạt động I2C có thể truy cập tới từng ô nhớ của thiết bị.
Hình 9.1 Hình vẽ giao tiếp theo nghi thức I2C 9.1.1 Đặc tính
Đơn giản, dễ giao tiếp và sử dụng chỉ với 2 dây
Tốc độ truyền 400Khz
Hổ trợ cho cả 2 hoạt động Master và Slave có thể hoán đổi vị trí cho nhau.
Có thể hoạt động như bộ truyền/ nhận dữ liệu
Có thể phân chia đến 128 địa chỉ khác nhau cho Slave
Hổ trợ nhiều Master kiểm soát đường truyền
2 chân giao tiếp SDA (PC1,23) và SCL (PC0,22) 9.1.2 Thuật ngữ:
SDA: Serial Data dữ liệu đường nối tiếp
9.2 NGUYÊN LÝ HOẠT ĐỘNG GIAO TIẾP I2C
Hoạt động I2C bắt đầu bằng 1 start bit và kết thúc bằng 1 Stop bit, gói dữ liệu là 8 bit và xen giữa là bit ACK,
Định dạng gói địa chỉ
Hình 9.2 Định dạng truyền dữ liệu theo nghi thức I2C
Để bắt đầu bằng 1 start bit chân SDA sẽ từ mức cao xuống mức thấp, trong khi Stop bit chân SDA sẽ từ mức thấp chuyển lên mức cao trong cả 2 trường hợp này chân SCL đều ở mức cao,
Hình 9.3 Định dạng Stop bit và Start bit
Việc chuyển đổi dữ liệu giữa các bit được thực hiện tại mức thấp của chân SCL,
Hình 9.4 Chuyển đổi dữ liệu tại mức thấp của chân SCL
Ví dụ dạng sóng gởi dữ liệu từ Master đến Slaver theo dữ liệu 10011010 như sau:
Hình 9.6 Lưu đồ giải thuật gởi dữ liệu từ Master đến Slaver
Khởi động START bit Gởi 7 bit địa chỉ tới Slave Kiểm tra ACK Gởi 1 bit Read/ Write BEGIN
SDA từ mức cao chuyển sang mức thấp trong khi SCL luôn ở mức cao
Master gởi địa chỉ (7 bit) tới Slave trên chân SDA
Master gởi yêu cầu Read/ Write tới Slave Read = 1, Write = 0.
Khi ACK = 0, thì Slave đã nhận được địa chỉ, ACK = 1 thì Slave không nhận địa chỉ Khi Master
nhận được NACK, thì Master sẽ gởi lại Start bit hoặc Stop bit để kết thúc quá trình gởi Gởi/ Nhận 8 bit dữ liệu Kiểm tra ACK
Master gởi dữ liệu (8 bit) tới Slave hoặc nhận dữ liệu từ Slave
Master kiểm tra bit ACK, nếu ACK thì Slave nhận được dữ liệu, nếu NACK thì Slave không nhận được dữ liệu
Master có thể gởi/ nhận tiếp dữ liệu tới/ từ Slave hoặc gởi Stop bit tới Slave để kết thúc quá trình gởi/ nhận dữ liệu
9.3 CÁC THANH GHI LIÊN QUAN
9.3.1 Thanh ghi TWBR (TWI bit rate register) dùng để chọn tần số phát xung clock trên chân SCL. trên chân SCL. Bit 7 6 5 4 3 2 1 0 TWB7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 9.7 Thanh ghi tạo tần số TWBR
9.3.2 Thanh ghi TWCR(TWI Control Register): Dùng để điều khiển hoạt động TWI
Bit 7 6 5 4 3 2 1 0
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
Read/ Write RW RW RW RW R RW R RW
Giá trị ban
đầu 0 0 0 0 0 0 0 0
Hình 9.8 Thanh ghi điều khiển TWCR
Bit7 – TWINT: (cờ ngắt TWI) bit này bằng 1 khi hoạt động TWI hoàn tất, nếu bit I trong thanh ghi (SREG) và bit TWIE trong thanh ghi (TWCR) được cài đặc là 1, vi điều khiển sẽ nhảy tới vector ngắt TWI. Chân SCL sẽ duy trì mức thấp khi cờ TWINT được bậc lên 1. Cờ TWINT sẽ được xóa khi viết mức logic 1 lên bit này, và tự động xóa khi sử dụng hoạt động ngắt.
Bit6 – TWEA: (TWI Enable Acknowledge bit, bit cho phép bắt tay) bit này điều khiển việc phát xung ACK. Nếu bit TWEA được viết lên 1, thì xung ACK sẽ được phát lên đường bus khi nó thỏa mãn các điều kiện sau:
Cấu hình bên Slave đã xác định được địa chỉ
Hoạt động nhiều Slave được nhận khi bit TWGCE trong thanh ghi TWAR được viết logic 1.
1 byte dữ liệu đã được nhận trong ở Master hoặc Slave.
Khi bit này được viết mức logic 0, thì cấu hình tạm thời không kết nối với đường bus TWI, khi bit này bằng 1 thì nó sẽ kết nối với bus TWI.
Bit5 – TWSTA: (TWI Start Condition Bit, bit kiểm tra điều kiện Master) khi 1 vi điều khiển nào đó muốn trở thành Master thì nó sẽ viết mức logic 1 lên bit này (TWSTA), phần cứng sẽ kiểm tra xem đường truyền trên bus có rãnh hay không và sẽ phát sinh xung Start trên đường bus, tuy nhiên nếu đường bus bận thì TWI sẽ chờ bit Stop và sẽ
phát lại xung Start để giành quyền Master, bit TWSTA phải được xóa bởi phần mềm khi xung Start được truyền đi.
Bit4 – TWSTO: (TWI Stop Condition Bit, bit kết thúc vai tò Master) đối với Master bit này được viết logic 1 sẽ phát điều kiện Stop trên đường bus. Khi điều kiện Stop được thực hiện trên đường Bus xong thì bit TWSTO sẽ được xóa tự động. Còn đối với Slave, bit này = 1 dùng để khắc phục lỗi, và sẽ không phát sinh điều kiện Stop trên đường Bus. Bit3 – TWWC: (TWI Write Collision Flag, cờ báo lỗi khi viết dữ liệu) cờ này sẽ có logic 1 khi viết dữ liệu vào thanh ghi dữ liệu (TWDR) trong khi TWINT ở mức logic 0. Cờ này sẽ về 0 khi viết dữ liệu vào thanh ghi TWDR khi bit TWINT ở mức 1.
Bit2 – TWEN: (TWI Enable bit, bit cho phép TWI) bit này được viết logic 1 sẽ cho phép hoạt động TWI, khi bit này có mức logic 0 sẽ không cho phép hoạt động TWI.
Bit1 – Res: (Bit dự trữ)
Bit0 – TWIE: (TWI Interrupt Enable, cho phép ngắt TWI) khi bit này bằng 1 và bit I trong thanh ghi SREG bằng 1 thì sẽ cho phép hoạt động ngắt TWI.
9.3.3 Thanh ghi TWSR(TWI Status Register) Thanh ghi trạng thái TWI
Bit 7 6 5 4 3 2 1 0
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
Read/ Write R R R R R R RW RW
Giá trị ban
đầu 1 1 1 1 1 0 0 0
Hình 9.9 Thanh ghi trạng thái TWSR Bit7..3 – TWS7: (TWI Status) bit này kết hợp với các bit
Bit2 – Res (bit dự trữ) bit này luôn được viết là logic 0.
(9.1) Bit1.0 – TWPS (TWI Prescaler Bit) 2 bit này dùng để xác định tốc độ truyền dữ liệu trong TWI.
TWBR : Giá trị trong thanh ghi TWBR
TWPS : Giá trị 2 bit cuối trong thanh ghi TWSR
9.3.4 Thanh ghi TWDR (TWI Data Register) Trong hoạt động truyền byte này chứa dữ liệu kế tiếp để truyền và trong hoạt động nhận thanh ghi chứa byte vừa mới được dữ liệu kế tiếp để truyền và trong hoạt động nhận thanh ghi chứa byte vừa mới được nhận.
Bit 7 6 5 4 3 2 1 0 TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 1 1 1 1 1 1 1 1
Hình 9.10 Thanh ghi dữ liệu TWDR 9.3.5 Thanh ghi TWAR(TWI Address Register)
Bit 7 6 5 4 3 2 1 0
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE Read/
Write RW RW RW RW RW RW RW RW
Giá trị ban
đầu 1 1 1 1 1 1 1 0
Hình 9.11 Thanh ghi địa chỉ TWAR
Thanh ghi này dùng để xác định địa chỉ của vi điều khiển trong vai trò là Slave, bit cuối cùng TWGCE dùng trong hoạt động đa Master.
9.4 BÀI TẬP VÍ DỤ
Câu 1: Cài đặt tần số hoạt động là 125Khz theo nghi thức I2C với tần số thạch anh là 4 Mhz.
Giải: Dựa vào công thức (9.1) ta có:
Để tần số là 125 khz thì mẫu số sẽ có giá trị bằng 32 Vậy ta chọn TWBR = 1, TWPS = 2.
Câu 2: Vẽ sơ đồ mạch giao tiếp giữa atmega16 với DS1307, IC nhớ 24C32 và cảm biến nhiệt độ, độ ẩm STH10.
Hình 9.12 Sơ đồ giao tiếp I2C giữa các thiết bị
9.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG
Câu 1: Trong quá trình hoạt động, thiết bị Slaver có thể trở thành Master được hay không, nếu được hãy nêu nghi thức giải quyết.
Câu 2: Khi giao tiếp theo nghi thức I2C thì số thiết bị cho Slaver là bao nhiêu? Câu 3: Hãy cho biết tần số tối đa giao tiếp theo nghi thức I2C là bao nhiêu? Câu 4: Hãy cài đặc tần số SCL là 50Khz, tần số thạch anh là 8 Mhz
Câu 5: Hãy cho biết chức năng của bit ACK
Câu 6: Hãy trình bày giống nhau và khác nhau giữa các nghi thức giao tiếp I2C, USART, SPI. BT1 BATTERY U3 DS1307 4 7 5 1 2 6 3 8 GN D SQW SDA X1 X2 SCL VBAT VC C U1 Atmega16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2122 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 PB.0 PB.1 PB.2 INT2 PB.3 OC0 PB.4 PB.5 PB.6 PB.7 RESET VCC GND XTAL2 XTAL1 PD.0 RxD PD.1 TxD PD.2 INT0 PD.3 INT1 PD.4 PD.5 PD.6 OC2 PD.7SCL PC.0 SDA PC.1PC.2 PC.3 PC.4 PC.5 PC.6 PC.7 AVCCGND AVREFPA.7 PA.6 PA.5 PA.4 PA.3 PA.2 PA.1 PA.0 VCC5 VCC5 Y1 ZTA VCC5 U2 24AA32A 4 8 5 6 1 2 3 7 GN D VC C SDA SCL A0 A1 A2 WP VCC5 U4 SHT10 4 1 2 3 VC C GN D DATA SCK
PHỤ LỤC 1 (Các chuẩn giao tiếp và bit chẵn lẻ)
Các chuẩn giao tiếp
Master Salver Hoán đổi Số lượng dây Star, stop bit Tiếp cận từng địa chỉ Tốc độ tối đa Độ dài giao tiếp Đồng bộ Bất đồng bộ Khung dữ liệu I2C x 2 x x x - 8 SPI - >3 - - x - 8 USART - 3 x - x x 5-9
Bảng 10.1 So sánh các chuẩn giao tiếp
Kiểm tra chẵn lẻ (parity): là kiểm tra số lượng bit 1 và bit 0 trong một gói dữ liệu, có 2 dạng kiểm tra: kiểm tra chẵn (Even) và kiểm tra lẻ (Odd).
Kiểm tra chẵn: Nếu số lượng bit 1 trong 1 khung dữ liệu là chẵn thì bit
parity (P) sẽ là 0, ngược lại sẽ là 1.
o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là
1, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011011.
o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là
0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 110001010.
Kiểm tra lẻ: Nếu số lượng bit 0 trong 1 khung dữ liệu là chẵn thì bit parity
(P) sẽ là 1, ngược lại sẽ là 0.
o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là
0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011010.
o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là
PHỤ LỤC 2
(IC thời gian thực DS1307)
DS1307: là IC thời gian thực giao tiếp dữ liệu theo nghi thức I2C, chip này có 7 thanh ghi chứa thời gian đó là: giây, phút, giờ, thứ, ngày, tháng, năm. Ngoài ra nó còn 56 byte Ram dùng để chứa dữ liệu, sơ đồ chân của DS1307 như sau:
Hình 10.1 Sơ đồ chân IC DS1307 Với:
Chân (1,2) X1, X2: Chân tạo dao động nối với thạch anh có tần số 32.768Khz,
Chân 3 (Vbat): Nối nguồn Pin nuôi 3,3 volt giữ cho DS chạy đúng thời gian khi không có nguồn nuôi DS1307.
Chân 4 GND: Nguồn Mass cho cả DS và nguồn nuôi 3,3v Chân 5 SDA: Chân truyền nhận dữ liệu
Chân 6 SCL: Chân tạo xung clock để giao tiếp dữ liệu
Chân 7 SQW: Tạo tần số dao động xung vuông 1Hz, 4.096Khz, 8.192Khz, 32.768Khz
Chân 8 Vcc: Chân nguồn cung cấp cho DS, khi nguồn cung cấp này mất thì DS vẫn hoạt động chức năng thời gian nhờ vào nguồn nuôi 3,3 volt.
Thanh ghi trong bộ nhớ DS1307: Thanh ghi điều khiển
Hình 10.2 Thanh ghi điều khiển Control Register Bit 7: (Out) Nếu bit SQWE = 0 thì:
Bit OUT = 1, chân 7 (SQW/OUT) sẽ có mức logic 1
Bit 4: (SQWE) Nếu bit SQWE = 1, thì nó cho phép xuất xung vuông trên chân số 7 (SQW/OUT), tần số xung vuông phụ thuộc vào chân RS1, RS0.
Bit 1-0: Dùng chọn tần số dao động trên chân 7 (SQWE/OUT)
Bảng 10. Chọn tần số ngõ ra trên chân SQW
PHỤ LỤC 3
(Điều khiển nhiều led ma trận) 10.1. GIỚI THIỆU VỀ IC THANH GHI DỊCH
10.1.1 Giới thiệu chung
IC NC6B595 là thanh ghi dịch 8 bit vào nối tiếp ra song song và được lưu dữ liệu trong flip – flop D, dữ liệu đưa ra được tác động bởi cạnh lên của xung clock, ngõ ra ở mức thấp và cực C để hở, transistor loại TTL, chịu được áp 15 volt và dòng 200 mA, IC được cấu tạo gồm 3 tầng,
Tầng 1: Chuyển dữ liệu từ nối tiếp ra song song nhờ vào 8 flip – flop D như hình vẽ 10.2, nhờ vào chân CLK.
Tầng 2: Lưu 8 bit dữ liệu vào 8 flip – flop D nhờ vào chân STR như hình 10.2 Tầng 3: Xuất dữ liệu ra bên ngoài nhờ vào chân OE.
10.1.2 Chức năng các chân và nguyên lý hoạt động