🌱 Bài 22. Thực hành: Triển khai I2C Driver 8051

🌱 Bài 22. Thực hành: Triển khai I2C Driver 8051

    Để viết được Driver cho I2C, đầu tiên cần hiểu rõ về giao thức I2C và cách thức hoạt động của nó. Bạn có thể tham khảo bài viết về chuẩn giao tiếp I2C để nắm bắt các kiến thức cơ bản.

Cấu trúc I2C Driver

    Driver cho giao thức I2C bao gồm ba hàm cơ bản:

  • Hàm khởi tạo: Cấu hình giao thức (tốc độ truyền, khung truyền, chế độ truyền, Master/Slave, ...).
  • Hàm truyền dữ liệu: Chứa tham số truyền vào là dữ liệu cần gửi.
  • Hàm nhận dữ liệu: Trả về dữ liệu nhận được từ Slave.

    Driver I2C hoạt động dựa trên các giao thức này. Việc truyền nhận dữ liệu giữa Master và Slave được thực hiện qua các khung truyền đã được xác định trước.

I2C

Hàm khởi tạo I2C

    Các hàm khởi tạo bao gồm việc gửi các xung như Start Condition, Stop Condition, Send ACKSend NACK.

  1. // Hàm gửi Start Condition
  2. void I2C_Start(void) {
  3. SDA = 0; // Set SDA low
  4. SCL = 0; // Set SCL low
  5. delay(); // Delay for the start condition
  6. }
  7. // Hàm gửi Stop Condition
  8. void I2C_Stop(void) {
  9. SDA = 1; // Set SDA high
  10. SCL = 1; // Set SCL high
  11. delay(); // Delay for the stop condition
  12. }
  13. // Hàm gửi ACK
  14. void I2C_Send_ACK(void) {
  15. SDA = 0; // Send ACK by pulling SDA low
  16. SCL = 1; // Set SCL high
  17. delay();
  18. SCL = 0; // Set SCL low
  19. }
  20. // Hàm gửi NACK
  21. void I2C_Send_NACK(void) {
  22. SDA = 1; // Send NACK by keeping SDA high
  23. SCL = 1;
  24. delay();
  25. SCL = 0;
  26. }

Hàm gửi dữ liệu và nhận dữ liệu

Hàm gửi một byte dữ liệu sang Slave và nhận phản hồi từ Slave. Dưới đây là mã nguồn cho việc gửi và nhận dữ liệu từ Slave.

  1. // Hàm gửi một byte dữ liệu sang Slave
  2. void I2C_Send_Data(uint8_t data) {
  3. for (int i = 7; i >= 0; i--) {
  4. SDA = (data >> i) & 0x01; // Set SDA with each bit
  5. SCL = 1; // Set SCL high
  6. delay();
  7. SCL = 0; // Set SCL low
  8. }
  9. }
  10. // Hàm nhận một byte dữ liệu từ Slave
  11. uint8_t I2C_Receive_Data(void) {
  12. uint8_t data = 0;
  13. for (int i = 7; i >= 0; i--) {
  14. SCL = 1; // Set SCL high to read bit
  15. delay();
  16. data |= (SDA << i); // Shift data bit
  17. SCL = 0; // Set SCL low
  18. }
  19. return data;
  20. }

Hàm nhận dữ liệu từ Slave

    Khi Master đọc dữ liệu từ Slave, cần phải gửi bit ACK để xác nhận việc nhận dữ liệu thành công.

    ➤ Download Driver I2C tại đây: Tải Driver I2C

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn