Protocolo I2C
En el protocolo I2C la CPU de control funcionará como master y la de los sensores como esclava. En el master:
- Las entradas SCL y SDA se deben programar como entradas (RC3 y RC4) en TRISC.
- Se deben poner dos resistencias de pull-up de 1.5 kohm en ambas líneas del bus.
La CPU de sensores tendrá un buffer donde se guardarán los datos a transferir a la de control. Una vez guardados en este buffer los datos a enviar se iniciará la transferencia I2C. La respuesta quedará depositada en el mismo buffer que podrá ser leída una vez finalizada la transferencia I2C.
Los mensajes enviados por la CPU de control serán de la forma:
§ Dirección
§ Longitud = L
§ Código (pares escritura, impares con respuesta)
§ Datos (L bytes)
§ Checksum negado (de todos los anteriores incluida la dirección)
Las respuestas tendrán la forma:
§ Checksum negado (de todos los anteriores incluida la longitud)
§ Byte de status
§ Datos (L bytes)
El manejo del I2C en la CPU master (CPU de control) se describe a continuación:
Inicialización:
§ Configurar TRISC con los bits 3 y 4 a 1 (entradas): 0001 1000
§ Configurar la velocidad con los 7 bits de menos peso de SSPADD. La velocidad sera: Baud Rate = Fosc / (4 * (SSPADD+1)). Para 100 Kbps será SSPADD=49 .
§ Configurar SSPSTAT con 1000 0000
§ Configurar el SSPCON con el valor: 0011 1000
§ Configurar el SSPCON2 con el valor: 0000 0000
§ Se activan la interrupción de colisión PIE2:BCLIE
Inicio de operación:
§ Grabar el mensaje en el buffer de salida
§ Se activan la interrupción con el bit PIE1:SSPIE
El tratamiento de la interrupción funcionará como una máquina de estado con los siguientes pasos:
§ Paso 1: Se inicia la transmisión con el START poniendo a 1 el bit SSPCON2:SEN
§ Paso 2: Escribir la dirección de escritura (bit 0 a 1)
§ Paso 3: Para cada byte a escribir, comprobar que hay ACK (SSPCON2:ACKSTAT a 0) y escribir el siguiente byte de datos. Si no terminar marcando error.
§ Paso 4 (si no hay lectura): Comprueba que hay ACK y termina la escritura con un STOP poniendo a 1 el bit SSPCON2:PEN y desactivando las interrupciones poniendo a 0 PIE1:SSPIE. En la siguiente interrupción finaliza la operación
§ Paso 4. Se inicia la respuesta con un re-START
§ Paso 5: Escribe la dirección de lectura (bit 0 a 0)
§ Paso 6: Comprueba que se responde ACK con SSPCON2:ACKSTAT a 0 a la dirección. Si es así se pasa a lectura poniendo a 1 SSPCON2:RCEN.
§ Paso 7: Interrupción de byte recibido. Se guarda y responde con ACK (bit SSPCON2:ACKDT a 0) o NAK (SSPCON2: ACKDT a 1) enviándolo poniendo a 1 SSPCON2:ACKEN.
§ Paso 8: ACK/NAK enviado. Si enviado NAK terminal con un STOP poniendo a 1 SSPSTAT:PEN. Si quedan más byte pasa a modo lectura poniendo 1 en SSPCON2:RCEN.
§ Paso 9: Stop enviado. Desprograma interrupciones con un 0 en PIE1:SSPIE.
Nota: En la recepción se debe controlar la recepción de un NAK o de un error de overun para finalizar la operación con error.
En la CPU de los sensores la inicialización es la siguiente:
§ Configurar SSPSTAT con 1000 0000
§ Programa la dirección del esclavo en el registro SSPADD .
§ Configurar el SSPCON2 con el valor: 0000 0000
§ Configurar el SSPCON1 con el valor: 0011 0110
§ Se activan la interrupción de colisión PIE1:SSPIE
Toda la operativa del I2C se hace en la rutina de tratamiento de interrupción que funcionará como una máquina de estados con los siguientes pasos:
§ Paso 1: Se activa tras leerse la dirección del esclavo correcta. Se inicializa la lectura del mensaje.
§ Paso 2: Se lee el número de bytes del mensaje
§ Paso 3: Se leen todos los bytes del mensaje, incluido el checksum
§ Paso 4: Tras leer el checksum, se interpreta el mensaje y se guarda la respuesta en el buffer de transmisión
§ Paso 5: Se transmiten los bytes de la respuesta. Tras la transmisión de cada byte hay que reactivar el clock poinedo a 1 el bit CKP de SSPCON1. La longitud de la respuesta la determina el master