I2C/es
En esta sección se hablará sobre el protocolo I2C y como este se maneja en el Nano.
[edit] Introducción al protocolo
Este protocolo fue creado por Philips y consiste en un bus serial con interfaz de dos pines, SDA [Serial Data/Address](utilizado para el dato), SCL [Serial Clock Line](el reloj que sincroniza el dato) y la referencia GND. La unidad I2C permite al procesador comunicarse con periféricos I2C con ayuda de registros standar.
El I2C del JZ4725 tiene las siguientes caracteristicas:
-Soporta solamente single master mode
-Soporta modo standard y modo F/S hasta 400KHz
-El receptor y transmisor tienen doble buffer
-Soporta escritura aleatoria de datos
-Soporta llamado general de dirección y formato de byte de START después de la condición de START.
-Generador de clock serial programable independiente.
-Soporta copia del esclavo con maestro rápido durante transferencia de datos al sostener la linea SCL en un nivel de bit.
-El numero de dispositivos que se pueden conectar al mismo bus I2C esta limitado solamente por el máximo de la capacitancia del bus de 400pF.
[edit] Descripción de los registro
tabla de resumen:
| Nombre | valor de reset | dirección | tamaño de acceso |
|---|---|---|---|
| I2CDR | 0x?? | 0x10042000 | 8 |
| I2CCR | 0x00 | 0x10042004 | 8 |
| I2CSR | 0x04 | 0x10042008 | 8 |
| I2CGR | 0x0000 | 0x1004200C | 16 |
Data Register (I2CDR)
Es el puerto de datos de una FIFO HW.
Control Register (I2CCCR)
Este registro de 8 bits se encarga de controlar las funciones básicas del I2C, como interrupciones, inicio, parada, acknowledge y habilitación del protocolo.
A continuación se muestra dos tablas que resumen la función de este registro.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Nombre | IEN | STA | STO | AC | I2CE | |||
| RST | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Bits | Nombre | Descripción | RW |
|---|---|---|---|
| 7:5 | Reserved | estos bits siempre son leidos como cero y su escritura es ignorada | R |
| 4 | IEN | bit de interrupción. 0-deshabilita interrupción 1-habilita interrupción | RW |
| 3 | STA | bit de start. 0-la condición de start no se envía 1-se envía la condición de start | RW |
| 2 | STO | bit de stop. 0-la condición de stop no se envía 1-se envía la condición de stop | RW |
| 1 | AC | bit de control de acknowledge. 0- se enviara al bus I2C como una señal de acknowledge baja (low) 1-se enviara al bus I2C como una señal de acknowledge alta(high) | RW |
| 0 | I2CE | habilita el I2C. 0-deshabilita el modulo I2C 1-habilita el modulo I2C | RW |
Status Register (I2CSR)
Este registro revisa el estado actual del bus, por ejemplo si esta ocupado o si ya termino la transmisión. Su descripción se muestra en las siguientes tablas.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Nombre | STX | BUSY | TEND | DRF | ACKF | |||
| RST | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| Bits | Nombre | Descripción | RW |
|---|---|---|---|
| 7:5 | Reserved | estos bits siempre son leidos como cero y su escritura es ignorada | R |
| 4 | STX | el comando STA/STO esta encendido. 0-el buffer FIFO de STA/STO esta vacio 1-el buffer FIFO de STA/STO no esta vacio | R |
| 3 | BUSY | bus I2C ocupado. 0-el bus esta libre 1-el bus esta ocupado | R |
| 2 | TEND | bandera de finalizacion de transmisión. 0-byte de transmisión o bit de acknowledge para ese byte no se ha completado. 1-el I2C se encuentra en estado de transmisión idle | R |
| 1 | DRF | dato de registro de bandera valida. 0- dato en el I2CDR es invalido 1- dato en el I2CDR es valido | RW |
| 0 | ACKF | bandera de nivel de acknowledge. 0-la señal de acknowledge del bus I2C es "0" 1-la señal de acknowledge del bus I2C es "1" | R |
Clock Generator Register (I2CGR)
Este registro se utiliza para establecer la frecuencia del reloj serial.
| Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nombre | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR | GR |
| RST | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Bits | Nombre | Descripción | RW |
|---|---|---|---|
| 15:0 | GR | establece la frecuencia del reloj serial. esta frecuencia se calcula de la siguiente forma:
valor de I2CGR=[frecuencia del reloj del dispositivo/(16*[tasa del reloj SCL])-1 |
R |
Para que el I2C funcione normalmente, la frecuencia del PCLK no debe ser menor a dos veces la tasa de transferencia de byte.
[edit] Protocolo del bus I2C
Transferencia de bit
Se genera un pulso de reloj por cada bit de dato transferido.
Validez del dato
El dato en la linea SDA debe permanecer estable durante el periodo alto del reloj. Los estados altos o bajos de la linea del dato solamente pueden cambiar cuando la señal del reloj se encuentre en bajo.
Condiciones de inicio y parada
Una transición de alto a bajo en la linea SDA mientras SCL permanece en alto indica una condicion de inicio. Una transición de bajo a alto en la linea SDA mientras SCL permanece en alto indica una condicion de parada.
Formato de Byte
1. Todos los bites en la linea de SDA deben ser de 8bits de ancho.
2.El numero de bytes que pueden ser transmitidos o recibidos por transferencia es ilimitado.
3. Cada byte debe estar seguido por un bit de acknowledge.
4. Los datos se transfieren con el bit mas significativo primero.
5. La transferencia de datos con señal de acknowledge es obligatorio.
6.El reloj relacionado con la señal de acknowledge es generado por el maestro.
7. El transmisor suelta la linea SDA (alta) en el pulso del reloj de acknowledge. El receptor debe bajar la linea de SDA durante el pulso del reloj de acknowledge para que el pulso del reloj se mantenga estable en bajo durante el periodo alto de este pulso de reloj.
8. El esclavo puede mantener la linea SCL baja, mientras que esta esta en bajo en cualquier bit para forzar al maestro a proceder con una tasa de transferencia menor.
En la siguiente imagen se resumen los numerales anteriores, donde Sr quiere decir condición de inicio repetida y P es la condición de parada.
En la figura también se observa que si el maestro no genera Sr o P, el siguiente byte de dato sigue al bit ack. Si en vez de recibir ack, se recibe la señal nack, el maestro generaría Sr o P y la transferencia termina.