Đề tài Tìm hiểu và lập trình i2c trên pic 16f877a

Tài liệu Đề tài Tìm hiểu và lập trình i2c trên pic 16f877a: BÀI BÁO CÁO: TÌM HIỂU VÀ LẬP TRÌNH I2C TRÊN PIC 16F877A A,HIỂU BIẾT CHUNG VỀ CHUẨN TRUYỀN I2C I.ĐỊNH NGHĨA I2C I2C là tên viết tắt của cụm từ Inter Intergrated Circuit – Bus giao tiếp giữa các IC với nhau. Đây là chuẩn giao tiếp nối tiếp 2 dây . _TÁC DỤNG : Dùng để giao tiếp IC hay thiết bị ngoại vi cần phải giao tiếp với các IC hay thiết bị khác (tức giao tiếp với thế giới bên ngoài). Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau như các loại Vi điều khiển 8051, PIC, AVR, ARM, chíp nhớ như RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tụ (DAC), IC điểu khiển LCD, LED… Hình 1.1. BUS I2C và các thiết bị ngoại vi II,ĐẶC ĐIỂM GIAO TIẾP I2C + Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL). + SDA là đường truyền dữ liệu 2 hướng, còn SCL là đường truyền xung đồng hồ và chỉ theo một hướng . + khi một thiết bị ngoại vi kết nối vào đường I2C thì chân SDA của nó sẽ nối với dây SDA của bus, chân SCL...

