I2C устройство на SPI шине

doleynikov
Offline
Зарегистрирован: 30.01.2015

Добрый день. В интернетах видел обсуждение возможности цеплять i2c устройства к пинам spi. На сколько я понял, в этом случае идет програмная реализациа i2c протокола. Но моего понимания не хватает, чтобы разобраться. Помогите, может кто-то знает-видел такие проекты? Например, мне интересно подключить SPI SRAM и I2C LCD. помогите найти примеры.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я правильно понял, что Вы хотите, чтобы I2C и SPI при этом работали вместе на одних и тех же пинах?

doleynikov
Offline
Зарегистрирован: 30.01.2015

Да, на одних пинах. Естественно, не будет одновременных попыток обращений.

__Alexander
Offline
Зарегистрирован: 24.10.2012

SPI требует сигнала выбора CS. Если у LCD такого сигнала нет, то работая с памятью на экран может вываливаться мусор.

doleynikov
Offline
Зарегистрирован: 30.01.2015

Теоретически это так, но в одной из веток, где на аглицком обсуждали эту проблему, было написано (на сколько я понял), что такое не произойдет всилу каких-то особенностей протокола. Может из-за какого-то экзотического начала передачи (сигнала start).

Вот , например: https://i2cchip.com/mix_spi_i2c.html

"

You can normally mix I2C and SPI on the same pins. I2C only does something between START and STOP.

START is when SCL is HI, SDA goes to HI->LO.

STOP is when SCL is HI and SDA goes LO->HI.

So if you arrange your code such that SDA only changes value when SCL is LO, there will be no problems. The I2C will not notice any SPI transactions. Of course all the SPI devices have thier own individual CS pin, but this is the disadvantage of SPI.

So to spell it out.

  • You can use I2C devices on an SPI bus. Just connect SCL to SCLK and SDA to SDIO.
  • You can use SPI devices on an I2C bus, just give each chip its own CS signal.
  • Between START and STOP you can only do I2C transactions.
  • The bit timing will be set by the I2C bus,even when doing SPI, ie use 100 or 400kHz
  • Write your routines so that SCL and SDA don't change at the same time. This also removes the problem of SPI devices with rising vs falling clock
  • The "SPI" type devices do have to have a common-able data in and out pins.
  • You can use the same routines for both if you are short of code space. Some SPI devices will need non 8 bit sized transfers.
  • I2C devices have noise filters on the input. SPI devices don't. Bear this in mind if you have long cable runs.
  • You will need to have a reset function that makes sure everything is in the correct state. In particular, some non-I2C serial devices needs some clocks to bring them into a defined state.

"

То есть это возможно, но как найти какие-то примеры?

__Alexander
Offline
Зарегистрирован: 24.10.2012

это может произойти как нефиг делать, смотря как будете работать с памятью. если опустить линию моси в ноль, а потом опустить клок в ноль, то вот вам уже сигнал старт для и2ц. проверяйте. посмотрите на протокол и2ц для данного экрана да и дергайте так-же ногами. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doleynikov, а с какой целью интересуетесь? Дело в том, что I2C - это как бы выходв с открытым коллектором, т.е. аппаратно они немножко другие. Ну и протоколы достаточно сильно отличаются. Поэтому, если не хватает пинов, проще добавить сдвиговые регистры или еще чего, чем возиться с совмещением протоколов.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Зачем какие-то примеры, когда там все условия и ограничения нормально перечислены? Берите и пробуйте. Только вопрос нафига сращивать ежа с ужом, заданный andriano повисает в воздухе, особенно при необходимости явной программной эмуляции того или иного интерфейса, а то и обоих вместе, когда есть аппаратная, не загружающая работой сам камень?

"Нехватка ног" - несколько странный аргумент, если учесть что оба интерфейса практически всегда сидят на разных ногах (и недаром, и в предупреждении это тоже указано на англицком). Куда проще или расширить ноги схемами расширений (и тут способов много) или тупо перейти на кристалл поногастее, благо их как грязи самых разных.

doleynikov
Offline
Зарегистрирован: 30.01.2015

Дело в небольшой нехватке ног. Много занимает матричная клавиатура. Хотелось бы повесить SPI SRAM и I2C LCD на одни пины. LCD - устройство медленное и памяти мешать не должен. Регистры городить нехочется, так как это внесение  избыточной для меня сложности в устройство и программу. Если никто такого не пробовал - ну и ладно, попробую сам как-то выкрутиться. Спасибо тем, кто пытался помочь или просто участвовал в обсуждении. Будут вопросы - спрошу снова ;-)

Удачи.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так может просто уменьшить число ног под "клавой"? Пошукайте как на 1 аналоговый вход можно повесить многа кнопок .. при желании очень много :)

doleynikov
Offline
Зарегистрирован: 30.01.2015

не, клавиатура уже готова и работает ;-) матрица 5*8 . плюс светики для отображения статуса шифтов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

del

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doleynikov пишет:

Хотелось бы повесить SPI SRAM и I2C LCD на одни пины. LCD - устройство медленное и памяти мешать не должен. Регистры городить нехочется, так как это внесение  избыточной для меня сложности в устройство и программу. Если никто такого не пробовал - ну и ладно, попробую сам как-то выкрутиться.

Вот это по-нашему!

Правильно, попробуйте сами. Только на собственном опыте можно убедиться, что регистры - это намного проше, чем два разных программных протокола на одних и тех же ногах, и что никто такого и не пробовал (а скорее - пробовал, но не сумел довести до результата) именно по этой причине.