Vous êtes sur la page 1sur 6

Comunicación Serie: Ejemplos-Interface I2C

COMUNICACIÓN I2C en ENSAMBLADOR

FICHERO MSSP_I2C.ASM
(Funciones para I2C implementadas mediante MSSP)

Subrutinas para la ejecución de los principales comandos de un Maestro


en un bus I2C mediante el hardware disponible en el módulo MSSP y para
realizar el interface con una EEPROM serie del tipo 24xxx de Microchip
En la inicialización del programa principal, debe definirse el módulo MSSP
como Maestro de I2C con reloj Fosc/(4*(SSPADD+1))

El presente fichero debe ser incluido en el código fuente principal:


include "MSSP_I2C.ASM“

1
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C

En el programa principal se deben definir una serie de variables que se utilizan


para entrada y salida de las subrutinas que se definen en este fichero.

A continuación se definen las posiciones a definir en el fichero fuente principal:

ADDRH EQU ? ;Almacena la parte alta de la Dirección de la


;EEPROM a la que se quiere acceder
ADDRL EQU ? ;Almacena la parte baja de la Dirección de la
;EEPROM a la que se quiere acceder
SLAVE EQU ? ;Almacena la dirección que tiene asignada la
;EEPROM como Esclavo del bus
NUM_BYTES EQU ? ;Almacenará el número de bytes que se quieren
;leer o escribir en la EEPROM
TXBUF EQU ? ;Posición que almacena bytes a enviar
TIPOERROR EQU ? ;Tipo de Error que se ha producido

2
Microcontroladores PIC ©ATE-Universidad de Oviedo
Comunicación Serie: Ejemplos-Interface I2C

Establecer una condición de START en las líneas SDA y SCL (bit SEN)
Rutina B_START

B_START bsf STATUS,RP0 ; El registro SSPCON2 está en el banco 1


bcf STATUS,RP1 ; nos situamos en ese banco primero

bsf SSPCON2,SEN ; Activamos la generación de START


nop
S_START btfsc SSPCON2,SEN ; Cuando se haya dado la condición de START
; se pondrá a 0
goto S_START ; Si no, seguimos esperando

bcf STATUS,RP0 ; Volvemos al banco 0


return ; Salimos del subprograma

Este subprograma genera un bit de START y lo comprueba,


espera hasta que se produzca y aparezca tal condición en el bus

3
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C

Generar una condición de STOP en SDA y SCL (bit PEN)


Rutina B_STOP

B_STOP bsf STATUS,RP0 ; El registro SSPCON2 está en el banco


bcf STATUS,RP1

bsf SSPCON2,PEN ; Activamos la generación de STOP


nop
S_STOP btfsc SSPCON2,PEN ; Cuando se haya dado la condición de STOP
; se pondrá a 0
goto S_STOP ; Si no, seguimos esperando

bcf STATUS,RP0 ; Volvemos al banco 0


return ; Salimos del subprograma

Este subprograma genera un bit de STOP y lo comprueba,


espera hasta que se produzca y aparezca tal condición en el bus

4
Microcontroladores PIC ©ATE-Universidad de Oviedo
Comunicación Serie: Ejemplos-Interface I2C

Escribir un dato en SSPBUF para iniciar una transmisión de dato o dirección


Rutina TX
TX movf TXBUF,W ; Cargamos en W el byte a enviar
movwf SSPBUF ; Y se lo pasamos al buffer para el envío
bsf STATUS,RP0 ; Pasamos al banco 1 donde está SSPSTAT
ENVIANDO btfsc SSPSTAT,R_W ; para comprobar que acabó el envío
goto ENVIANDO ; Hasta que no se complete, esperando

movlw 0x01 ; Cargamos 0x01 en W como código de error


; por si no se recibe ACK
btfsc SSPCON2,ACKDT ; Comprobamos recepción final de ACK
call S_ERROR ; Si no se recibió ACK, llamamos a rutina
; de Error llevando en W el código
bcf STATUS,RP0 ; Volvemos al banco 0
return

