Cách hiển thị địa chỉ I2C ở dạng hex


7

Bus truyền thông I2C sử dụng địa chỉ 7 bit hoặc 10 bit để giải quyết các thiết bị nô lệ. Lấy các địa chỉ 7 bit phổ biến hơn, mỗi gói được gửi trên bus bởi chủ bắt đầu bằng địa chỉ 7 bit theo sau là chỉ báo đọc hoặc ghi 1 bit ( ).R/W¯
Giao tiếp 7 bit từ Đặc tả Bus I2C

Hầu hết các bảng dữ liệu chỉ cung cấp địa chỉ I2C cho thiết bị của họ theo ký hiệu nhị phân hoặc dưới dạng bit trên sơ đồ thời gian (có ghi chú cho các bit địa chỉ có thể định cấu hình), cả hai đều không rõ ràng vì chúng hiển thị bảy hoặc tám bit để bạn có thể biết liệu bao gồm bit . Điều này dường như tuân theo đặc tả NXP I2C chính thức .R/W¯

Vấn đề xảy ra khi cố gắng ghi lại địa chỉ trong hex. Các nguồn khác nhau chuyển đổi địa chỉ theo những cách khác nhau:

  1. Chuyển đổi địa chỉ 7 bit thành giá trị thập lục phân trong phạm vi 0x00thành0x7F
  2. Bao gồm bit làm LSB và cung cấp hai địa chỉ, một để đọc và một để ghi trong phạm vi tớiR/W¯0x000xFF

Hai tùy chọn này không phải lúc nào cũng có thể phân biệt.

Rõ ràng sử dụng ký hiệu nhị phân là tốt hơn vì nó cung cấp cho bạn một địa chỉ rõ ràng, tuy nhiên điều này không phải lúc nào cũng có thể. Một trường hợp đáng chú ý là trên C / C ++ khi không có cách viết số nhị phân đặc biệt chuẩn . Điều này dẫn đến vấn đề tôi gặp phải khi chỉ định hằng số cho các thiết bị trong mạch là không rõ ràng.

Vì vậy, trong việc chọn một tiêu chuẩn cho sơ đồ, tài liệu và mã (C ++) của chúng tôi, chúng tôi phải chọn cách này hay cách khác. Điều đó dẫn đến câu hỏi của tôi:

Có cách nào chủ yếu để hiển thị địa chỉ I2C theo ký hiệu thập lục phân hay cả hai đều được sử dụng phổ biến?


2
+1 cho câu hỏi, tôi cũng đã gặp phải vấn đề này khi xác định giao diện cho các thư viện I2C. Tôi luôn sử dụng địa chỉ 7 bit (với một chút đau đớn, vì điều đó có nghĩa là một sự thay đổi thêm còn lại ở đâu đó trong quá trình thực hiện) bởi vì đó là cách tài liệu gốc của Philips đặt địa chỉ. PS: C ++ 0x14 mới có chữ nhị phân và 'như tiếng ồn cho phép, vì vậy bạn có thể viết chữ 0b'110'1100
Wouter van Ooijen

Câu trả lời:


3

Tôi hiểu bạn muốn nói gì. Tôi đã thấy những sự mơ hồ trong tài liệu quá. Điều đó không làm cho nó đúng, mặc dù.

Cá nhân tôi chỉ giao tiếp địa chỉ dưới dạng giá trị 7 bit, cho dù ở dạng nhị phân (0-1111111), hex (0-7F), thập phân (0-127) hoặc một số lược đồ khác. Bit R / W KHÔNG phải là một phần của địa chỉ. Nó và địa chỉ là hai trường riêng biệt được nhồi nhét vào cùng một byte.

Thật không may, mặc dù việc giải thích địa chỉ 7 bit là chính xác và dường như là phổ biến hơn, có rất nhiều tài liệu xấu ngoài kia. Điều này có nghĩa là bạn không thể tin vào bảng dữ liệu tiếp theo mà bạn đọc để thực hiện theo cách này hay cách khác. Khi đọc tài liệu, đây là một vấn đề bạn chỉ cần lưu ý và hết sức cẩn thận để xem chính xác địa chỉ được trình bày như thế nào. Cho đến nay tôi đã không bắt gặp một bảng dữ liệu nơi mà điều này cuối cùng không thể được tìm ra.

Khi viết tài liệu của riêng bạn, vui lòng làm phần còn lại của thế giới và thể hiện "địa chỉ" dưới dạng giá trị 7 bit. Nếu bạn muốn hiển thị nó với bit R / W, hãy gọi nó là "byte địa chỉ" hoặc một cái gì đó để làm rõ điều này.


Điểm khởi đầu của tôi là giá trị 7 bit là cách duy nhất để đi. Thật đáng tiếc khi thư viện STM32 HAL mà các đồng nghiệp của tôi đang nhắm mục tiêu vào lúc này không đồng ý!
Xcodo

0

Theo kinh nghiệm của tôi, cách phổ biến nhất để thể hiện địa chỉ I2C là sử dụng dạng 7 bit ở dạng thập lục phân.

Để đảm bảo không có sự mơ hồ, hãy nhất quán:

  • Trong mã I2C của bạn, đảm bảo mọi hàm I2C đều lấy địa chỉ 7 bit làm đối số chứ không phải địa chỉ 8 bit.

  • Trong tài liệu của bạn luôn đề cập đến địa chỉ là địa chỉ 7 bit.

Lưu ý: Tôi đã tự hỏi ý của bạn là gì khi nhị phân ít mơ hồ hơn và tôi nhận ra điều đó là bởi vì với nhị phân, bạn có thể chọn đệm với số không để đưa ra một số có 7 hoặc 8 chữ số, và do đó phân biệt giữa chúng. Tài giỏi! Tôi tự hỏi nếu mọi người thậm chí sẽ nhận thấy một chữ số ít hơn, vì vậy có lẽ tốt nhất để được rõ ràng.


2
Tôi đến từ một thế giới VHDL có độ rộng mảng được đánh máy mạnh mẽ. Hằng số địa chỉ I2C của tôi sẽ luôn như 6 downto 0vậy! Tôi đoán bạn học cách kiểm tra độ rộng theo nghĩa đen nhị phân, nếu không thì trình tổng hợp phàn nàn với bạn lớn ...
Xcodo

0

Không có một tiêu chuẩn nào, và nó là một nguồn đau buồn vô tận. Linux i2cset và i2cget sử dụng ký hiệu 7 bit, vì vậy đó là gần nhất với 'tiêu chuẩn' như hiện có. Có tồn tại các công cụ / nền tảng khác sử dụng 8 bit. Datasheets không nhất quán. Sự hỗn loạn!

Dù sao, khi tôi tạo một ký hiệu tài liệu về I2C, tôi sẽ biểu thị nó dưới dạng cả giá trị nhị phân và hex (7 bit) như sau:

periph_i2c addr: {1 1 0 0 1 0 1 r/w} (0x65 hex)

Điều này làm rõ ý tôi muốn nói.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.