Есть ли пример кода i2c библиотеки периферии python или подробное объяснение, отличное от документации?

#python #raspberry-pi3 #i2c

#python #raspberry-pi3 #i2c

Вопрос:

Это мой первый вопрос в Stackoverflow если я допустил ошибку при написании этого вопроса, пожалуйста, дайте мне отзыв, чтобы исправить себя.

Я хочу использовать связь i2c для моего raspberry pi. Я хочу использовать python-periphery (я знаю, что там есть smbus). В документацииhttps://python-periphery.readthedocs.io/en/latest/i2c.html информации о том, как использовать библиотеку, не так много. Вот код в документации:

 from periphery import I2C

# Open i2c-0 controller
i2c = I2C("/dev/i2c-0")

# Read byte at address 0x100 of EEPROM at 0x50
msgs = [I2C.Message([0x01, 0x00]), I2C.Message([0x00], read=True)]
i2c.transfer(0x50, msgs)
print("0x100: 0x{:02x}".format(msgs[1].data[0]))

i2c.close()
  

Я попытался записать / прочитать с помощью датчика, и это было успешно. Однако в моем тестовом коде я использовал это:

 #Write to 0x09 register,this byte: 0x13
W9 = [I2C.Message([0x09,0x13])]
i2c.transfer(DFLT_ADDRESS,W9)

#Read from 0x09 register
R = [I2C.Message([0x09]), I2C.Message([0x00], read=True)]
i2c.transfer(DFLT_ADDRESS,R)
print(R[1].data[0])
  

(Я использовал smbus для проверки правильности записи данных в регистр и чтения. Итак, тестовый код работает.)

Что я хочу знать, так это где находится 0x100 (я думаю, [0x01, 0x00] это 0x100) в этой строке: msgs = [I2C.Message([0x01, 0x00]), I2C.Message([0x00], read=True)] , И когда я попробовал это, он записывает 0x00 в регистр в моем датчике. Это потому, что у моего датчика 8 бит, но я пытался написать 16 бит? Итак, кто-нибудь может объяснить, что происходит в примере документации?

Комментарии:

1. EEPROMs немного отличаются от обычных устройств I2C, в частности, они поддерживают подкачку .

Ответ №1:

Может быть, вы могли бы попробовать этот код, который я использую на своем raspberry pi zero :

 # coding=utf-8
# date : 25/05/2021
# dossier : piPeri
# fichier : pP_readByte01.py
# check the result with these commands : 
# i2cset -y 1 0x51 0x10 0x01
# i2cget -y 1 0x51
# 3x times 

from periphery import I2C

print(" Read 3 bytes starting at register address 0x1001 of EEPROM at I2C address 0x51 ")


# Open i2c-0 controller
i2c = I2C("/dev/i2c-1")

# create array to hold received data ( 3 bytes in my case )
dataRX = [0,0,0]

# create message to place 16 bits in memory register of eeprom
msgWritePointer = I2C.Message([0x10,0x01],read=False)

# create message to read data according to length of array 'dataRX'
msgRead = I2C.Message(dataRX,read=True)

# messages are assembled, order is important 
msgs = [msgWritePointer, msgRead]

# call transfer function 
i2c.transfer(0x51, msgs)

# print received bytes
for i in range(0,len(msgs[1].data)):
    print(hex(msgs[1].data[i]))

i2c.close()