Este subprograma envía por bus I2C el byte almacenado en la posición


TXBUF, verifica que se ha dado reconocimiento (ACK) tras el envío.
Usa como parámetro el registro TXBUF donde guarda el byte a enviar.

5
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C

Configurar la entrada I2C para recibir datos (bit RCEN)


Rutina RX
RX bsf STATUS,RP0 ; Nos situamos en el banco 1 que es donde
bcf STATUS,RP1 ; está el registro SSPCON2

bsf SSPCON2,RCEN ; Iniciamos la lectura con el bit RCEN


nop
LLEGANDO btfsc SSPCON2,RCEN ; Verificamos que se ha completado la
goto LLEGANDO ; recepción
bcf STATUS,RP0 ; Volvemos al banco 0
movf SSPBUF,W ; Recojo el dato de SSPBUF y
movwf INDF ; lo cargo en la dirección apuntada por FSR
incf FSR ; Lo incremento para la siguiente
return

Este subprograma recibe por bus I2C un byte y lo almacena en la posición


a la que apunte FSR, incrementando éste en una unidad

6
Microcontroladores PIC ©ATE-Universidad de Oviedo
Comunicación Serie: Ejemplos-Interface I2C

Generar un pulso de reconocimiento (ACK) (bit ACKEN)


Rutina B_ACK

B_ACK bsf STATUS,RP0 ; El registro SSPCON2 está en el banco 1


bcf STATUS,RP1 ; nos situamos en ese banco primero

bcf SSPCON2,ACKDT ; Cargamos 0 en ACKDT para sacarlo luego


bsf SSPCON2,ACKEN ; Iniciamos la secuencia con ACKEN=1
S_ACK btfsc SSPCON2,ACKEN ; Cuando se haya dado la condición de START
; se pondrá a 0
goto S_ACK ; Si no, seguimos esperando

bcf STATUS,RP0 ; Volvemos al banco 0


return ; Salimos del subprograma

Este subprograma genera un bit de ACK y lo comprueba,


espera hasta que se produzca y aparezca tal condición en el bus

7
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C

Generar un pulso de no reconocimiento (NACK) (bit ACKEN)


Rutina B_NOACK

B_NOACK bsf STATUS,RP0 ; El registro SSPCON2 está en el banco 1


bcf STATUS,RP1 ; nos situamos en ese banco primero

bsf SSPCON2,ACKDT ; Cargamos 1 en ACKDT para sacarlo luego


bsf SSPCON2,ACKEN ; Iniciamos la secuencia con ACKEN=1
S_NOACK btfsc SSPCON2,ACKEN ; Cuando se haya dado la condición de START
; se pondrá a 0
goto S_NOACK ; Si no, seguimos esperando

bcf STATUS,RP0 ; Volvemos al banco 0


return ; Salimos del subprograma

Este subprograma genera un bit de NO ACK y lo comprueba,


espera hasta que se produzca y aparezca tal condición en el bus

8
Microcontroladores PIC ©ATE-Universidad de Oviedo
Comunicación Serie: Ejemplos-Interface I2C
bit 7 SMP <- Para activar un control
en la pendiente de cambio de salidas

<- Para niveles eléctricos SMBus o I2C


Bits Asociados con el modo I2C

(SMBus es una variante de I2C)

Registro SSPSTAT
(0x94)

bit 0

9
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C


Bits Asociados con el modo I2C

Registro SSPCON
(0x14)

10
Microcontroladores PIC ©ATE-Universidad de Oviedo
Comunicación Serie: Ejemplos-Interface I2C

Registro SSPCON2
(0x91)
Bits Asociados con el modo I2C

11
Microcontroladores PIC ©ATE-Universidad de Oviedo

Comunicación Serie: Ejemplos-Interface I2C

Registros y bits Asociados


con el Modo I2C

12
Microcontroladores PIC ©ATE-Universidad de Oviedo