Estoy trabajando en el controlador maestro I2C para conectar un periférico en particular. El problema que tengo es que cuando llega el noveno reloj, el dispositivo esclavo no baja la línea SDA.
Revisé las señales con un alcance, y todo parece estar bien. la dirección está bien. No estoy usando resistencias pull-up externas, estoy usando la capacidad de pull-up interna de mi MCU (EFM32GG).
No soy ingeniero eléctrico y mi experiencia es del lado del software, por lo que esta pregunta puede ser tonta, pero ¿existe la posibilidad de que el dispositivo no pueda bajar la línea porque la unidad de extracción es demasiado alta?
¿Puede haber otra explicación para este problema (a excepción de la obvia, que el chip esclavo está muerto)?
Con el osciloscopio, debería ver algún tipo de efecto en la línea de datos, incluso si la línea se levanta con demasiada fuerza. Puede caer solo medio voltio o algo así, no lo suficiente como para leerse como un cero.
También existe la posibilidad de que la dirección del esclavo sea incorrecta. A veces, la dirección se especifica como de 7 bits y, a veces, como de 8 bits. Este último será 2x el primero. Consejo gratuito: Escriba un bucle para probar todas las direcciones y pare si encuentra una que responda.
Supongo que lo que quiere decir con "impulso de elevación demasiado alto" en este caso sería que la resistencia de elevación interna sería demasiado pequeña. Esto es muy poco probable. Puede asegurarse de esto activando el pull-up y haciendo que el pin sea una entrada. Luego, simplemente coloque una resistencia desde el pin a tierra, puede calcular la resistencia interna de extracción con la ecuación del divisor de voltaje . Recuerde 'resistencia pull-up grande' = 'tirón débil'.
El problema más probable es un problema de cableado, como intercambiar SDA/SCL al conectar el periférico o no tener una conexión a tierra común.
Lo segundo más probable sería el momento. Verifique el diagrama de tiempo I2C de su dispositivo esclavo (debe estar en la hoja de datos) y asegúrese de que se cumpla midiendo con el osciloscopio.
Finalmente, si no es ninguna de estas otras cosas, es posible que tenga un chip esclavo muerto. ¿Puedes probar otro?
Hay dos componentes principales para que esto funcione, la interfaz eléctrica física y los datos lógicos que se envían.
En el lado eléctrico, el maestro por sí mismo al menos parece estar funcionando correctamente si ve en un visor que las señales son buenas. Dado que no ha proporcionado parcelas, no podemos decir si son realmente buenas o si tiene una idea errónea de lo que es bueno. En el lado del esclavo, sí, los pullups deben ser lo suficientemente débiles como para permitir que el esclavo baje la línea SDA. Si no recuerdo mal, la especificación IIC dice que el esclavo solo necesita hundirse 3 mA para llevar la línea por debajo del nivel bajo lógico máximo. Si está utilizando una lógica de 5 V, por ejemplo, esto significa que el pullup no puede ser inferior a 5 V / 3 mA = 1,7 kΩ, por lo que una resistencia de 2 kΩ sería una opción razonable. Mire las especificaciones del pullup interno que está utilizando y asegúrese de que no pueda generar más de 3 mA. Si puede, no puede usarlo y tiene que usar un pullup externo.
En el lado lógico, debe asegurarse de que el esclavo esté siendo direccionado correctamente. La secuencia IIC debe comenzar con ambas líneas altas, luego una condición de inicio, que es SDA bajando antes de SCL bajando. Después de eso, para cada bit, SDA debe cambiar al nuevo valor, luego SCL sube, luego SCL baja nuevamente. Los primeros 7 bits son la dirección, luego el bit de lectura/escritura. Para el noveno bit, el maestro deja el SDA flotante y el esclavo debe bajarlo poco después de que el SCL baje.
En mi experiencia, la causa más común de no obtener una respuesta del esclavo es una dirección incorrecta.
pjc50
vela suave
usuario3624
pjc50