🌱 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.
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 ACK và Send NACK.
- // Hàm gửi Start Condition
- void I2C_Start(void) {
- SDA = 0; // Set SDA low
- SCL = 0; // Set SCL low
- delay(); // Delay for the start condition
- }
- // Hàm gửi Stop Condition
- void I2C_Stop(void) {
- SDA = 1; // Set SDA high
- SCL = 1; // Set SCL high
- delay(); // Delay for the stop condition
- }
- // Hàm gửi ACK
- void I2C_Send_ACK(void) {
- SDA = 0; // Send ACK by pulling SDA low
- SCL = 1; // Set SCL high
- delay();
- SCL = 0; // Set SCL low
- }
- // Hàm gửi NACK
- void I2C_Send_NACK(void) {
- SDA = 1; // Send NACK by keeping SDA high
- SCL = 1;
- delay();
- SCL = 0;
- }
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.
- // Hàm gửi một byte dữ liệu sang Slave
- void I2C_Send_Data(uint8_t data) {
- for (int i = 7; i >= 0; i--) {
- SDA = (data >> i) & 0x01; // Set SDA with each bit
- SCL = 1; // Set SCL high
- delay();
- SCL = 0; // Set SCL low
- }
- }
- // Hàm nhận một byte dữ liệu từ Slave
- uint8_t I2C_Receive_Data(void) {
- uint8_t data = 0;
- for (int i = 7; i >= 0; i--) {
- SCL = 1; // Set SCL high to read bit
- delay();
- data |= (SDA << i); // Shift data bit
- SCL = 0; // Set SCL low
- }
- return data;
- }
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