- Để thành lập truyền thông các chân sau được sử dụng: + Ngõ ra dữ liệu nối tiếp SDO: RC5/SDO.. - Các bit điều khiển SSPCON1 và SSPSTAT cho phép xác định: + Chế độ chủ SCK là ngõ ra xun
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
THÀNH PHỐ HỒ CHÍ MINH
ĐỀ TÀI NCKH CẤP SINH VIÊN
NGHIÊN CỨU CHUẨN GIÁO TIẾP SPI, I2C, UART CỦA PIC 16F877A - THI CÔNG MẠCH GIAO TIẾP
MÃ SỐ: SV53 - 2008
S 0 9
S KC 0 0 2 3 0 1
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM
NGHIÊN CỨU KHOA HỌC CẤP SINH VIÊN
ĐỀ TÀI:
MÃ SỐ: SV53_2008
THUỘC NHĨM NGÀNH : KHOA HỌC KỸ THUẬT
CHỦ NHIỆM ĐỀ TÀI : CHÂU TUẤN HỒNG
NGƯỜI THAM GIA : NGUYỄN TẤN HÕA
TRỊNH VĂN DUY
TP HỒ CHÍ MINH THÁNG 12 NĂM 2008
Trang 3MỤC LỤC
PHẦN 1: ĐẶT VẤN ĐỀ - 2
I LÝ DO CHỌN ĐỀ TÀI - 2
II ĐỐI TƯỢNG NGHIÊN CỨU - 2
III TÌNH HÌNH NGHIÊN CỨU CỦA ĐỀ TÀI - 3
PHẦN 2: GIẢI QUYẾT VẤN ĐỀ - 3
I MỤC ĐÍCH NGHIÊN CỨU - 3
II PHƯƠNG PHÁP NGHIÊN CỨU - 3
III NỘI DUNG NGHIÊN CỨU - 4
3.1 Tổng quan về họ vi điều khiển PIC - 4
3.2 Sơ lược về vi điều khiển PIC 16F877A - 4
3.3 Tập lệnh của vi điều khiển PIC 16F877A - 6
3.4 Khối Port nối tiếp đồng bộ chủ ( MSSP) - 7
3.4.1 Chuẩn giao tiếp SPI của vi điều khiển PIC 16F877A - 8
3.4.2 Chuẩn giao tiếp I2C của vi điều khiển PIC 16F877A - 13
3.5 Chuẩn giao tiếp UART của vi điều khiển PIC 16F877A - 21
3.6 Mạch giao tiếp SPI, I2C, UART - 26
IV KẾT QUẢ ĐẠT ĐƯỢC - 27
4.1 Tính khoa học - 27
4.2 Tính thực tiễn - 27
4.3 Hiệu quả kinh tế - 27
PHẦN 3: KẾT LUẬN VÀ KHUYẾN NGHỊ - 28
I KẾT LUẬN - 28
II KHUYẾN NGHỊ - 28
PHẦN 4: TÀI LIỆU THAM KHẢO - 29
Trang 4Microchip là một nhà sản xuất chip điên tử hàng đầu trên thế giới, trong những năm gần đây họ đã cho ra đời những dòng vi điều khiển cực mạnh như dòng PIC, dòng dsPIC Trong dòng vi điều khiển PIC thì họ PIC16 là một họ vi điều khiển 8bit khá mạnh và khá phổ biến
Với mong muốn có thêm kiến thức về họ vi điều khiển PIC16 cho bản thân mình và phần nào giúp mọi người có thể hiểu rõ hơn họ vi điều khiển này, bên cạnh sự hướng dẫn
của Thầy Ths NGUYỄN ĐÌNH PHÖ và những kiến thức về vi điều khiển đã được học ở trường, em đã chọn đề tài nghiên cứu khoa học cấp sịnh viên là: “NGHIÊN CỨU
CHUẨN GIAO TIẾP SPI, I2C, UART CỦA PIC 16F877A – THI CÔNG MẠCH GIAO TIẾP”
II ĐỐI TƢỢNG NGHIÊN CỨU
- Vi điều khiển PIC 16F877A
- Chuẩn giao tiếp SPI, I2C, UART
- Bộ thí nghiệm cho PIC 16F877A
- Một số chương trình thí nghiệm cho PIC 16F877A
- Phần mềm biên dịch và sọan chương trình cho PIC 16F877A: MPLAB, PIC C Compiler (CCS)
Trang 5III TÌNH HÌNH NGHIÊN CỨU CỦA ĐỀ TÀI
Hiện nay ở nước ta, dòng vi điều khiển PIC16 đã được sử dụng nhiều và ngày càng phổ biến, để góp phần bổ sung thêm các ứng dụng của Pic nên nhóm muốn nghiên cứu các ứng dụng truyền dữ liệu của Pic
- Sử dụng được phần mềm MPLAB hoặc phần mềm PIC C Compiler (CCS) để soạn
và biên dich chương trình cho PIC 16F877A
- Sử dụng được phần mềm WinPic 800 để nạp chương trình cho PIC 16F877A
- Viết các chương trình truyền dữ liệu cho PIC 16F877A theo các chuẩn giao tiếp SPI, I2C, UART
II PHƯƠNG PHÁP NGHIÊN CỨU
- Tham khảo và dịch tài liệu: tìm hiểu kiến thức cơ bản về PIC 16F877A và về các chuẩn giao tiếp SPI, I2C, UART
- Thi công mạch và thực hành: thi công mạch giao tiếp đối với các chuẩn giao tiếp SPI, I2C, UART cho vi điều khiển PIC 16F877A Viết các chương trình thí nghiệm về các chuẩn giao tiếp
Trang 6III NỘI DUNG NGHIÊN CỨU
1 Tổng quan về họ vi điều khiển PIC
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip Technology
Dòng PIC đầu tiên là PIC1650 được phát triển bởi Microelectronics Division thuộc General Instrument Lúc này, PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16bit CP1600 CP1600 là một CPU tốt, nhưng lại kém về các hoạt động xuất nhập, và vì vậy PIC 8-bit được phát triển vào khoảng năm 1975 để hỗ trợ hoạt động xuất nhập cho CP1600 PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động) Năm
1985 General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu mới hủy bỏ hầu hết các dự án - lúc đó đã quá lỗi thời Tuy nhiên PIC được bổ sung EEPROM để tạo thành 1 bộ điều khiển vào ra khả trình Ngày nay rất nhiều dòng PIC được xuất xưởng với hàng loạt các module ngoại vi tích hợp sẵn (như USART, PWM, ADC ), với bộ nhớ chương trình từ 512 Word đến 32K Word
2 Sơ lƣợc về vi điều khiển PIC 16F877A
- Sơ đồ chân loại PDIP 40 chân:
Trang 7Giao tiếp nối tiếp MSSP, USART
Giao tiếp song song PSP
Module A/D 10bit 8 kênh ngõ vào
Trang 83 Tập lệnh của vi điều khiển PIC 16F877A
Khung định dạng chung cho các lệnh:
Trang 9 Bảng tốm tắt các lệnh của PIC 16F877A
4 Khối Port nối tiếp đồng bộ chủ ( MSSP)
Khối MSSP có thể hoạt động ở một trong hai chế độ sau:
+ Serial Peripheral Interface (SPI)
+ Inter – Intergrate Curcuit (I2C)
Cả hai chế độ trên đều hoạt động truyền dữ liệu nối tiếp
Trang 10 Khối MSSP có 3 thanh ghi là: thanh ghi trạng thái (SSPSTAT), hai thanh ghi điều khiển (SPPCON1 và SPPCON2)
4.1 Chuẩn giao tiếp SPI của vi điều khiển PIC 16F877A
Sơ đồ khối MSSP ở chế độ SPI:
Trang 11- Chế độ SPI cho phép 8bit dữ liệu được truyền và phát đồng bộ một cách đồng thời
- Để thành lập truyền thông các chân sau được sử dụng:
+ Ngõ ra dữ liệu nối tiếp (SDO): RC5/SDO
+ Ngõ vào dữ liệu nối tiếp (SDI): RC4 /SDI/SDA
+ Xung clock nối tiếp (SCK): RC3 /SCK/SCL
Khi hoạt động trong chế độ slave, chân thứ tư có thể được sử dụng:
+ Lựa chọn slave (SS): RA5/AN4/SS
- Có 4 thanh ghi cần quan tâm trong chế độ SPI:
+ Thanh ghi điều khiển 1 MSSP (SSPCON1)
+ Thanh ghi trạng thái MSSP (SSPSTAT)
+ Thanh ghi nhận nối tiếp/ đệm phát (SSPBUF)
+ Thanh ghi dịch MSSP (SSPSR) – không thể truy xuất trực tiếp
- Các bit điều khiển SSPCON1<5:0> và SSPSTAT<7:6> cho phép xác định:
+ Chế độ chủ ( SCK là ngõ ra xung clock)
+ Chế độ tớ ( SCK là ngõ vào xung clock)
+ Cực tính xung clock (trạng thái chờ SCK)
+ Pha lấy mẫu dữ liệu ngõ vào ( ở giữa hay cuối thời điểm dữ liệu ngõ ra)
+ Cạnh xung clock (dữ liệu ngõ ra ở cạnh lên hay cạnh xuống của SCK)
+ Tốc độ xung clock (chỉ ở chế độ chủ)
+ Chế độ lựa chọn slave ( chỉ ở chế độ tớ)
HOẠT ĐỘNG
- Thanh ghi SSPSR dịch dữ liệu vào và ra, đầu tiên là bit MSB
- Sau khi nhận đủ 8 bit dữ liệu thì byte dữ liệu được chuyển đến thanh ghi SSPBUF Sau đó bít báo bộ đệm đầy BF ( SSPSTAT<0>) và cờ ngắt SSPIF lên mức 1
- Trong khi truyền/nhận dữ liệu thì bất kỳ việc ghi dữ liệu nào vào thanh ghi SSPBUF
sẽ bị bỏ qua và bit WCOL (SSPCON1<7>) sẽ được set Do đó người lập trình phải xóa bit WCOL để cho những lần ghi dữ liệu tiếp theo
- SSPBUF nên được đọc trước khi ghi byte dữ liệu tiếp theo vào nó Khi đọc SSPBUF được đọc thì bit BF được xóa
Trang 12 CHẾ ĐỘ CHỦ: Thiết bị chủ có thể khởi tạo việc truyền dữ liệu bất cứ lúc nào vì nó điều khiển xung clock (SCK) Trong chế độ chủ dữ liệu được truyền hoặc nhận ngay khi
dữ liệu được ghi vào thanh ghi SSPBUF
Trong chế độ SPI, tốc độ xung clock (tốc độ bit) do người lập trình lựa chọn một trong các tốc độ sau:
CHẾ ĐỘ TỚ: Trong chế độ tớ, dữ liệu được truyền và nhận khi có sự xuất hiện cạnh xung clock từ bên ngoài trên chân SCK Khi bit cuối cùng được chốt thì cơ ngắt SSPIF (PIR1<3>) được set
CHO PHÉP SPI I/O
- Cho phép SPI: set bit SSPEN ( SSPCON1<5>)
- Reset hay định cấu hình lại: xóa bit SSPEN rồi khởi tạo lại và set SSPEN
- Định chức năng cho các chân:
+ SDI: được điều khiển tự động bởi module SPI
+ SDO: phải xóa TRISC<7>
+ SCK (chế độ chủ): phải xóa TRISB<1>
+SCK (chế độ tớ): phải set TRISB<1>
+ SS: phải set TRISA<5>
Trang 13KẾT NỐI MASTER- SLAVE
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
// khoi rao spi
while (1)
{
spi_write(dig[value]); // ghi value den spi
value++; // tang value
Trang 14setup_spi(spi_slave | spi_h_to_l | spi_ss_disabled);
// khoi tao spi
output_D(value); // xuat value ra portD
output_bit(pin_B0,0); // cho hien thi
}
Trang 154.2 Chuẩn giao tiếp I2C của vi điều khiển PIC 16F877A
Sơ đồ khối MSSP ở chế độ I2C tớ:
Sơ đồ khối MSSP ở chế độ I2C chủ:
Trang 16- Chế độ I2C có thể hoạt động ở nhiều chế độ khác nhau:
Một chủ một tớ (one master – one slave)
Một chủ nhiều tớ (one master – multi slave)
Nhiều chủ nhiều tớ (Multi master – multi slave)
- Khi truyền dữ liệu đáp ứng ngắt ở Start bit và Stop bit để biết khi nào đường Bus rảnh
- Hai chân được sử dụng để truyền:
+ Xung clock nối tiếp (SCL): RC3 /SCK/SCL
+ Dữ liệu nối tiếp (SDA): RC4/SDI/SDA
- Chân SCL và SDA phải có điện trở kéo lên nguồn
- Có 6 thanh ghi cần quan tâm trong chế độ hoạt động I2C:
+ Thanh ghi điều khiển 1 MSSP (SSPCON1)
+ Thanh ghi điều khiển 2 MSSP (SSPCON2)
+ Thanh ghi trạng thái MSSP (SSPSTAT)
+ Thanh ghi nhận nối tiếp/ đệm phát (SSPBUF)
+ Thanh ghi dịch MSSP (SSPSR): dịch dữ liệu vào/ra – không thể truy xuất trực tiếp + Thanh ghi định địa chỉ MSSP (SSPADD): trong chế độ tớ thì chứa địa chỉ thiết bị tớ, trong chế độ chủ thì 7bit thấp hoạt động như bộ phát tốc độ Baud nạp lại giá trị
HOẠT ĐỘNG
- Cho phép: set bit SSPEN (SSPCON1<5>)
- 4 bit lựa chọn chế độ SSPCON1<3:0> cho phép một trong những chế độ I2C sau được chọn:
+ Chế độ chủ
+ Chế độ tớ (định địa chỉ 7bit)
+ Chế độ tớ (định địa chỉ 10bit)
Trang 17+ Chế độ tớ (định địa chỉ 7bit), cho phép ngắt ở bit Start và bit Stop
+ Chế độ tớ (định địa chỉ 10bit), cho phép ngắt ở bit Start và bit Stop
+ Chế độ master điều khiển Firmware, slave chờ
CHẾ ĐỘ TỚ:
- Chân SCL và SDA được định cấu hình là ngõ vào
- Phần cứng luôn tạo ra một ngắt trên một kết nối địa chỉ
- Khi một địa chỉ được kết nối hoặc dữ liệu truyền đi sau một sự kết nối địa chỉ được nhận, thì phần cứng phát ra xung ACK một cách tự động, xung này do bên nhận kéo đường SDA xuống mức thấp để báo cho biết đã nhân đủ 8bit Và chuyển giá trị hiện thời trong thanh ghi SSPSR vào thanh ghi SSPBUF
- ACK không được phát ra trong các điều kiện sau:
+ Bô đệm đầy, bit BF (SSPSTAT<0>) được set trước khi dữ liệu truyền đi được nhận +Bit báo tràn SSPOV (SSPCON1<6>) được set trước khi dữ liệu truyền đi được nhận
- Trong trường hợp này,nội dung SSPSR không chuyển vào SSPBUF, nhưng bit SSPIF (PIR<3>) được set
- Bit BF được xóa bằng cách đọc thanh ghi SSPBUF, trong khi SSPOV được xóa bằng phần mềm
chỉ, bit BF, bit SSPOV được xóa thì các sự kiện sau xảy ra:
1.Giá trị trong SSPSR được chuyển vào SSPBUF
2.Bit BF được set
3.Xung ACK được phát ra
Trang 184.Bit ngắt SSP được set (nếu cho phép) ở cạnh xuống xung thứ 9 của xung clock (SCL)
- Trong chế độ 10bit, slave cần nhận 2byte địa chỉ 5bit cao (MSbs) của byte thứ nhất xác định đây có phải là 10bit địa chỉ hay không Bit R/W ( SSPSTAT<2>) phải phải xác định một sự kiện ghi thì thiết bị slave sẽ nhận byte địa chỉ thứ 2
Đối với 10 bit địa chỉ thì byte thứ nhất sẽ là ‘11110 A9 A8 0’ , A9 và A8 là 2 MSbs của địa chỉ
Các sự kiện với 10 bit địa chỉ, bước 7 đến bước 9 giành cho bộ phát tớ:
1.Nhận byte thứ nhất (high) của địa chỉ ( bit BF, bit SSPIF, bit UA (SSPSTAT<1>) được set
2.Cập nhật SSPADD với byte thứ hai (low) của địa chỉ (xóa bit UA và cách li đường SCL)
3.Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF)
4.Nhận byte thứ hai (low) của địa chỉ ( bit BF, bit SSPIF, bit UA (SSPSTAT<1>) được set.)
5.Cập nhật SSPADD với byte thứ nhất (high) của địa chỉ (nếu cách li đường SCL thì UA được xóa)
6.Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF)
7.Nhận điều kiện Start lặp lại
8 Nhận byte thứ nhất (high) của địa chỉ ( bit BF, bit SSPIF được set.)
9 Đọc thanh ghi SSPBUF (xóa bit BF và bit SSPIF)
- Bit định hướng dữ liệu R/W của byte dữ liệu:
+ Nhận: R/W = 0 truyền từ chủ đến tớ
+ Truyền: R/W=1 truyền từ tớ đến chủ
CHẾ ĐỘ CHỦ:
- Cho phép bằng các bit SSPM trong SSPCON1
- Các chân SDA , SCL được điều khiển bằng phần cứng của MSSP
- Khi chế đọ Master được cho phép, người sử dụng có 6 tùy chọn
1.Xác nhận 1 điều kiện Start trên SDA và SCL
Trang 192.Xác nhận 1 điều kiện Start lặp lại trên SDA và SCL
3.Ghi vào thanh ghi SSPBUF dữ liệu/địa chỉ truyền khởi đầu
4.Định cấu hình port I2C để nhận dữ liệu
5.Phát tín hiệu ACK sau khi nhận 1 byte dữ liệu
6 Phát 1 điều kiện Stop trên SDA và SCL
- Các sự kiện sau sẽ làm cho bit SSPIF được set:
+ Điều kiện Start
+ Điều kiện Stop
+ Truyền dữ liệu byte truỳên/nhận
+ Truyền ACK
+ Điều kiện Start lặp lại
Hoạt động
- Thiết bị chủ tạo ra xung clock nối tiếp, điều kiện Start, Stop
- Trong chế độ master truyền, SDA là ngõ ra dữ liệu nối tiếp, SCL là ngõ ra xung clock nối tiếp Byte đầu tiên chứa 7 bit địa chỉ thiết bị tớ và 1 bit R/W=0 Dữ liệu nối
tiếp được truyền 8 bit 1 lầnvà sau mỗi byte được truyền thì nhận 1bit ACK
- Trong chế độ master nhận, byte được truyền đầu tiên chứa 7 bit địa chỉ thiết bị tớ và
1 bit R/W=1 Dữ liệu nối tiếp được nhận qua SDA, trong khi SCL vẫn là ngõ ra xung clock nối tiếp Dữ liệu nối tiếp được nhận 8bit 1lần và sau mỗi byte dữ liệu được
nhận thì truyền bit ACK
3 Người dùng nạp địa chỉ Slave để truyền vào SSPBUF
4 Địa chỉ được dich ra chân SDA cho đến khi 8 bit được truyền
5 Module MSSP dịch vào bit ACK từ thiết bị slave và ghi nó vào SSPCON2<6>
6 Module MSSP phát ra ngắt ở cuối chu kỳ xung clock (SCL) thứ 9, bằng cách set SSPIF
Trang 207 Người dùng nạp 8 bit dữ liệu vào SSPBUF
8 Dữ liệu được dich ra chân SDA cho đến khi 8 bit được truyền
9 Module MSSP dịch vào bit ACK từ thiết bị slave và ghi nó vào SSPCON2<6>
10 Module MSSP phát ra ngắt ở cuối chu kỳ xung clock (SCL) thứ 9, bằng cách set SSPIF
11 Người dùng phát ra điều kiện Stop bằng cách set bit cho phép Stop, PEN (SSPCON2<2>)
12 Ngắt được phát ra khi điều kiện Stop hoàn thành
i2c_start(); // dieu kien start
i2c_write(SLAVE_ADDRESS); // ghi dia chi slave
i2c_write(a); //ghi du lieu
i2c_stop(); // dieu kien stop
Trang 22state = i2c_isr_state(); //trang thai i2c
if(state < 0x80) // neu dang ghi thi doc du lieu
enable_interrupts(GLOBAL); // cho phep ngat toan cuc
enable_interrupts(INT_SSP); // cho phep ngat ssp
set_tris_D(0);
set_tris_C(0);
while(1)
{
Trang 23output_bit(pin_C0,0); // cho hien thi
}
}
5 Chuẩn giao tiếp UART của vi điều khiển PIC 16F877A
Trong PIC16F877A có tất cả 5 thanh ghi cho quá trình điều khiển UART Trong đó có 2
thanh ghi chức năng TXSTA, RCSTA, 2 thanh ghi dữ liệu RCREG, TXREG., và thanh
ghi tốc độ Baud: SPBRG
Thanh ghi TXSTA (address 98h):
R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R-1 R/W-0
CSRC TX9 TXEN SYNC - BRCH TRMT TX9D
CSRC - bit lựa chọn nguồn xung clock
TX9 - chọn chế độ truyền 9 bit: (=1: 9 bit, =0: 8 bit)
TXEN - cho phép truyền
SYNC - chọn chế độ truyền đồng bộ hay không đồng bộ: (=1: đồng
bộ, =0: không đồng bộ)
BRGH - chọn chế độ truyền cao hay thấp =1 HIGH, =0: LOW)
TRMT - bit báo trạng thái của bộ đệm: =1: TSR rỗng(dữ liệu đã được
truyền xong), =0: TSR đầy (dữ liệu còn trong bộ đệm của UART)
TX9D - giá trị của bít thứ 9 trong chế độ truyền 9 bit Bit này có thể dùng
lưu bit Parity
Thanh ghi RCSTA:
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-0
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D