doc15 trang | Chia sẻ: hunglv | Lượt xem: 2615 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Đề tài Tìm hiểu và lập trình i2c trên pic 16f877a, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
BÀI BÁO CÁO: TÌM HIỂU VÀ LẬP TRÌNH I2C TRÊN PIC 16F877A A,HIỂU BIẾT CHUNG VỀ CHUẨN TRUYỀN I2C I.ĐỊNH NGHĨA I2C I2C là tên viết tắt của cụm từ Inter Intergrated Circuit – Bus giao tiếp giữa các IC với nhau. Đây là chuẩn giao tiếp nối tiếp 2 dây . _TÁC DỤNG : Dùng để giao tiếp IC hay thiết bị ngoại vi cần phải giao tiếp với các IC hay thiết bị khác (tức giao tiếp với thế giới bên ngồi). Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau như các loại Vi điều khiển 8051, PIC, AVR, ARM, chíp nhớ như RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tụ (DAC), IC điểu khiển LCD, LED… Hình 1.1. BUS I2C và các thiết bị ngoại vi II,ĐẶC ĐIỂM GIAO TIẾP I2C + Một giao tiếp I2C gồm cĩ 2 dây: Serial Data (SDA) và Serial Clock (SCL). + SDA là đường truyền dữ liệu 2 hướng, cịn SCL là đường truyền xung đồng hồ và chỉ theo một hướng . + khi một thiết bị ngoại vi kết nối vào đường I2C thì chân SDA của nĩ sẽ nối với dây SDA của bus, chân SCL sẽ nối với dây SCL. Hình 1.2. Kết nối thiết bị vào bus I2C ở chế độ chuẩn (Standard mode) và chế độ nhanh (Fast mode) * PHẦN CỨNG: Mỗi dây SDA hay SCL đều được nối với điện áp dương của nguồn cấp thơng qua một điện trở kéo lên (pull‐up resistor)điều này là cần thiết vì chân giao tiếp I2C của các thiết bị ngoại vi thường là dạng cực máng hở (open‐drain or open‐collector). Giá trị của các điện trở này khác nhau tùy vào từng thiết bị và chuẩn giao tiếp, thường dao động trong khoảng 1KΩ đến 4.7KΩ. *QUY ƯỚC: + Một thiết bị hay một IC khi kết nối với bus I2C, ngồi một địa chỉ (duy nhất) để phân biệt, nĩ cịn được cấu hình là thiết bị chủ (master) hay tớ (slave). mỗi thiết bị sẽ được nhận ra bởi một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại trong suốt thời gian kết nối. + Trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ (master). Thiết bị chủ nắm vai trị tạo xung đồng hồ cho tồn hệ thống, khi giữa hai thiết bị chủ/tớ giao tiếp thì thiết bị chủ cĩ nhiệm vụ tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trị chủ động, cịn thiết bị tớ giữ vai trị bị động trong viêc giao tiếp. + Mỗi thiết bị cĩ thể hoạt đơng như là thiết bị nhận dữ liệu hay cĩ thể vừa truyền vừa nhận. Hoạt động truyền hay nhận cịn tùy thuộc vào việc thiết bị đĩ là chủ (master) hay tớ(slave). Vì vậy khi cĩ nhiều thiết bị (ICs) cùng được kết nối vào một bus I2C (như hình 1.1), trong quá trình giao tiếp sẽ khơng xảy ra chuyện nhầm lẫn giữa các thiết bị. Hình 1.3. Truyền nhận dữ liệu giữa chủ/tớ + Về dữ liệu truyền trên bus I2C, một bus I2C chuẩn truyền 8‐bit dữ liệu cĩ hướng trên đường truyền với tốc độ là 100Kbits/s – Chế độ chuẩn (Standard mode). Tốc độ truyền cĩ thể lên tới 400Kbits/s – Chế độ nhanh (Fast mode) và cao nhất là 3,4Mbits/s – Chế độ cao tốc (High‐speed mode). + Một bus 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) Dù ở chế độ nào, một giao tiếp I2C đều dựa vào quan hệ chủ/tớ. Giả thiết một thiết bị A muốn gửi dữ liệu đến thiết bị B, quá trình được thực hiện như sau: ‐ Thiết bị A (Chủ) xác định đúng địa chỉ của thiết bị B (tớ), cùng với việc xác định địa chỉ, thiết bị A sẽ quyết định việc đọc hay ghi vào thiết bị tớ ‐ Thiết bị A gửi dữ liệu tới thiết bị B ‐ Thiết bị A kết thúc quá trình truyền dữ liệu Khi A muốn nhận dữ liệu từ B, quá trình diễn ra như trên, chỉ khác là A sẽ nhận dữ liệu từ B. Trong giao tiếp này, A là chủ cịn B vẫn là tớ. III,ĐIỀU KIỆN START ,STOP START và STOP là những điều kiện bắt buộc phải cĩ khi một thiết bị chủ muốn thiết lập giao tiếp với một thiết bị nào đĩ trong mạng I2C.Ban đầu khi chưa thực hiện quá trình giao tiếp, cả hai đường SDA và SCL đều ở mức cao (SDA = SCL = HIGH). Lúc này bus I2C được coi là dỗi (“bus free”), sẵn sàng cho một giao tiếp. Hình 1.4. Điều kiện START và STOP của bus I2C Điều kiện START: là điều kiện khởi đầu, báo hiệu bắt đầu của giao tiếp.Một sự chuyển đổi trạng thái từ cao xuống thấp trên đường SDA trong khi đường SCL đang ở mức cao (cao = 1; thấp = 0) báo hiệu một điều kiện START Điều kiện STOP: báo hiệu kết thúc một giao tiếp. Một sự chuyển đổi trạng thái từ mức thấp lên cao trên đường SDA trong khi đường SCL đang ở mức cao. Cả hai điều kiện START và STOP đều được tạo ra bởi thiết bị chủ. Sau tín hiệu START, bus I2C coi như đang trong trang thái làm việc (busy). Bus I2C sẽ rỗi, sẵn sàng cho một giao tiếp mới sau tín hiệu STOP từ phía thiết bị chủ. Sau khi cĩ một điều kiện START, trong qua trình giao tiếp, khi cĩ một tín hiệu START được lặp lại thay vì một tín hiệu STOP thì bus I2C vẫn tiếp tục trong trạng thái bận. Tín hiệu START và lặp lại START đều cĩ chức năng giống nhau là khởi tạo một giao tiếp. IV,ĐỊNH DẠNG TRUYỀN DỮ LIỆU Dữ liệu được truyền trên bus I2C theo từng bit, bit dữ liệu được truyền đi tại mỗi sườn dương của xung đồng hồ trên dây SCL, quá trình thay đổi bit dữ liệu xảy ra khi SCL đang ở mức thấp. Hình 1.5. Quá trình truyền 1 bit dữ liệu + Mỗi byte dữ liệu được truyền cĩ độ dài là 8 bits. + Số lượng byte cĩ thể truyền trong một lần là khơng hạn chế. + Mỗi byte được truyền đi theo sau là một bit ACK để báo hiệu đã nhận dữ liệu. Đây là điều kiên bắt buộc, nhằm đảm bảo cho quá trình truyền nhận được diễn ra chính xác. Hình 1.6. Dữ liệu truyền trên bus I2C Hình 1.7. Bit ACK trên bus I2C MƠ TẢ VIỆC TRUYỀN: + Bit cĩ trọng số cao nhất (MSB) sẽ được truyền đi đầu tiên, các bít sẽ được truyền đi lần lượt. +Sau 8 xung clock trên dây SCL, 8 bit dữ liệu đã được truyền đi. +Lúc này thiết bị nhận, sau khi đã nhận đủ 8 bít dữ liệu sẽ kéo SDA xuống mức thấp tạo một xung ACK ứng với xung clock thứ 9 trên dây SDA để báo hiệu đã nhận đủ 8 bit. + Thiết bị truyền khi nhận được bit ACK sẽ tiếp tục thực hiện quá trình truyền hoặc kết thúc. + Khi khơng nhận được đúng địa chỉ hay khi muốn kết thúc quá trình giao tiếp, thiết bị nhận sẽ gửi một xung Not‐ACK (SDA ở mức cao) để báo cho thiết bị chủ biết, thiết bị chủ sẽ tạo xung STOP để kết thúc hay lặp lại một xung START để bắt đầu quá trình mới. V,ĐỊNH DẠNG ĐỊA CHỈ THIẾT BỊ Mỗi thiết bị ngoại vi tham gia vào bus i2c đều cĩ một địa chỉ duy nhất, nhằm phân biệt giữa các thiết bị với nhau. Độ dài địa chỉ là 7 – bit, điều đĩ cĩ nghĩa là trên một bus I2C ta cĩ thể phân biệt tối đa 128 thiết bị. Hình 1.8. Cấu trúc byte dữ liệu đầu tiên Khi thiết bị chủ muốn giao tiếp với ngoại vi nào trên bus I2C, nĩ sẽ gửi 7 bit địa chỉ của thiết bị đĩ ra bus ngay sau xung START. Byte đầu tiên được gửi sẽ bao gồm + 7 bit địa chỉ . Mỗi một thiết bị ngoại vi sẽ cĩ một địa chỉ riêng do nhà sản xuất ra nĩ quy định. Địa chỉ đĩ cĩ thể là cố định hay thay đổi. + Bít thứ 8 (R/W) quy định chiều truyền dữ liệu. Nếu bit này bằng “0” cĩ nghĩa là byte dữ liệu tiếp theo sau sẽ được truyền từ chủ đến tớ, cịn ngược lại nếu bằng “1” thì các byte theo sau byte đầu tiên sẽ là dữ liệu từ con tớ gửi đến con chủ. Việc thiết lập giá trị cho bit này do con chủ thi hành, con tớ sẽ tùy theo giá trị đĩ mà cĩ sự phản hồi tương ứng đến con chủ. Hình 1.9. Quá trình truyền dữ liệu Truyền dữ liệu từ chủ đến tớ (ghi dữ liệu): Thiết bị chủ khi muốn ghi dữ liệu đến con tớ, quá trình thực hiện là: ‐ Thiết bị chủ tạo xung START ‐ Thiết bị chủ gửi địa chỉ của thiết bị tớ mà nĩ cần giao tiếp cùng với bit R/W= 0 ra bus và đợi xung ACK phản hồi từ con tớ ‐ Khi nhận được xung ACK báo đã nhận diện đúng thiết bị tớ, con chủ bắt đầu gửi dữ liệu đến con tớ theo từng byte một. Theo sau mỗi byte này đều là một xung ACK. Số lượng byte truyền là khơng hạn chế. ‐ Kết thúc quá trình truyền, con chủ sau khi truyền byte cuối sẽ tạo xung STOP báo hiệu kết thúc. Hình 1.10. Ghi dữ liệu từ chủ đến tớ Truyền dữ liệu từ tớ đến chủ (đọc dữ liệu): Thiết bị chủ muốn đọc dữ liệu từ thiết bị tớ, quá trình thực hiện như sau: ‐ Khi bus rỗi, thiết bị chủ tạo xung START, báo hiệu bắt đầu giao tiếp ‐ Thiết bị chủ gửi địa chỉ của thiết bị tớ cần giao tiếp cùng với bit = 1 và đợi xung ACK từ phía thiết bị tớ ‐ Sau xung ACK dầu tiên, thiết bị tớ sẽ gửi từng byte ra bus, thiết bị chủ sẽ nhận dữ liệu và trả về xung ACK. Số lượng byte khơng hạn chế ‐ Khi muốn kết thúc quá trình giao tiếp, thiết bị chủ gửi xung Not‐ACK và tạo xung STOP để kết thúc. Hình 1.11. Đọc dữ liệu từ thiết bị tớ Quá trình kết hợp ghi và đọc dữ liệu: giữa hai xung START và STOP, thiết bị chủ cĩ thể thực hiện việc đọc hay ghi nhiều lần, với một hay nhiều thiết bị. Để thực hiện việc đĩ, sau một quá trình ghi hay đọc, thiết bị chủ lặp lại một xung START và lại gửi lại địa chỉ của thiết bị tớ và bắt đầu một quá trình mới. Hình 1.12.Quá trình phối hợp đọc/ghi dữ liệu B,CHUẨN GIAO TIẾP I2C TRONG 16F877A RC3/SCK/SCL: chân truyền dẫn xung clock. RC4/SDI/SDA: chân truyền dẫn dữ liệu. Các khối cơ bản trong sơ đồ khối củaI2C không có nhiều khác biệt so với SPI.Tuy nhiên I2C còn có thêm khối phát hiện bit Start và bit Stop của dữ liệu (Start and Stop bit detect) và khối xác định địa chỉ (Match detect). Hình 2.23 Sơ đồ khối MSSP (I2C slave mode). Các thanh ghi liên quan đến I2C bao gồm: Thanh ghi SSPCON và SSPCON2: điều khiển MSSP. Thanh ghi SSPSTAT: thanh ghi chứa các trạng thái hoạt động của MSSP. Thanh ghi SSPBUF: buffer truyền nhận nối tiếp. Thanh ghi SSPSR: thanh ghi dịch dùng để truyền nhận dữ liệu. Thanh ghi SSPADD: thanh ghi chứa địa chỉ của giao diện MSSP. II,THIẾT LẬP I2C 1,Thanh ghi SSPADD: thanh ghi chứa địa chỉ của giao diện MSSP. Ở chế độ Master mode, thanh ghi SSPADD sẽ không được sử dụng để chứa địa chỉ, thay vào đó chức năng của SSPADD là thanh ghi chứa giá trị của BRG giá trị tạo ra tốc độ baud cho xung clock dùng để truyền nhận dữ liệu. +SSPADD ( khởi tạo tốc độ Baud ) VD: Set tốc độ baud của đường truyền: với 100Kb thì SSPADD = 28H Xung giao tiếp nối tiếp sẽ được tạo ra từ BRG (Baud Rate Generator), giá trị ấn định tần số xung clock nối tiếp được lấy từ 7 bit thấp của thanh ghi SSPADD. Khi dữ liệu được đưa vào thanh ghi SSPBUF, bit BF được set và BRG tự động đếm ngược về 0 và dừng lại, pin SCL được giữ nguyên trạng thái trước đó.Khi dữ liệu tiếp theo được đưa vào, BRG sẽ cần một khoảng thời gian TBRG tự động reset lại giá trị để tiếp tục quá trình đếm ngược. Mỗi vòng lệnh (có thời gian TCY ) BRG sẽ giảm giá trị 2 lần. Hình 2.32 Sơ đồ khối BRG (Baud Rate Benerator) của I2C Master mode. Các giá trị cụ thể của tần số xung nối tiếp do BRG tạo ra được liệt kê trong bảng sau: 2, Thanh ghi SSPCON: địa chỉ 14h Thanh ghi điều khiển chuẩn giao tiếp MSSP. Bit 7: WCOL Write Collition Detect bit Khi truyền dữ liệu ở chế độ I2C Master mode: WCOL = 1 đưa dữ liệu truyền đi vào thanh ghi SSPBUF trong khi chế độ truyền dữ liệu của I2C chưa sẵn sàng. WCOL = 0 không xảy ra hiện tượng trên. khi truyền dữ liệu ở chế độ I2C Slave mode: WCOL = 1 dữ liệu mới được đưa vào thanh ghi SSPBUF trong khi dữ liệu cũ chưa được truyền đi. WCOL = 0 không có hiện tượng trên xảy ra. Ở chế độ nhận dữ liệu (Master hoặc Slave):Bit này không có tác dụng chỉ thi các trạng thái. Bit 6: SSPOV Receive Overflow Indicator Flag bit. Khi nhận dữ liệu: SSPOV = 1 dữ liệu mới được nhận vào thanh ghi SSPBUF trong khi dữ liệu cũ chưa được đọc. SSPOV = 0 không có hiện tượng trên xảy ra. Khi truyền dữ liệu: Bit này không có tác dụng chỉ thị các trạng thái. Bit 5: SSPEN Synchronous Serial Port Enable bit SSPEN = 1 cho phép cổng giao tiếp MSSP (các pin SDA và SCL). SSPEN = 0 không cho phép cổng giao tiếp MSSP. Cần chú ý là các pin SDA và SCL phải được điều khiển trạng thái bằng các bit tương ứng trong thanh ghi TRISC trước đó). Bit 4: CKP SCK Release Control bit Ở chế độ Slave mode: CKP = 1 cho xung clock tác động. CKP = 0 giữ xung clock ở mức logic thấp (để bảo đảm thời gian thiết lập dữ liệu). Bit 3,0 :SSPM3:SSPM0 Các bit này đóng vai trò lựa chọn các chế độ hoạt động của MSSP. 1111 : I2C Slave mode 10 bit địa chỉ và cho phép ngắt khi phát hiện bit Start và bit Stop. 1110 : I2C Slave mode 7 bit địa chỉ và cho phép ngắt khi phát hiện bit Start và bit Stop. 1011 : I2C Firmwave Controlled Master mode (không cho phép chế độ Slave). 1000 :I2C Master mode, xung clock = FOSC/(4*(SSPADD+1)). 0111 : I2C Slave mode 10 bit địa chỉ. Các trạng thái không được liệt kê hoặc không có tác dụng điều khiển hoặc chỉ có tác dụng đối với chế độ SPI mode. 3, Thanh ghi SSPCON2: địa chỉ 91h Thanh ghi điều khiển các chế độ hoạt động của chuẩn giao tiếp I2C. Bit 7: GCEN General Call Enable bit GCEN = 1 Cho phép ngắt khi địa chỉ 0000h được nhận vào thanh ghi SSPSR (địa chỉ của chế độ General Call Address). GCEN = 0 Không cho phép chế độ địa chỉ trên. Bit 6: ACKSTAT Acknowledge Status bit (bit này chỉ có tác dụng khi truyền dữ liệu ở chế độ I2C Master mode). ACKSTAT = 1 nhận được xung từ I2C Slave. ACKSTAT = 0 chưaq nhận được xung . Bit 5: ACKDT Acknowledge Data bit (bit này chỉ có tác dụng khi nhận dữ liệu ở chế độ I2C Master mode). ACKDT = 1 chưa nhận được xung . ACKDT = 0 Đã nhận được xung . Bit 4: ACKEN Acknowledge Sequence Enable bit (bit này chỉ có tác dụng khi nhận dữ liệu ở chế độ I2C Master mode) ACKEN = 1 cho phép xung xuất hiện ở 2 pin SDA và SCL khi kết thúc quá trình nhận dữ liệu. ACKEN = 0 không cho phép tác động trên. Bit 3: RCEN Receive Enable bit (bit này chỉ có tác dụng ở chế độ I2C Master mode). RCEN = 1 Cho phép nhận dữ liệu ở chế độ I2C Master mode. RCEN = 0 Không cho phép nhận dữ liệu. Bit 2: PEN Stop Condition Enable bit PEN = 1 cho phép thiết lập điều kiện Stop ở 2 pin SDA và SCL. PEN = 0 không cho phép tác động trên. Bit 1: RSEN Repeated Start Condition Enable bit RSEN = 1 cho phép thiết lập điều kiện Start lặp lại liên tục ở 2 pin SDA và SCL. RSEN = 0 không cho phép tác động trên. Bit 0: SEN Start Condition Enable/Stretch Enable bit Ở chế độ Master mode: SEN = 1 cho phép thiết lập điều kiện Start ở 2 pin SDA và SCL. SEN = 0 không cho phép tác động trên. Ở chế độ Slave mode: SEN = 1 cho phép khóa xung clock từ pin SCL của I2C Master. Không cho phép tác động trên. 4, Thanh ghi SSPSTAT: địa chỉ 94h Thanh ghi chứa các bit trạng thái của chuẩn giao tiếp MSSP. + Chọn baud chuẩn với 100Kb thì SMP =1 Bit 7 SPM Slew Rate Control bit SPM = 1 dùng tốc độ chuẩn (100 KHz và 1 MHz). SPM = 0 dùng tốc độ cao ( 400 KHz). Bit 6 CKE MSBus Select bit CKE = 1 cho phép MSBus. CKE = 0 không cho phép MSBus. Bit 5: bit I2C Master mode: không quan tâm. = 1 byte vừa truyền đi hoặc nhận được là dữ liệu. = 0 byte vừa truyền đi hoặc nhận được là địa chỉ. Bit 4: P Stop bit P = 1 vừa nhận được bit Stop. P = 0 chưa nhận được bit Stop. Bit 3: S Start bit S = 1 vừa nhận được bit Start. S = 0 chưa nhận được bit Start. Bit 2: bit information I2C Slave mode: = 1 đọc dữ liệu. = 0 ghi dữ liệu. I2C Master mode: = 1 đang truyền dữ liệu. = 0 không truyền dữ liệu. Bit 1: UA Update Address Bit này chỉ có tác dụng đối với chế độ I2C Slave mode10 bit địa chỉ. UA = 1 vi điều khiển cần cập nhật thêm địa chỉ từ thanh ghi SSPADD. UA = 0 không cần cập nhật thêm địa chỉ. Bit 0: BF Buffer Full Status bit BF = 1 Thanh ghi SSPBUF đang chứa dữ liệu truyền đi hoặc nhận được. BF = 0 thanh ghi SSPBUF không có dữ liệu.

Các file đính kèm theo tài liệu này:

  • docBÀI BÁO CÁO I2C.doc