I2C esclavo no ACK 'lo suficientemente rápido

1

Estoy programando un microcontrolador para hablar con un dispositivo esclavo a través de I2C. Mis transacciones I2C siempre obtienen NACK'd, pero creo que el esclavo está ACEPTANDO la transacción, solo un poco tarde y mi microcontrolador piensa que es un NACK. Por favor, corrígeme si me equivoco.

Aquí hay un rastro de la transacción.

ElesclavocontrolaSDAalfinalparaACKlatransacción.PeromibibliotecaI2CsiempreloinformaunNACK.Además,elesclavomantieneSDAbajo,yaquenoesunnovenoimpulsodereloj,ymiperiféricoI2Cseatascaalintentarterminarlacondicióndeparada.

MibibliotecaI2Cesunaconfiabledelfabricantequeheusadomuchasvecesconéxitocondiferentesdispositivos.EstoypensandoqueelesclavoesunpocodemasiadolentoconelACK.

Latrazaactualestáen100KHz,peroheintentadoa10KHzyhacelomismo.¿Algunasugerenciapararesolveresto?

Másdetalles:

  • esclavo:AMSAS3955

  • master:SiliconlabsEFM32Pearl

Actualizar

MordíelfuncionamientodeI2Cencuestiónyagreguéelnovenociclodereloj.Elmismoproblemaocurre.Despuésdelaoperación,desconectoelSDAylomidoenelladodelmicrocontroladoryenelladodelesclavo.Micro-SDAesalto(correcto)peroelesclavo-SDAsebajaaún.AsíqueparecequeestopuedesermásunproblemaconeldispositivoesclavoqueunproblemadeI2C,¿no?

Actualización 2

Ver mi respuesta publicada.

    
pregunta Conor Patrick

3 respuestas

2

Resulta que mi esclavo I2C no es compatible con I2C.

El AMS AS3955 está configurado como un dispositivo SPI o I2C en el momento de la fábrica. Mi dispositivo es SPI y no me di cuenta.

¡Gracias por las discusiones!

    
respondido por el Conor Patrick
1
  

El esclavo lleva un SDA bajo al final para ACK la transacción.

No veo esto. La línea SDA no debe subir en absoluto. El esclavo lee los datos entrantes en el flanco ascendente del reloj. Por lo tanto, cuando el octavo reloj sube, el esclavo ya sabe si esta fue la dirección correcta, por lo que hace que SDA baje casi inmediatamente después de que SCL baje.

Asegúrate de que la dirección sea correcta.

  

Más aún, el esclavo mantiene el nivel de SDA bajo, ya que no es un noveno impulso de reloj, y mi periférico I2C se atasca al intentar terminar la condición de parada.

¿Cómo sabes que es el esclavo el que mantiene la línea baja? Es muy posible que su biblioteca confiable no maneje NACK correctamente.

    
respondido por el Maple
-1

Solo está mostrando 8 pulsos de reloj para datos, y no muestra el 9º flanco de caída del pulso de reloj ACK.

El SDA no debería estar cayendo al mismo tiempo que SCL aumenta. Debería haberse calmado bajo un par de nosotros de SCL cayendo, y antes de que SCL suba. El maestro debe emitir el flanco descendente del 9º reloj y muestrear SDA justo antes / en el flanco descendente.

Sospecho que su esclavo no está actuando (la dirección es incorrecta) ya que SDA se mantiene alta, y su biblioteca está abortando y forzando a la SDA baja quizás.

Si se trata de un maestro HW, tal vez no esté configurado para I2C, es decir, está haciendo 8 relojes, no 9. (ya que está en modo SPI)

Si es un poco bash master, entonces deberías estar probando SDA justo antes de que caiga SCL (que no estás haciendo), y definitivamente un par de nosotros después del ascenso.

Echa un vistazo a esta nota de la aplicación que escribí, que te muestra cómo ver qué El chip (maestro o esclavo) está tirando del pin hacia abajo. Habla de SCL, pero funcionará igual para SDA

simular este circuito : esquema creado usando CircuitLab

Por cierto, desde la experiencia, las bibliotecas de los fabricantes rara vez son completamente funcionales o están adecuadamente depuradas.

    
respondido por el Henry Crun

Lea otras preguntas en las etiquetas