intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Kỹ thuật sử dụng Vi điều khiển 8 - bit SG8V1: Phần 2

Chia sẻ: Tieppham Tieppham | Ngày: | Loại File: PDF | Số trang:100

102
lượt xem
13
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu Hướng dẫn sử dụng Vi điều khiển 8 - bit SG8V1 trong phần 2 này sẽ tiếp tục giới thiệu đến các bạn một số hướng dẫn cơ bản về:Inter-Integrated Circuit, ngoại vi UART, ngoại vi ADC, tập lệnh, bộ nhớ chương trình Flash. Mời các bạn tham khảo để nắm bắt những kiến thức hữu ích và học tập tốt hơn.

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật sử dụng Vi điều khiển 8 - bit SG8V1: Phần 2

  1. Ngoại vi I2C 16. Inter-Integrated Circuit (I2C) Ngoại vi I2C hỗ trợ đầy đủ các chức năng của chế độ Master và Slave của chuẩn bus I2C. Nó có thể cấu hình hoạt động với các chức năng sau:  Master và có ngắt có start và stop bit  Master không có ngắt start và stop bit  Slave 10-bit địa chỉ và có ngắt có start và stop bit  Slave 7-bit địa chỉ và có ngắt có start và stop bit  Slave 10-bit địa chỉ không có ngắt có start và stop bit  Slave 7-bit địa chỉ và không có ngắt có start và stop bit Khối I2C có thể hoạt động ở 2 chế độ tốc độ:  Standard mode (100kb/s): tần số xung clock tối thiểu là 1 MHz  Fast mode (400kb/s): tần số xung clock tối thiểu là 4 MHz Hai chân tín hiệu sử dụng cho I2C:  SCL  SDA 16.1. Thanh ghi của I2C Ngoại vi I2C có 6 thanh ghi tất cả. Chúng được dùng chung cho cả Master và Slave 16.1.1. I2CCON1 16.1.1.1. Chế độ Master Bảng 16-1: Mô tả thanh ghi I2CCON1 ở chế độ Master Tên Bit R/W Mô tả I2CON [7] R/W Dùng để tắt/mở I2C (sử dụng chung cho Master và Slave) 0: Tắt I2C 1: Mở I2C © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 99
  2. Ngoại vi I2C Tên Bit R/W Mô tả CBI [6:4] R/W Bit cấu hình thời gian kiểm tra IDLE (xem 16.3.5 Định thời của sự kiện Start) Không sử dụng [3] Lựa chọn chế độ hoạt động của I2CMS [2] R/W I2C: 1: Master 0: Slave Bit cho phép tạo ngắt khi tạo sự ISSE [1] R/W kiện Start, Repeat Start, Stop: 1: cho phép 0: không cho phép Không sử dụng [0] 16.1.1.2. Chế độ Slave Bảng 16-2: Mô tả thanh ghi I2CCON1 ở chế độ Slave Tên Bit R/W Mô tả Tắt/bật khối I2C (dùng chung cho Master và Slave) I2CON [7] R/W 0: tắt khối I2C 1: bật khối I2C Không sử dụng [6:4] R Dùng cho chế độ Master Cho phép nhận general call GCEN [3] R/W 0: bỏ qua general call 1: nhận general call Chế độ của khối I2C là Master hay Slave. I2CMS [2] R/W 0: I2C slave 1: I2C master Cho phép ngắt với bit start và stop ISSE [1] R/W 0: không tạo ra ngắt 1: có tạo ra ngắt © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 100
  3. Ngoại vi I2C Tên Bit R/W Mô tả Lựa chọn độ dài địa chỉ của Slave AMOD [0] R/W 0 = chế độ 7-bit địa chỉ 1 = chế độ 10-bit địa chỉ 16.1.2. I2CCON2 16.1.2.1. Chế độ Master Tên Bit R/W Mô tả Không sử dụng [7] ACKRX [6] R/W Bit ACK/NAK nhận được từ slave 0: ACK 1: NAK ACKTX [5] ACK/NAK cần truyền đến slave 0: ACK 1: NAK ACKEN [4] Bit cho phép truyền ACK/NAK đến slave 1: cho phép 0: không cho phép RCEN [3] R/W Bit cho phép nhận dữ liệu 1: cho phép 0: không cho phép Bit cho phép tạo sự kiện Stop: PEN [2] R/W 1: cho phép 0: không cho phép Bit cho phép tạo sự kiện Repeat RSEN [1] R/W Start: 1: cho phép 0: không cho phép Bit cho phép tạo sự kiện Repeat SEN [0] R/W Start: © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 101
  4. Ngoại vi I2C Tên Bit R/W Mô tả 1: cho phép 0: không cho phép 16.1.2.2. Chế độ Slave Tên Bit R/W Mô tả Kéo dài tín hiệu SCL (chỉ chế độ Slave) (xem mục 16.5 Kéo dài xung clock) CKS [7] R/W 0: Giữ SCL mức thấp (kéo dài SCL), dùng để đảm bảo thời gian cài đặt dữ liệu 1: Thả nổi tín hiệu SCL Không sử dụng [6] R Dùng cho chế độ Master mặt nạ cho địa chỉ của Slave 0: không che các bit tương ứng trong thanh ghi MSK [5:2] R/W CNTL/ADDRL 1: che các bit tương ứng trong thanh ghi CNTL/ADDRL bit mặt nạ trọng số thấp nhất Trong chế độ 7-bit địa chỉ: 0: không che bit địa chỉ 1 CNTL/ADDRL[1] 1: che bit địa chỉ 1 CNTL/ADDRL[1] MSK [1] R/W Trong chế độ 10-bit địa chỉ: 0: không che bit địa chỉ 0 và 1 CNTL/ADDRL[1:0] 1: che bit địa chỉ 0 và 1 CNTL/ADDRL[1:0] cho phép kéo dài đường tín hiệu clock SCL SEN [0] R/W 0: không cho phép 1: cho phép kéo dài xung clock SCL © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 102
  5. Ngoại vi I2C 16.1.3. I2CSTA 16.1.3.1. Chế độ Master Tên Bit R/W Mô tả Không sử dụng [7] P [6] R Bit cho biết quá trình tạo sự kiện Stop hoàn thành. Tự động xóa khi tắt I2C. 0: không tạo sự kiện Stop 1: hoàn thành sự kiện Stop S [5] R Bit cho biết quá trình tạo sự kiện Start hoặc Repeat Start hoàn thành. Tự động xóa khi tắt I2C. 0: không tạo sự kiện Start hoặc Repeat Start 1: hoàn thành sự kiện Start hoặc Repeat Start R/ W [4] R Bit cho biết có phải I2C đang trong quá trình nhận hay không. Tự động xóa khi tắt I2C. 0: không ở quá trình nhận 1: đang ở quá trình nhận Bít dự trữ [3] R I2COV [2] R/W Bit báo tràn bộ đệm. Tự động xóa khi tắt I2C. 0: không tràn bộ đệm 1: tràn bộ đệm Chú ý: Chế độ truyền: không sử dụng Chế độ nhận: Trước đó I2C đã nhận 1 byte dữ liệu nhưng chưa © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 103
  6. Ngoại vi I2C Tên Bit R/W Mô tả được đọc ra. Nếu I2C tiếp tục nhận thêm 1 byte dữ liệu nữa, bộ đệm sẽ bị tràn. Điều này sẽ làm cho bit I2COV bật lên 1 và giá trị bộ đệm I2CBUF sẽ được giữ nguyên. I2CWCOL [1] R/W Bit báo xung đột khi ghi vào bộ đệm. Tự động xóa khi tắt I2C. 0: không xảy ra xung đột 1: có xảy ra xung đột I2CBF [0] R Bit báo bộ đệm đang chứa dữ liệu có nghĩa. Tự động xóa khi tắt I2C. 0: dữ liệu trong bộ đệm không có nghĩa 1: dữ liệu trong bộ đệm có nghĩa 16.1.3.2. Chế độ Slave Tên Bit R/W Mô tả Cho bit là nhận dữ liệu / địa chỉ D/ A [7] R 0: cho biết byte gửi hoặc nhận cuối là địa chỉ 1: cho biết byte gửi hoặc nhận cuối là dữ liệu Bit Stop P [6] R 0: bit Stop không nhận cuối cùng 1: bit Stop được nhận cuối cùng Bit Start S [5] R 0: bit Start không nhận cuối cùng 1: bit Start được nhận cuối cùng Cho biết chiều nhận là đọc/ghi R /W [4] R/W 0: ghi 1:đọc © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 104
  7. Ngoại vi I2C Tên Bit R/W Mô tả Không thực hiện Bit dữ trữ [3] Đọc ra bằng 0 Bộ đệm của I2C bị tràn 0: bộ đệm không tràn I2COV [2] R/W 1: một byte mới vừa nhận trong khi bộ đệm đã đầy (giữ nguyên dữ liệu cũ) Ghi đến bộ đệm I2C bị xung đột 0 = không xung đột I2CWCOL [1] 1 = thanh ghi I2CBUF được ghi vào trong khi nó đang phát nội dung trước đó đi (phải được xóa bởi người sử dụng) Cờ bào đầy cho bộ đệm I2C 0: bộ đệm không đầy I2CBF [0] 1: khi nhận một byte và ghi tới bộ đệm (khối I2C bật) thì bit này được gán lên 1. Bit này tự động bị xóa khi phát xong một byte dữ liệu hoặc thực hiện đọc đến thanh ghi bộ đệm (ICBUF). 16.1.4. CNTH/ADDRH và CNTL/ADDRL Những thanh ghi này dùng chung cho chế độ Master và Slave 16.1.4.1. Chế độ Master R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 CNTH/ADDRH bit 7 bit 0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 CNTL/ADDRL bit 7 bit 0 Tên Bit R/W Mô tả CNTH [7:0] R/W Giá trị dùng để cấu hình thời gian xung SCL ở mức cao © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 105
  8. Ngoại vi I2C Tên Bit R/W Mô tả CNTL [7:0] R/W Giá trị dùng để cấu hình thời gian xung SCL ở mức thấp Người sử dụng ghi giá trị mong muốn vào hai thanh ghi này để cấu hình tốc độ Baud của I2C.  Chế độ Standard: (100Kb/s) a. Thời gian tối thiểu xung SCL ở mức thấp = 4.7 us b. Thời gian tối thiểu xung SCL ở mức cao = 4.0 us Do đó, Giá trị nhỏ nhất của CNTL = 4.7us *(tần số xung clock)Mhz Giá trị nhỏ nhất của CNTH = 4.0us * (tần số xung clock)Mhz Ví dụ, tần số xung clock = 10 Mhz Giá trị nhỏ nhất của CNTL = 4.7 * 10 = 47 Giá trị nhỏ nhất của CNTH = 4.0 * 10 = 40  Chế độ Fast: (400Kb/s) c. Thời gian tối thiểu xung SCL ở mức thấp = 1.3 us d. Thời gian tối thiểu xung SCL ở mức cao = 0.6 us Do đó, Giá trị nhỏ nhất của CNTL = 1.3us *( tần số xung clock)Mhz Giá trị nhỏ nhất của CNTH = 0.6us * (tần số xung clock)Mhz Ví dụ, tần số xung clock = 10 Mhz Giá trị nhỏ nhất của CNTL = 1.3 * 10 = 13 Giá trị nhỏ nhất của CNTH = 0.6 * 10 = 6 16.1.4.2. Chế độ Slave Thanh ghi ADDRH là byte địa chỉ cao của slave I2C. Nó được dùng trong chế độ 10-bit địa chỉ. Trong chế độ 7-bit địa chỉ thanh ghi này không cần quan tâm. Thanh ghi ADDRL là byte địa chỉ thấp của slave I2C. Nội dung của nó được so sánh với byte địa chỉ thấp nhận được từ master I2C. 16.1.5. I2CBUF Tên Bit R/W Mô tả [7:0] R/W Dùng chung cho cả Master và Slave I2CBUF Địa chỉ / dữ liệu nhận/phát © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 106
  9. Ngoại vi I2C Khi phát dữ liệu, người sử dụng phải ghi địa chỉ hoặc dữ liệu cần phát đến bus I2C. Sau khi ghi đến thanh ghi I2CBUF (chỉ khi khối I2C bật), bộ đệm xem như đã đầy và bit I2CBF được gán lên 1. Khi nhận dữ liệu, các bit dữ liệu trên đường tín hiệu SDA sẽ được dịch vào thanh ghi dịch theo đúng trình tự. Đến khi việc nhận hoàn tất, dữ liệu từ thanh ghi dịch sẽ được cập nhật vào thanh ghi I2CBUF. Tại thời điểm này, thanh ghi I2CBUF đang chứa một byte dữ liệu hợp và bit I2CBF được gán lên 1. Một yêu cầu đọc đến thanh ghi I2CBUF sẽ xóa cờ I2CBF. Người sử dụng phải đọc thanh ghi I2CBUF khi nó đầy, nếu không lần nhận byte dữ liệu tiếp sẽ gây ra tràn (cờ I2COV được gán lên 1). Trong trường hợp này, dữ liệu nhận từ lần trước sẽ bị mất. 16.2. Hoạt động Khối I2C được bật bằng cách gán bit I2CON lên 1 (I2CCON1[7]), và người sử dụng sẽ lập trình gái trị thanh ghi I2CCON1 để cấu hình khối I2C:  Master và có ngắt có start và stop bit  Master không có ngắt start và stop bit  Slave 10-bit địa chỉ và có ngắt có start và stop bit  Slave 7-bit địa chỉ và có ngắt có start và stop bit  Slave 10-bit địa chỉ không có ngắt có start và stop bit  Slave 7-bit địa chỉ và không có ngắt có start và stop bit Khi khối I2C được bật, các chân tín hiệu PORT4 và PORT5 sẽ được sử dụng là 2 chân SCL và SDA của chuẩn bus I2C. Để đảm bảo khối hoạt động đúng, điện trở kéo lên phải được gắn vào các chân SCL và SDA ở bên ngoài chip. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 107
  10. Ngoại vi I2C +VDD Rp Rp điện trở kéo lên SDA SCL SCLK DATA SCLK DATA SCLK1 DATA1 SCLK1 DATA1 OUT OUT OUT OUT SCLK DATA SCLK DATA IN IN IN IN THIẾT BỊ 1 THIẾT BỊ 2 Hình 16-1: Kết nối các thiết bị đến bus I2C 16.3. Chế độ Master Người dùng có thể cấu hình I2C ở chế độ Master bằng cách set các bit I2CON, I2CMS trong thanh ghi I2CCON lên 1. Ngoài ra, người dùng còn có thể set hoặc xóa bit ISSE (I2CCON1[1]) để cho phép hoặc cấm ngắt khi tạo ra các bit start/restart và stop. Các sự kiện gây ra ngắt I2CIF (IF2[3]) trong chế độ Master như sau:  Sự kiện Start (nếu cho phép)  Sự kiện Stop (nếu cho phép)  Sự kiện Repeat Start (nếu cho phép)  Khi truyền: sau khi nhận xong ACK/NAK  Khi nhận: sau khi nhận xong một byte dữ liệu Trong chế độ Master, I2C có hai loại hoạt động là Master truyền và Master nhận: 16.3.1. Master Truyền a) Truyền theo kiểu địa chỉ 7-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 108
  11. Ngoại vi I2C MSB LSB ACK/ ACK/ S SLAVE ADDR R/W ACK DATA Sr SLAVE ADDR R/W ACK DATA P NACK NACK 7 bits (n bytes + ack) (n bytes + ack) „0‟-write „0‟-write truyền từ master truyền từ slave Hình 16-2: Khung truyền với địa chỉ 7-bit ở chế độ Master truyền Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 7-bit, người sử dụng nên làm theo các bước sau: 1. Tắt ngoại vi I2C bằng cách xóa bit I2CON 2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và CNTL/ADDRL (xem 16.1.4 CNTH/ADDRH và CNTL/ADDRL). 3. Gán bit I2CMS lên 1 chọn chế độ I2C master 4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc) 5. Gán bit SEN để tạo sự kiện Start 6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị 1‟b0 vào bit thấp nhất của thanh ghi I2CBUF. Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp dữ liệu 8-bit vào thanh ghi I2CBUF để truyền cho slave. Sau khi toàn bộ dữ liệu trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa. Và, I2C sẽ nhận ACK/NAK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 8. Sau khi nhận xong ACK/NACK, cờ ngắt I2CIF sẽ bật lên 1. Người sử dụng có thể kiểm tra xem bit vừa nhận là ACK (0) hay NAK (1) để lựa quyết định sẽ làm gì tiếp theo. Nếu nhận được ACK, người sử dụng có thể thực hiện 1 trong 3 việc sau:  Tiếp tục quá trình truyền bằng cách ghi dữ liệu vào thanh ghi I2CBUF  Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1. Nếu nhận được NAK, người sử dụng có thể thực hiện 1 trong 2 việc sau:  Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 109
  12. Ngoại vi I2C Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được. Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép. b) Truyền theo kiểu địa chỉ 10-bit 11110XX 0 1st BYTE SLAVE ACK/ S R/W ACK 2nd BYTE SLAVE ADDR ACK DATA ADDR NACK „0‟-write (n bytes + ack) truyền từ master 11110XX truyền từ slave 1st BYTE SLAVE ACK/ Sr R/W ACK 2nd BYTE SLAVE ADDR ACK DATA P ADDR NACK „0‟-write (n bytes + ack) Hình 16-3: Khung truyền với địa chỉ 10-bit ở chế độ Master truyền Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 10-bit, người sử dụng nên làm theo các bước sau: 1. Tắt ngoại vi I2C bằng cách xóa bit I2CON 2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và CNTL/ADDRL (xem 16.1.4 CNTH/ADDRH và CNTL/ADDRL). 3. Gán bit I2CMS lên 1 chọn chế độ I2C master 4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc) 5. Gán bit SEN để tạo sự kiện Start 6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị 1‟b0 vào bit thấp nhất của thanh ghi I2CBUF. Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp 8 bit địa chỉ thứ còn lại vào thanh ghi I2CBUF để truyền cho slave. Sau khi toàn bộ địa chỉ trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa. Và, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 8. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng nạp dữ liệu 8-bit vào thanh ghi I2CBUF để truyền cho slave. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 110
  13. Ngoại vi I2C Sau khi toàn bộ dữ liệu trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa. Và, I2C sẽ nhận ACK/NAK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 9. Sau khi nhận xong ACK/NACK, cờ ngắt I2CIF sẽ bật lên 1. Người sử dụng có thể kiểm tra xem bit vừa nhận là ACK (0) hay NAK (1) để lựa quyết định sẽ làm gì tiếp theo. Nếu nhận được ACK, người sử dụng có thể thực hiện 1 trong 3 việc sau:  Tiếp tục quá trình truyền bằng cách ghi dữ liệu vào thanh ghi I2CBUF  Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1. Nếu nhận được NAK, người sử dụng có thể thực hiện 1 trong 2 việc sau:  Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1. Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được. Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép. 16.3.2. Master Nhận a) Nhận theo kiểu địa chỉ 7-bit MSB LSB ACK/ ACK/ S SLAVE ADDR R/W ACK DATA Sr SLAVE ADDR R/W ACK DATA P NACK NACK 7 bits „1‟- read (n bytes + ack) (n bytes + ack) „1‟-read truyền từ master truyền từ slave Hình 16-4: Khung truyền với địa chỉ 7-bit ở chế độ Master nhận Để cấu hình I2C hoạt động ở chế độ Master nhận với địa chỉ 7-bit, người sử dụng nên làm theo các bước sau: 1. Tắt ngoại vi I2C bằng cách xóa bit I2CON 2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và CNTL/ADDRL (xem 16.1.4 CNTH/ADDRH và CNTL/ADDRL) 3. Gán bit I2CMS lên 1 chọn chế độ I2C master 4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc) 5. Gán bit SEN để tạo sự kiện Start 6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị 1‟b1 vào bit thấp nhất của thanh ghi I2CBUF. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 111
  14. Ngoại vi I2C Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). Khi ACK đã nhận xong, cờ ngắt I2CIF sẽ bật lên và bước tiếp theo phải được thực hiện. Nếu không nhận được ACK, người sử dụng có thể khởi động lại hoặc kết thúc quá trình. 7. Gán bit RCEN bit (I2CCON2[3]) lên 1 để cho phép I2C nhận dữ liệu từ Slave (bước này có thể thực hiện ngay sau bước 5 mà không cần đợi cờ I2CIF). Khi 8-bit dữ liệu nhận từ slave đã có trong thanh ghi I2CBUF, cờ I2CBF tự động bật lên 1. Ngay lúc này, cờ I2CIF cũng tự động bật lên và bit RCEN tự động bị xóa bằng phần cứng. 8. Khi cờ I2CIF bật lên, người sử dụng đọc thanh ghi I2CBUF để có được dữ liệu mong muốn. Việc đọc này sẽ làm cho bit I2CBF xóa về 0. 9. Người sử dụng có thể gán hoặc xóa bit ACKTX để lựa chọn NAK hay là ACK sẽ được truyền đi ở bước tiếp theo. Nếu bit ACKTX bằng 0, ACK sẽ được truyền đi. Ngược lại, I2C sẽ truyền NAK. 10. Sau đó, người sử dụng gán bit ACKEN lên 1 để cho phép ACK/NAK đã lựa chọn ở bước 9 có thể truyền lên bus. 11. Tiếp theo, người sử dụng có thể thực hiện một trong các bước sau: Nếu ACK được truyền đi, bước 7, 8, 9, 10, 11 có thể được thực hiện lại để tiếp tục quá trinh nhận. Nếu NAK được truyền đi, người sử dụng có thể làm những việc sau:  Khởi động lại quá trình bằng cách gán bit RSEN lên 1  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.  Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được.  Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép. b) Nhận theo kiểu địa chỉ 10-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 112
  15. Ngoại vi I2C 11110XX „0‟ 11110XX „1‟ 1st BYTE SLAVE 1st BYTE SLAVE ACK/ S R/W ACK 2nd BYTE SLAVE ADDR ACK Sr R/W ACK DATA P ADDR ADDR NACK „0‟-write „1‟-read (n bytes + ack) truyền từ master truyền từ slave Hình 16-5: Khung truyền với địa chỉ 10-bit ở chế độ Master nhận Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 10-bit, người sử dụng nên làm theo các bước sau: 1. Tắt ngoại vi I2C bằng cách xóa bit I2CON 2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và CNTL/ADDRL (xem 16.1.4 CNTH/ADDRH và CNTL/ADDRL). 3. Gán bit I2CMS lên 1 chọn chế độ I2C master 4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc) 5. Gán bit SEN để tạo sự kiện Start 6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị 1‟b0 vào bit thấp nhất của thanh ghi I2CBUF. Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp 8 bit địa chỉ thứ còn lại vào thanh ghi I2CBUF để truyền cho slave. Sau khi toàn bộ địa chỉ trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa. Và, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 8. Sau khi đã nhận xong ACK, người sử dụng gán bit RSEN lên 1 để tạo sự kiện Repeat Start. 9. Đến khi cờ I2CIF bật lên, người sử dụng ghi byte địa chỉ đầu tiên của slave vào các bit cao và giá trị 1 vào bit thấp nhất của thanh ghi I2CBUF. Sau khi thực hiện xong bước 9, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ tự động xóa bằng phần cứng. Tiếp theo, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]). 10. Sau khi ACK đã nhận xong, cờ I2CIF bật lên, người sử dụng gán bit RCEN (I2CCON2[3]) để cho phép I2C nhận dữ liệu từ Slave. Khi 8-bit dữ liệu nhận từ slave đã có trong thanh ghi I2CBUF, cờ I2CBF tự động bật lên 1. Ngay lúc này, cờ I2CIF cũng tự động bật lên và bit RCEN tự động bị xóa bằng phần cứng. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 113
  16. Ngoại vi I2C 11. Khi cờ I2CIF bật lên, người sử dụng đọc thanh ghi I2CBUF để có được dữ liệu mong muốn. Việc đọc này sẽ làm cho bit I2CBF xóa về 0. 12. Người sử dụng có thể gán hoặc xóa bit ACKTX để lựa chọn NAK hay là ACK sẽ được truyền đi ở bước tiếp theo. Nếu bit ACKTX bằng 0, ACK sẽ được truyền đi. Ngược lại, I2C sẽ truyền NAK. 13. Sau đó, người sử dụng gán bit ACKEN lên 1 để cho phép ACK/NAK đã lựa chọn ở bước 12 có thể truyền lên bus 14. Tiếp theo, người sử dụng có thể thực hiện một trong các bước sau: Nếu ACK được truyền đi, bước 10, 11, 12, 13, 14 có thể được thực hiện lại để tiếp tục quá trinh nhận. Nếu NAK được truyền đi, người sử dụng có thể làm những việc sau:  Khởi động lại quá trình bằng cách gán bit RSEN lên 1  Kết thúc quá trình truyền bằng cách gán bit PEN lên 1. Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được. Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép. 16.3.3. Đồng bộ clock Mỗi master đều tạo một clock trên chân SCL riêng. Mặt khác, đường dữ liệu SDA chỉ có nghĩa khi đường SCL ở mức cao. Do đó, đường clock cần phải được đồng bộ với nhau. Việc đồng bộ clock thực hiện bằng cách wired-AND các đường SCL với nhau (xem Hình 16-6). Hình 16-6: Đồng bộ clock 16.3.4. Phân xử Một master chỉ có thể thực hiện quá trình truyền nhận khi bus rảnh. Tuy nhiên, hai hay nhiều master có thể thực hiện sự kiện start cùng lúc. Khi đó, quá trình phân xử sẽ xảy ra trên đường © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 114
  17. Ngoại vi I2C SDA trong lúc đường SCL ở mức cao. Tại thời điểm đó, nếu có một master truyền bit 1 và một master khác truyền bit 0 thì master nào truyền bit 1 sẽ bị mất phân xử. Master nào bị mất phân xử sẽ về trạng thái IDLE. Hình 16-7: Phân xử 16.3.5. Định thời của sự kiện Start Để tạo sự kiện Start, người sử dụng phải gán bit cho phép Start (SEN) lên 1. Khi cả hai SCL và SDA cùng ở mức cao trong khoảng thời gian bằng N lần thời gian SCL ở mức thấp (L: low period), sự kiện Start sẽ được thực hiện. Trong SG8V1, giá trị N có thể được cấu hình thông qua các bit CBI[2:0] trong thanh I2CCON1. CBI[2:0] N 0 1 1 2 2 4 3 6 4 8 5 10 6 12 7 14 Chú thích: - Các bit này chỉ sử dụng trong hệ thống có nhiều master. Vì khi mới cho phép I2C hoạt động, người sử dụng không biết được có một master nào khác đang truy xuất bus không. Người sử dụng dùng các bit này để kéo dài thời gian kiểm tra IDLE trước khi thực hiện sự kiện Start. - Nếu hệ thống chỉ có một master, giá trị này nên là 0. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 115
  18. Ngoại vi I2C Khi sự kiện Start được tạo xong, bit S sẽ bật lên 1 và bit SEN tự động xóa về 0. Việc ghi vào thanh ghi I2CBUF sẽ làm cho cờ I2CBF bật lên. Khi đó, quá trình truyền sẽ bắt đầu. Chú ý: Để đảm bảo I2CBF bằng 0, người sử dụng nên xóa bit này trước khi tạo sự kiện Start. Nếu không, sau khi quá trình Start hoàn thành, nội dung thanh ghi I2CBUF sẽ được truyền lên bus. Khi đó, người sử dụng phải đảm bảo chắc rằng đây chính là nội dung cần truyền. S set bằng phần cưng SEN xóa bằng phần cưng I2CIF bật lên 1 nếu cho phép SDA=1 SCL=1 N*L H L/2 SEN=1 SDA 1st bit 2nd bit L H SCL H : High period L : Low period Hình 16-8: Định thời của quá trình tạo sự kiện Start 16.3.6. Định thời của sự kiện Repeat Start Để tạo sự kiện Repeat Start, người sử dụng phải gán bit RSEN lên 1. Sau khi hoàn thành, bit S sẽ bật lên 1 và bit RSEN tự động xóa về 0. Tại thời điểm này, cờ I2CIF cũng sẽ bật lên nếu cho phép. Chú ý: 1. Trong hệ thống có nhiều master, nếu muốn tạo sự kiện Repeat Start, người sử dụng không được ghi dữ liệu mới vào thanh ghi I2CBUF. Vì một dữ liệu có nghĩa tồn tại trong thanh ghi này sẽ làm cho quá trình truyền tiếp tục diễn ra. Điều nay làm cho việc tạo Repeat Start không thể thực hiện được. 2. Để đảm bảo I2CBF bằng 0, người sử dụng nên xóa bit này trước khi tạo sự kiện Repeat Start. Nếu không, sau khi quá trình Repeat Start hoàn thành, nội dung thanh ghi I2CBUF sẽ được truyền lên bus. Khi đó, người sử dụng phải đảm bảo chắc rằng đây chính là nội dung cần truyền. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 116
  19. Ngoại vi I2C S set bằng phần cưng RSEN xóa bằng phần cưng I2CIF bật lên 1 nếu cho phép SCL=0 RSEN=1 L L H L/2 1st bit 2nd bit SDA L H SCL H : High period L : Low period Hình 16-9: Định thời của quá trình tạo sự kiện Repeat Start 16.3.7. Định thời của sự kiện Stop Để tạo sự kiện Stop, người sử dụng phải gán bit PEN lên 1. Sau khi hoàn thành, bit P sẽ bật lên 1 và bit PEN tự động xóa về 0. Tại thời điểm này, cờ I2CIF cũng sẽ bật lên. Sau khi tạo xong Stop, bus sẽ vào trạng thái IDLE. P set bằng phần cưng PEN=1 PEN xóa bằng phần cưng I2CIF bật lên 1 nếu cho phép L H SDA SCL Hình 16-10: Định thời của quá trình tạo sự kiện Stop 16.3.8. Xung đột bus Khi xảy ra sự kiện xung đột bus. Cờ báo lỗi xung đột I2CBCIF sẽ bật lên 1. a) Xung đột bus khi tạo Start  Trường hợp1: Thời gian SCL được giữ ở mức cao ít hơn thời gian qui định. © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 117
  20. Ngoại vi I2C SDA=1 SCL=1 1.5L H SEN=1 SDA SCL t
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
3=>0