Đây là câu hỏi tiếp theo Điều gì xảy ra nếu tôi bỏ qua các điện trở pullup trên các đường I2C?
Trong một chiếc đồng hồ treo tường kỹ thuật số do tôi thiết kế (sử dụng DS1307 RTC và ATmega328 MCU), tôi đã vô tình bỏ qua các điện trở kéo lên phải được nối với cả hai đường I2C. Cuối cùng, tôi đã rất may mắn khi các pull-up bên trong trên các dòng ATmega I2C đủ để (hầu như không) cho phép giao tiếp giữa các thiết bị. Kết quả là thời gian tăng dài trên các dòng I2Cvà giảm tốc độ xuống 32kHz như đã thấy trong các bức ảnh phạm vi dưới đây.
Chỉnh sửa: Trên thực tế, tần số chính xác là 100kHz - có 2 đỉnh trên 20us trên dấu vết màu xanh lá cây. Ban đầu tôi nghĩ đã giảm xuống còn 32kHz vì phạm vi của tôi đã tính tần số trên dấu vết màu vàng.
Điều làm tôi bối rối bây giờ là làm thế nào các thiết bị quyết định rằng 32kHz là đủ để giao tiếp diễn ra. Bảng dữ liệu DS1307 nói rằng thiết bị hỗ trợ tần số 100kHz trên bus I2C. Làm thế nào mà nó kết thúc bằng cách sử dụng 32kHz? Có một số loại bắt tay trong đó tần số được thiết lập?
Cuối cùng, câu hỏi của tôi thực sự là: Tần số xung nhịp được thiết lập giữa master và Slave trong giao thức I2C như thế nào?
Tôi không thể tìm thấy thông tin tìm kiếm trên Net.
Trong trường hợp này, tôi đang sử dụng Arduino IDE 1.03 và phần sụn của tôi xử lý RTC bằng cách sử dụng DS1307RTC Arduino lib (thông qua các chức năng của nó RTC.read()
và RTC.write()
). Lib đó lần lượt sử dụng Wire.h
để nói chuyện với RTC.