Pergunta

Platform - ARM9

Eu tenho um dispositivo de terceiros conectado via I2C ao ARM9. Meu problema é o I2C leitura / gravação está ficando em uma torção. Parece que a linha de IRQ é afirmado, mas nunca afirmou de-quando há dados para ler. A leitura não como os de terceiros NACK dispositivo do pacote endereço. Assim, qualquer gravação posterior falhar.

Eu estou querendo saber se meu tratamento de interrupções em ok. No ISR que os serviços do IRQ, desabilitar interrupções, cancelar o registro do manipulador de interrupção e, em seguida, sinalizar para a tarefa de ir ler a partir do barramento I2C. Finalmente, eu reativar as interrupções.

Quando os serviços de tarefas do sinal postado acima, tento ler dados a partir do barramento I2C, mas esta falha. Finalmente, eu sempre registrar novamente o ISR após já leu tentativa. Não há desativação de interrupção / permitindo que ocorre durante a manipulação do sinal de leitura.

A minha pergunta é que eu preciso para desativar as interrupções durante a leitura / escrita para o barramento I2C?

linguagem de programação de escolha é c usando decoro RTOS.

Foi útil?

Solução

Uma coisa importante é se o seu RTOS / sistema está pronto para apoiar exceções aninhadas. A menos que haja uma boa razão para fazê-lo, as coisas são mais simples se você evitar exceções aninhadas e desativar todas as interrupções ao entrar em um ISR e reativar quando sair.

Se você quiser permitir que outras interrupções de maior prioridade para ocorrer enquanto você está servindo a interrupção I2C, em seguida, desativar somente a interrupção I2C. É bastante incomum para cancelar o registro um manipulador de interrupção ao entrar em um ISR. Isso pode levar a um comportamento inesperado, quando não há nenhum manipulador registrado, a interrupção em si é habilitado e ocorre uma interrupção. Então, ao invés de cancelar o registro do manipulador, simples desativar a interrupção I2C (Talvez você já está fazendo isso, mas a meu ver, registrar um manipulador e permitindo uma interrupção são duas coisas diferentes).

Uma boa estratégia para resolver seu problema será tentar se comunicar com o dispositivo sem interrupções. Tente ler / escrever a partir dele de uma forma de série, não importa se tudo blocos - é apenas testando. Isto é muito mais fácil de depurar e depois que você for bem sucedido você pode se mover para a versão interrupções.

Outras dicas

A maioria das interrupções precisam ser reconhecidas ou cancelado. Você menciona ativar / desativar, registrar / cancelar o registro e tratamento a interrupção. Basta verificar que a interrupção está sendo reconhecido e / ou cancelado / reset. Muitas vezes isso envolve escrever o número ou o bit de interrupção de volta para o registro pendente interrupção. Verifique a ARM específico manual ou o manual do RTOS.

Se você precisa para ativar / desativar as interrupções para sua plataforma de destino depende do seu hardware específico / aplicação RTOS. Infelizmente, todos os fornecedores ARM microcontrolador (STMicro, Freescale, Oki, etc) tem a capacidade implementar seu hardware I2C diferente e pode ter diferentes requisitos em como limpar o IRQ.

Eu recomendo que você encontrar uma cópia do hardware folha de dados (e / ou postar a parte-número hardware específico aqui para que possamos ajudar despeje sobre a documentação do fornecedor, com você).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top