Para un proyecto, me gustaría que tres PIC (dos esclavos PIC18F4620, un maestro PIC18F46K22) se comuniquen a través del bus I2C. Más tarde, se pueden agregar más esclavos (como EEPROM, SRAM, ...). Estoy escribiendo el código para estos PIC en C usando el compilador C18. He buscado mucho en Internet, pero no pude encontrar bibliotecas para manejar el periférico (M) SSP. Leí la hoja de datos de ambos PIC en el periférico (M) SSP en modo I2C, pero no pude encontrar la forma de conectar el bus.
Entonces necesito bibliotecas maestras y esclavas.
¿Que recomiendas? ¿Tienes tal biblioteca en alguna parte? ¿Está integrado en el compilador y, en caso afirmativo, dónde? ¿Hay algún buen tutorial en algún lugar de la red?
Respuestas:
Microchip escribió notas de aplicación sobre esto:
Las notas de la aplicación funcionan con ASM, pero eso se puede transferir a C fácilmente.
Los compiladores C18 y XC8 gratuitos de Microchip tienen funciones I2C. Puede leer más sobre ellos en la documentación de las bibliotecas del compilador , sección 2.4. Aquí hay información de inicio rápido:
Configuración
Ya tienes el compilador C18 o XC8 de Microchip. Ambos tienen funciones I2C incorporadas. Para usarlos, debe incluir
i2c.h
:Si desea ver el código fuente, puede encontrarlo aquí:
installation_path
/v
x.xx
/h/i2c.h
installation_path
/v
x.xx
/src/pmc_common/i2c/
installation_path
/v
x.xx
/include/plib/i2c.h
installation_path
/v
x.xx
/sources/pic18/plib/i2c/
En la documentación, puede encontrar en qué archivo de la
/i2c/
carpeta se encuentra una función.Abriendo la conexión
Si está familiarizado con los módulos MSSP de Microchip, sabrá que primero deben inicializarse. Puede abrir una conexión I2C en un puerto MSSP utilizando la
OpenI2C
función. Así es como se define:Con
sync_mode
, puede seleccionar si el dispositivo es maestro o esclavo y, si es un esclavo, si debe usar una dirección de 10 bits o de 7 bits. La mayoría de las veces, se utilizan 7 bits, especialmente en aplicaciones pequeñas. Las opciones parasync_mode
son:SLAVE_7
- Modo esclavo, dirección de 7 bitsSLAVE_10
- Modo esclavo, dirección de 10 bitsMASTER
- Modo maestroCon
slew
, puede seleccionar si el dispositivo debe usar la velocidad de respuesta. Más sobre lo que es aquí: ¿Cuál es la velocidad de respuesta para I2C?Dos módulos MSSP
Los dispositivos con dos módulos MSSP tienen algo especial, como el PIC18F46K22 . Tienen dos conjuntos de funciones, una para el módulo 1 y otra para el módulo 2. Por ejemplo, en lugar de
OpenI2C()
, tienenOpenI2C1()
yopenI2C2()
.Bien, así que lo configuraste todo y abriste la conexión. Ahora hagamos algunos ejemplos:
Ejemplos
Ejemplo de escritura maestra
Si está familiarizado con el protocolo I2C, sabrá que una secuencia de escritura maestra típica se ve así:
Al principio, enviamos una condición de INICIO. Considera esto levantar el teléfono. Luego, la dirección con un bit de escritura: marcar el número. En este punto, el esclavo con la dirección enviada sabe que lo están llamando. Envía un reconocimiento ("Hola"). Ahora, el dispositivo maestro puede enviar datos, comienza a hablar. Envía cualquier cantidad de bytes. Después de cada byte, el esclavo debe aceptar los datos recibidos ("sí, te escucho"). Cuando el dispositivo maestro ha terminado de hablar, cuelga con la condición STOP.
En C, la secuencia de escritura maestra se vería así para el maestro:
Ejemplo de lectura maestra
La secuencia de lectura maestra es ligeramente diferente de la secuencia de escritura:
Nuevamente, el maestro inicia la llamada y marca el número. Sin embargo, ahora quiere obtener información. El esclavo primero responde la llamada, luego comienza a hablar (enviando datos). El maestro reconoce cada byte hasta que tenga suficiente información. Luego envía un Not-ACK y cuelga con una condición STOP.
En C, esto se vería así para la parte maestra:
Código esclavo
Para el esclavo, es mejor usar una Rutina de servicio de interrupción o ISR. Puede configurar su microcontrolador para recibir una interrupción cuando se llama a su dirección. De esa manera no tienes que revisar el autobús constantemente.
Primero, configuremos los conceptos básicos para las interrupciones. Tendrá que habilitar las interrupciones y agregar un ISR. Es importante que los PIC18 tengan dos niveles de interrupciones: alta y baja. Vamos a configurar I2C como una interrupción de alta prioridad, porque es muy importante responder a una llamada I2C. Lo que vamos a hacer es lo siguiente:
GOTO
instrucción al ISR general en el vector de interrupción de alta prioridad. No podemos poner el ISR general directamente en el vector porque es demasiado grande en muchos casos.Aquí hay un ejemplo de código:
Lo siguiente que debe hacer es habilitar la interrupción de alta prioridad cuando se inicializa el chip. Esto puede hacerse mediante algunas manipulaciones de registro simples:
Ahora, tenemos interrupciones trabajando. Si está implementando esto, lo comprobaré ahora. Escriba un básico
SSPISR()
para comenzar a parpadear un LED cuando se produce una interrupción de SSP.Bien, entonces tienes tus interrupciones funcionando. Ahora escribamos un código real para la
SSPISR()
función. Pero primero algo de teoría. Distinguimos cinco tipos diferentes de interrupciones I2C:Puede verificar en qué estado se encuentra verificando los bits en el
SSPSTAT
registro. Este registro es el siguiente en modo I2C (se omiten bits no utilizados o irrelevantes):Con estos datos, es fácil ver cómo ver en qué estado se encuentra el módulo I2C:
En software, es mejor usar el estado 5 como predeterminado, que se asume cuando no se cumplen los requisitos para los otros estados. De esa manera, no responde cuando no sabe lo que está sucediendo, porque el esclavo no responde a un NACK.
De todos modos, echemos un vistazo al código:
Puede ver cómo puede verificar el
SSPSTAT
registro (primero ANDed0x2d
para que solo tengamos los bits útiles) usando máscaras de bits para ver qué tipo de interrupción tenemos.Es su trabajo averiguar qué tiene que enviar o hacer cuando responde a una interrupción: depende de su aplicación.
Referencias
Nuevamente, me gustaría mencionar las notas de aplicación que Microchip escribió sobre I2C:
Hay documentación para las bibliotecas del compilador: documentación de las bibliotecas del compilador
Al configurar algo usted mismo, consulte la hoja de datos de su chip en la sección (M) SSP para la comunicación I2C. Usé el PIC18F46K22 para la parte maestra y el PIC18F4620 para la parte esclava.
fuente
En primer lugar, recomendaría cambiar al compilador XC8 simplemente porque es el último. Hay bibliotecas periféricas disponibles, pero nunca las he usado mucho. Visite el sitio web de Microchips para obtener detalles y la documentación.
De acuerdo, tengo algunas rutinas básicas muy antiguas aquí para las comunicaciones eeprom I2C que usé hace mucho tiempo con un PIC16F y el antiguo compilador de rango medio Microhip (puede haber sido el Hi-Tech), pero creo que pueden funcionar bien con el PIC18, ya que creo que el periférico es el mismo. De todos modos, descubrirá muy rápidamente si todo es diferente.
Formaban parte de un archivo más grande que se utilizó con un proyecto de registro de temperatura, por lo que rápidamente eliminé todas las demás funciones no relacionadas y las guardé como los archivos a continuación, por lo que es posible que haya hecho un poco de lío, pero espero que usted podrá tener una idea de lo que se necesita (incluso puede funcionar, nunca se sabe ;-))
Deberá asegurarse de que el archivo de encabezado principal sea correcto y verificar / modificar los pines para asegurarse de que sean los pines periféricos I2C correctos y los nombres de registro si son del compilador de alta tecnología, que hizo las cosas un poco diferente con respecto a la convención de nomenclatura de registro.
Archivo I2C.c:
Archivo de encabezado I2C.h:
fuente
SSP1ADD = ((_XTAL_FREQ/100000)/4)-1;
a 1 KHz, etc.Los compiladores XC8 y XC16 incluyen bibliotecas para I2C.
¡El problema que encontré es que la documentación no es muy buena! Si usa los ejemplos de la documentación de Microchip, no tiene suerte. Incluso el soporte de Microchip no puede ayudarte. He estado allí yo mismo.
Hace algún tiempo trabajé con el microcontrolador de la serie PIC24EP512GP y la biblioteca no funcionó para mí como lo documenta Microchip.
fuente