Lo primero de todo saludos a toda la comunidad. Como ya escribí en el foro de bienvenida me llamo Juan y actualmente estoy finalizando mis estudios de telemática en la universidad de Jaén.
Actualmente estoy desarrollando el proyecto final de carrera y éste es el motivo por el que escribo, llevo unas semanas "atrancado" con el bus I2C y necesito ayuda de gente que haya trabajado con el.
La verdad es que yo nunca había trabajado con este protocolo hasta que empecé este proyecto, por lo que soy un novato en este aspecto.
Paso a detallar mi problema:
Estoy intentando comunicar un MCU (concretamente estoy utilizando la Demo board STM8L DISCOVERY de STMicroelectronics) con el ADC de Microchip MCP3424, ya que el ADC que incorpora el MCU tiene una resolución de 12 bits y necesisto una resolución mayor, que me la da el MCP3424 ya que éste puede alcanzar una resolución de hasta 18 bits.
Mi intención ahora mismo es solamente comunicarme con el ADC y leer sus entradas.
Siguiendo el protocolo I2C he programado una serie de funciones (el lenguaje de programación es c++) para poder realizar la comunicación; para ello he empleado tanto las bibliotecas que se me proporcionan en la página de STMicroelectronics como el manual para la familia de microcontroladores que estoy empleando (stm8l15x).
Las funciones son muy básicas, una para inicializar los puertos SCL y SDA como drenador abierto y el reloj así como el bus I2C, otra que sirve para comenzar la comunicación, otra para escribir un byte en el ADC otra para leer del ADC y una última para generar la condición de STOP.
Bien mi problema surge en la función que empieza la comunicación I2C; en ésta, realizo las siguientes operaciones:
Compruebo que el bus está libre, genero la condición de start y compruebo que se envía correctamente, indico la dirección del esclavo y el modo de operación (lectura o escritura) y espero asentimiento por parte del esclavo.
En resumen sería: void I2C_start (I2C_Typedef* I2Cx, unit8_t address, unit8_t direction)
Dónde los parámetros serían I2Cx (Nuestro dispositivo I2C), address (la dirección de 7 bits) y direction (modo de operación lectura o escritura).
Mi problema es que compruebo correctamente que el bus está libre, genera la condición de start y envía la dirección del esclavo en modo escritura pero no recibo asentimiento por parte del esclavo.
Cuando me surgió este problema, medí con el osciloscopio las señales SCL y SDA y lo que ocurre es que cuando se genera la condición de start SDA cae a nivel bajo ( como dicta el protocolo), pero SCL también cae a nivel bajo y permanece ahí o, lo que es lo mismo, no se genera señal de reloj.
He probado a bajar la frecuencia en el bus, a subirla, y también a hacer un general call también con resultados negativos. También he comprobado que el chip no está estropeado ya que he probado varios y me pasa lo mismo, además, uno de los que he probado se a utilizado en otro proyecto y funciona correctamente.
La verdad es que estoy desesperado porque llevo tres semanas dándole vueltas y no consigo avanzar si alguien pudiera echarme un cable estaría muy agradecido.
Para finalizar pido disculpas por la parrafada, mi intención era detallar mi problema lo mas concretamente posible, pero creo que se me fue de las manos y me extendí demasiado.
Saludos,
Juan Cristóbal
Actualmente estoy desarrollando el proyecto final de carrera y éste es el motivo por el que escribo, llevo unas semanas "atrancado" con el bus I2C y necesito ayuda de gente que haya trabajado con el.
La verdad es que yo nunca había trabajado con este protocolo hasta que empecé este proyecto, por lo que soy un novato en este aspecto.
Paso a detallar mi problema:
Estoy intentando comunicar un MCU (concretamente estoy utilizando la Demo board STM8L DISCOVERY de STMicroelectronics) con el ADC de Microchip MCP3424, ya que el ADC que incorpora el MCU tiene una resolución de 12 bits y necesisto una resolución mayor, que me la da el MCP3424 ya que éste puede alcanzar una resolución de hasta 18 bits.
Mi intención ahora mismo es solamente comunicarme con el ADC y leer sus entradas.
Siguiendo el protocolo I2C he programado una serie de funciones (el lenguaje de programación es c++) para poder realizar la comunicación; para ello he empleado tanto las bibliotecas que se me proporcionan en la página de STMicroelectronics como el manual para la familia de microcontroladores que estoy empleando (stm8l15x).
Las funciones son muy básicas, una para inicializar los puertos SCL y SDA como drenador abierto y el reloj así como el bus I2C, otra que sirve para comenzar la comunicación, otra para escribir un byte en el ADC otra para leer del ADC y una última para generar la condición de STOP.
Bien mi problema surge en la función que empieza la comunicación I2C; en ésta, realizo las siguientes operaciones:
Compruebo que el bus está libre, genero la condición de start y compruebo que se envía correctamente, indico la dirección del esclavo y el modo de operación (lectura o escritura) y espero asentimiento por parte del esclavo.
En resumen sería: void I2C_start (I2C_Typedef* I2Cx, unit8_t address, unit8_t direction)
Dónde los parámetros serían I2Cx (Nuestro dispositivo I2C), address (la dirección de 7 bits) y direction (modo de operación lectura o escritura).
Mi problema es que compruebo correctamente que el bus está libre, genera la condición de start y envía la dirección del esclavo en modo escritura pero no recibo asentimiento por parte del esclavo.
Cuando me surgió este problema, medí con el osciloscopio las señales SCL y SDA y lo que ocurre es que cuando se genera la condición de start SDA cae a nivel bajo ( como dicta el protocolo), pero SCL también cae a nivel bajo y permanece ahí o, lo que es lo mismo, no se genera señal de reloj.
He probado a bajar la frecuencia en el bus, a subirla, y también a hacer un general call también con resultados negativos. También he comprobado que el chip no está estropeado ya que he probado varios y me pasa lo mismo, además, uno de los que he probado se a utilizado en otro proyecto y funciona correctamente.
La verdad es que estoy desesperado porque llevo tres semanas dándole vueltas y no consigo avanzar si alguien pudiera echarme un cable estaría muy agradecido.
Para finalizar pido disculpas por la parrafada, mi intención era detallar mi problema lo mas concretamente posible, pero creo que se me fue de las manos y me extendí demasiado.
Saludos,
Juan Cristóbal