SMBUS на RPI выдает IOError: [Errno 121] Ошибка удаленного ввода-вывода
Я пробовал связь между RPi3 и stm32 через I2C. Прежде всего я установил i2c-tools и python-smbus. В целом я использовал скрипт Python на RPI, как показано ниже:
import smbus
bus = smbus.SMBus(1)
address = 0x0A
data = [1,2,3,4,5,6,7,8]
bus.write_i2c_block_data(address, 0, data)
Когда я запускаю скрипт, я вижу следующую ошибку:
IOError: [Errno 121] Remote I/O error
STM32 настроен как подчиненный I2C, оба устройства подключены правильно (SDA, SCL и GND). Откуда я это знаю? Я сделал программу с использованием библиотеки BCM2835. C программа работала корректно. Программа C отправила буфер без ошибок. STM32 также получил буфер без ошибок. Можете ли вы сказать мне, что я делаю не так?
Заранее спасибо.
1 ответ
Я столкнулся с той же проблемой. Я выяснил, что код ошибки 121 указывается, когда ни один из ведомых ACK не отправляет команду, отправленную мастером. Это происходит, если вы пытаетесь связаться с неиспользуемым адресом или команда не соответствует ожиданиям подчиненных.
В моем случае я попытался отправить команду сброса на TLC59116. Эти микросхемы ожидают команду "0xA5 0x5A" по адресу 0x6B.
Поэтому я попытался отправить с таким же фрагментом, как ваш:
import smbus
bus = smbus.SMBus(0)
address = 0x6B
data = [0xA5,0x5A]
bus.write_i2c_block_data(address, 0, data)
Но в необработанном сообщении эта команда приводит к сообщению Msg [0x00 0xA5 0x5A] с начальным начальным адресом, который эти микросхемы не разрешают и дают правильный ответ с NACK -> Ошибка 121.
OT: я решил мою проблему с отправкой
bus.write_data(address,0xA5,0x5A)