Para os impacientes, você pode pular o plano de fundo.
fundo
Estou programando um conjunto de microcontroladores que se comunicam com a SPI. Há um mestre e n
escravos que compartilham o ônibus. Não há seleção de chip. (Não é um design ruim, mas n
é grande e não há espaço suficiente para n
linhas extras).
Portanto, é responsabilidade dos escravos manter seu MISO em alta impedância e no máximo um deles falar. Isso é feito respondendo apenas quando o ID deles é pesquisado.
Agora, gostaríamos de ter uma fase inicial de descoberta, na qual o mestre descobre os escravos com quais IDs estão anexados. Para facilitar a vida (em alguns aspectos), gostaríamos de ter o ID exclusivo (e, portanto, por exemplo, 32 bits). Isso torna impossível para o mestre simplesmente pesquisar os IDs um por um e ver quem responde (há muitas possibilidades).
Para resolver esse problema, criei uma variação da pesquisa binária em que os escravos respondem coletivamente e o mestre é capaz de encontrar rapidamente o ID mínimo. O escravo com esse ID é instruído a não participar mais e o algoritmo se repete. (Detalhes sem importância).
Há um problema, porém. A resposta coletiva precisa ser o OR lógico (ou AND lógico) de todas as respostas. Foi-me dito que a linha pode ser configurada de forma que o barramento MISO possa atuar como um OR lógico. O que me disseram é:
- Defina MISO no mestre como Pull-up e
- Defina MISO em cada escravo como Dreno aberto.
Eu tentei isso, mas mesmo com um único escravo, essa configuração não funciona (o osciloscópio mostra um zero constante na linha). Se eu configurar o MISO no mestre como entrada de alta impedância, posso ver com o osciloscópio que a tensão cai para a metade, onde os bits das saídas de dois escravos diferem (basicamente curto-circuito, presumo).
Nota: configurando o MISO no mestre como alta impedância e escravos como push-pull, posso conversar com cada um deles individualmente, mesmo que haja muitos deles no mesmo barramento. Quero dizer, duvido que seja um problema da própria linha.
Questão
Minha pergunta é: se isso é possível, e se sim, como posso configurar os pinos de entrada e saída do mestre e dos escravos para que a linha MISO compartilhada atue como OR lógico (ou AND lógico)?
Editar
Acontece que ele se torna um OR com lógica negativa-verdadeira (basicamente um AND).
O problema com o escravo único foi resolvido com a gravação 1 no pino de puxar no mestre. Anteriormente, tinha um estado inicial de 0.
Editar 2
Acontece que o escravo ST substitui minha configuração GPIO do MISO como dreno aberto e a estava forçando quando um foi escrito. Eu resolvi silenciar o SPI e emitir o MISO nesse caso específico manualmente.