BÀI 11 : I2C VỚI IC DS1307 .


  1. CƠ SỞ LÝ THUYẾT.
  2. I2C – Inter- Intergrated Circuit là chuẩn truyền thông 2 dây gồm 1 dây Clock và 1 dây Data dùng chung cho quá trình truyền nhận được phát minh bởi Philips. Chuẩn I2C cũng trở nên thông dụng với nhiều module, IC sử dụng như :IC nhớ(24LCxxx), cảm biến góc nghiêng(MPU6050), module giao tiếp LCD(dùng IC PCF8574), IC thời gian thực(DS1307)… So với UART tốc độ của I2C có vẻ nhỉnh hơn 1 chút, ở mức thông thường là 100Khz. Ở các mode còn lại thì tốc độ cao hơn. Khi giao tiếp I2C với 1 IC nào đó cần chú ý : địa chỉ của Ic đó để giao tiếp, giao tiếp với tốc độ bao nhiêu, bao nhiêu bit.

    Trên STM8S003F3P6 thì có 1 bộ giao tiếp I2C ở chân PB4,PB5. 2 chân này cũng được thiết kế đặc biệt chuyên dụng cho I2C nên khi output ở mức cao, Điện áp trên chân này đo được là =0V. Các tính năng chính của I2C trên STM8S003F3P6:

    • Có 2 tốc độ là 100Khz và 400khz.
    • Có 2 mode sử dụng là mode master và mode slave.
    • Có các cờ báo trạng thái và cờ báo lỗi.
    • Có 3 chế độ ngắt là ngắt giao tiếp, ngắt khi có lỗi xảy ra, ngắt từ chế độ ngủ/nghỉ.

    STM8S003F3P6 không có bộ thời gian thực(STM32 có bộ thời gian thực) nên chúng ta phải dùng thêm IC DS1307 để có được bộ thời gian thực. Một vài chức năng của DS1307:

    • Có các thanh ghi chứa giờ, phút, giây, thứ, ngày, tháng, năm và năm thừa.
    • 56 byte, có thể lưu dữ data trong RAM nên không sợ bị mất data khi mất nguồn(chân Vbat phải được gắn pin).
    • Giao tiếp I2C, có chế độ tự kiểm tra nguồn vào.
    • Dòng tiêu thụ thấp.
  3. Sơ đồ kết nối.
  4. SƠ ĐỒ KẾT NỐI:

    • Chân VCC của DS1307 nối chân +5V của vi điều khiển.
    • Chân GND của DS1307 nối chân GND của vi điều khiển.
    • Chân SDA của DS1307 nối chân PB5 của vi điều khiển.
    • Chân SCL của DS1307 nối chân PB4 của vi điều khiển.

    LƯU Ý PHẦN CỨNG:

    • Cần có thạch anh ngoài và pin ở chân VBAT(chắc chắn là còn sử dụng được).
    • Khi thiết kế cần có điện trở kéo nguồn ở 3 chân : SCL, SDA,OUT(nếu chân này sử dụng) nếu không sẽ không giao tiếp được - tham khảo thêm trong Datasheet.
    • Địa chỉ của IC này là 0xD0. Khi cấp nguồn thì VCC > 1.25xVbat thì IC mới hoạt động VD : pin ở chân VBAT = 3v thì VCC > 3.75V.
    • Kết nối trược tiếp SCL(PB4-VĐK) nối SCL(DS1307), SDA(PB5-VĐK) nối SDA(DS1307) – giao tiếp UART thì cần đấu chéo.
  5. Cấu hình dùng thư viện chuẩn của ST.
    1. Cấu hình chương trình con I2C với tốc độ chuẩn – nằm trong file ds1307.c.
    2. Cấu hình chương trình để set thời gian cho IC DS1307 – nằm trong file ds1307.c
    3. Thư viện này mình sưu tầm được trên mạng, đã test và chạy ổn đinh. Tóm tắt quá trình set thời gian cho IC DS1307 như sau:

      • Chuyển đổi tất cả các data cần ghi sang số BCD vì thời gian được lưu trên các thanh ghi của DS1307 là giá trị số BCD.
      • Chờ cho giao thức I2C trên IC được sẵn sang. MCU sẽ gửi tín hiệu để bắt đầu giao tiếp.
      • MCU gửi địa chỉ để giao tiếp với IC DS1307 ở đây là 0xD0, và chờ các cờ thông báo, cờ trạng thái báo là đã truyền xong và không có lỗi xảy ra.
      • MCU gửi địa chỉ bắt đầu để ghi giá trị: bắt đầu từ địa chỉ của thanh ghi giây(seconds = 0x00) và chờ cờ báo là đã ghi xong.
      • MCU gửi giá trị giây cần set và chờ cờ báo đã gửi xong.
      • Tiếp theo tương tự cho các giá trị set phút, giờ… cho đến hết giá trị cần ghi.
      • MCU sẽ gửi tín hiệu thông báo là sẽ kết thúc ghi dữ liệu và xóa các cờ báo rỗi.
    4. Cấu hình chương trình con để đọc thời gian về – nằm trong file ds1307.c.
    5. Tóm tắt quá trình đọc dữ liệu trả về như sau:

      • Chờ cho giao thức I2C trên IC được sẵn sàng. MCU sẽ gửi tín hiệu để bắt đầu giao tiếp.
      • MCU gửi địa chỉ để giao tiếp với IC DS1307 ở đây là 0xD0, và chờ các cờ thông báo, cờ trạng thái báo là đã truyền xong và không có lỗi xảy ra.
      • MCU gửi địa chỉ của thanh ghi cần đọc giá trị và chờ chờ báo là đã xong.
      • Bộ I2C của MCU restart và gửi tín hiệu bắt đầu mới và gửi địa chỉ của DS1307 = 0xD0 để bắt đầu quá trình đọc. Lúc này SDA sẽ là dữ liệu được trả về từ DS1307. Chương trình sẽ lưu lại giá trị thanh ghi giây.
      • Các cờ sẽ được thiết lập lại để chuẩn bị cho lần đọc tiếp theo.
      • Sau khi đọc được data trả về, thì ta data sẽ chuyển đổi từ BCD về nhị phân để hiển thị.

      Ở đây, mình dùng UART để hiển thị giá trị thời gian nên cần phải chuyển đổi về giá trị nhị phân. Bạn nào sử dụng LED 7 đoạn để hiển thị thời gian thì không cần chuyển đổi về số nhị phân, để nguyên số BCD. Các bạn cần include file ds1307.h vào file main để chương trình có thể gọi được các hàm thực thi trong file ds1307.c. Ví dụ mẫu mình đã để link ở dưới, các bạn có thể chỉnh sửa để hiểu thêm về I2C.

      Chúc các bạn thành công.

Link tải chương trình sử dụng ds1307