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.
fonte
Respostas:
Seu SPI sem seleção é o que o Microchip usa em seus chips MCP23017 (e outros). Nada de errado com essa abordagem.
Sim, o que você quer é possível, mas você deve fazer com que os escravos fiquem abertos. Você pode trapacear colocando um diodo (schottky) em série com cada saída, se não conseguir que eles se comportem como drenos abertos.
Sua abordagem de enumeração é a mesma usada pelo barramento de um fio de Dallas para enumeração e pelo barramento de CAN para arbitragem.
Mas uma séria desvantagem de sua abordagem é que a velocidade agora é limitada pelo tempo de subida, impulsionado pelo resistor de pull-up. Isso será mais lento do que quando acionado por uma saída push-pull e provavelmente limitará a velocidade na qual você pode operar o barramento.
Se você tiver dois pinos de sobra em cada escravo, poderá encadeá-los em cadeia e ter um esquema de enumeração com base no lugar deles na cadeia.
fonte
Você precisa verificar qual é a resistência equivalente do pino de E / S mestre no modo pull-up.
Normalmente, o modo pull-up tem uma resistência muito alta, talvez 50 kOhms ou superior. Ele tem como objetivo evitar que o pino sofra falhas devido a emi ou outro ruído, ou para definir um padrão para sinais de controle muito lentos e, ao mesmo tempo, para não desperdiçar muita energia fazendo isso.
Como Wouter apontou, em um barramento de dreno aberto a velocidade é limitada pelo resistor de pull-up. Valores mais altos do resistor tornam o barramento mais lento. Os valores típicos em I2C (que obtém 100 ou 400 kHz) são de 1 a 5 kOhms. Você deseja uma resistência à tração semelhante para obter uma velocidade semelhante.
Eu acho que você precisa usar um resistor de pull-up externo (de 1 a 5 kOhms) em vez do pull-up do pino de E / S do mestre para fazer esse esquema funcionar.
fonte
Para que um barramento com fio e um barramento funcionem, os nós no barramento precisam ser de dreno aberto, ou seja, devem transmitir
Além disso, o ônibus deve ser puxado fracamente.
O comportamento peculiar que você vê com um único mestre não transmissor e um único escravo transmissor pode ser explicado pelo mestre puxando com força ou pelo escravo puxando fracamente.
Você precisa determinar qual das opções acima está acontecendo.
Coloque o escravo no modo de alta impedância e conecte o barramento ao terra através de um resistor de 10k. Se a tensão da linha não mudar significativamente, o mestre estará aumentando fortemente e você precisará corrigi-lo. Caso contrário, faça o mesmo procedimento com o escravo (desta vez, conecte o resistor ao Vcc); se a tensão da linha aumentar significativamente, o escravo está baixando fracamente (conserte isso). Caso contrário, procure distorções no espaço-tempo na área ao seu redor.
fonte
Eu sugeriria ter um pull-up ou pull passivo no ônibus (eu assumirei pull-up), e ter escravos ativamente dirigindo o ônibus (dirigindo alto e baixo) quando eles têm algo a dizer e o flutuam de outra forma . Tenha comandos de endereço de consulta que recebem um endereço e uma máscara e instruem cada escravo a produzir 00 ou não fazer nada (continue flutuando sua saída) com base no fato de gostar do endereço e da máscara. Se possível, peça ao mestre que conduza o ônibus ativamente alto algum tempo antes de os escravos começarem a dirigi-lo. Dependendo da força da tração e se o mestre conduz o barramento alto, antes que os escravos possam puxá-lo para baixo, pode ser necessário limitar a velocidade do barramento durante a fase de configuração. Por outro lado, quando a instalação estiver concluída,
fonte