Hace un rato que uso los microcontroladores AVR para los proyectos en los que me involucro, y la verdad trabajar con el bus i2c ha sido de gran ayuda, ya que me permite conectar distintos dispositivos con casi nada de hardware extra (solo un par de resistencias). Configurar el hardware del AVR para que trabaje en modo master, ha sido estudiado por muchas personas por mucho tiempo y la mejor libreria que he encontrado para este modo la tiene Peter Fleury.
En fin, no siempre podremos hacer todo con el microcontrolador master (a veces ni por mas poderoso que sea) y no siempre encontramos dispositivos esclavos que tengan las funciones que necesitamos. Este ultimo caso en concreto me llevo a desarrollar una librería (todavía muy básica) para configurar un AVR en modo slave para i2c. Ahora bien, ya hay librerías i2c en modo esclavo para AVR’s, de hecho hay una implementación en la aplication note AVR311, pero a mi se me hace bien tediosa, ademas de que es complicado aplicarla a cada proyecto que desarrollemos.
La libreria que propongo (desarrollada para AVRGCC, pero de fácil portabilidad) trabaja con un principio simple: hacer un buffer de comunicacion entre el master y el slave. Esto es, el slave tendra apartado una seccion de memoria en el cual el master podra escribir y leer en cualquier momento.
Esto facilita la adaptación de la librería para diferentes necesidades, lo único que tiene que hacer el proceso principal del slave es leer los “comandos” del master en el buffer sin preocuparse de la comunicación i2c, o en su caso escribir las respuestas para el master en le buffer. El master también solo tendrá que leer/escribir en registros/buffer del slave.
Para su uso solo hay una función de inicialización: “i2c_slave_ini()” donde pondremos que dirección tendrá nuestro nuevo slave (esta librería no contempla funciones “general call”, no las necesito por el momento
), lo demas es hecho en el buffer y la interpretación de cada “registro” dependerá de la aplicación.
La transmisión típica debería ser: primero escribir el registro a leer/escribir, que indicara al driver donde escribir/leer y después hacer la lectura/escritura. El driver recorre automáticamente el puntero al registro a leer. La secuencia de operación es igual que si trabajáramos con una memoria 24LCXX.
****EDITADO***** (8-dic-2010)
En fin, aqui les dejo el archivo de la libreria : i2cslave.zip
****/EDITADO*****
Si quieren saber mas acerca del bus i2c, lean directo el manual del bus, es mas sencillo de leer de lo que parece.
Por cierto, el driver esta basado en el apartado del TWI del manual del ATmega8, pero deberá funcionar con cualquier mega que tenga TWI.
Espero que les sirva. Cualquier bug… no ha de ser difícil que lo resuelvan jajajaja
Cambio y fuera…



hola sirve para attiny2313
No, el attiny2313, tiene un modulo USI (Universal Serial Interface) y esta libreria esta hecha para dispositivos que tienen modulo TWI (Two Wire Interface) como el atmega8, atmega16 o atmega32.
De hecho el primer intento para una libreria de i2c en esclavo que hice, fue para un attiny2313, pero requiere de muchas llamadas de interrupcion por parte del USI, ademas de una respuesta rapida por parte del procesador, ya que si no optimizas bien el software (y mas si trabajas en lenguaje c) no puedes llegar a manejar velocidades aceptables de comunicacion.
Por la necesidad que tenia de que el procesador trabajar con otras interrupciones (INT0 e INT1) la USI no alcanzaba a responder a tiempo el llamado (y se estancaba el clock y trababa el bus i2c), una solucion fue bajar la velocidad del clock, pero las transferencias de datos eran muy bajas, no supere los 40KHz (el estandar es 100KHz).
Asi que cuando cambie a un procesador con TWI, se soluciono mi problema, ya que las llamadas de interrupcion por la comunicacion son menos y mas sencillas, permitiendome distribuir mejor la carga de trabajo del procesador.
Si quieres implementar i2c esclavo en un micro con USI (attiny2313) te aconsejo checar el appnote de atmel AVR312 (solo googlea AVR312 y sale luego luego
)