	<sect1 id="i2c" xreflabel="i2c">
		<title>M&oacute;dulo I2C</title>
		<para>Autor : Pierre Launay </para>
		<para>per.launay en free.fr</para>
		<para>El bus I2C es un bus serie sincrono desarollado por Philips </para>
		<para>
			Descripci&oacute;n del bus I2C 
			<ulink url="http://es.wikipedia.org/wiki/I2C">aqui</ulink>
		</para>
		<para>
			Entender el bus I2C 
			<ulink url="http://robots-argentina.com.ar/Comunicacion_busI2C.htm">aqui</ulink>
		</para>

		<para>Aqui se muestran las funciones para poder trabajar con el m&oacute;dulo I2C Maestro Interno de los PIC.
		</para>
		<para>
			Antes de usar este m&oacute;dulos se debe definir la frecuencia usada con el comando.
		</para>

		<para>
		<screen>
	#define FOSC_HZ 4000000
	#include &lt;i2c.h&gt;
		</screen>
		</para>

		<para>Se han realizado algunas definiciones como: </para>
		<para>
		<screen>
	#define I2C_400K	i2c_find_frec(400000)	//frecuencia de 400Khz
	#define I2C_100K	i2c_find_frec(100000)	//frecuencia de 100Khz
	#define I2C_40K		i2c_find_frec(40000)	//frecuencia de 40Khz
	#define I2C_10K		i2c_find_frec(10000)	//frecuencia de 10Khz
	#define I2C_4K		i2c_find_frec(4000)	//frecuencia de 4Khz
	#define I2C_1K		i2c_find_frec(1000)	//frecuencia de 1Khz
		</screen>
		</para>
		<para>Estas definiciones pueden ser usandas en la funci&oacute;n init_i2c</para>


		<sect2 id="i2cinit" xreflabel="i2c_init">
		<title>i2c_init</title>
		<para>Configura el puerto Serie sincrono</para>
		<screen>
	void i2c_init(unsigned char SPEED_I2C);
		</screen>
		<para>SPEED_I2C es el registro SSPADD, reloj_I2C=FOSC_HZ/(4*(SSPADD+1))</para>
		</sect2>

		<sect2 id="i2cwaitforidle" xreflabel="i2c_wait_for_idle">
		<title>i2c_wait_for_idle</title>
		<para>Espera a que el bus est&eacute; libre </para>
		<screen>
	void i2c_wait_for_idle(void);
		</screen>
		</sect2>

		<sect2 id="i2cstart" xreflabel="i2c_start">
		<title>i2c_start</title>
		<para>principio de trama, secuencia de inicio</para>
		<screen>
	void i2c_start(void);
		</screen>
		</sect2>

		<sect2 id="i2crestart" xreflabel="i2c_restart">
		<title>i2c_restart</title>
		<para>Devolver una trama, fin de trama y principio de trama permite poner dos tramas para leer . Ver i2c_read()
		</para>
		<para>Ejemplo para leer las segundas en una trama :</para>
		<para>
			Principio de trama (start), escribir la direcci&oacute;n del circuito I2C, escribir el registro de las segundas, 
		</para>
		<para>
			Devolver una trama (restart), escribir la direcci&oacute;n del circuito I2C, leer el registro de las segundas.
		</para>
		<para>fin de trama (stop)</para>
		<screen>
	void i2c_restart(void);	
		</screen>
		</sect2>

		<sect2 id="i2cstop" xreflabel="i2c_stop">
		<title>i2c_stop</title>
		<para>fin de trama, secuencia de parada</para>
		<screen>
	void i2c_stop(void);
		</screen>
		</sect2>

		<sect2 id="i2cdelay" xreflabel="i2c_delay">
		<title>i2c_delay</title>
		<para>Tiempo de espera entre fin de trama y principio de trama &gt;=4.7 us (Frecuencia Reloj SCL = 100KHz) </para>
		<screen>
	void i2c_stop(void);
		</screen>
		</sect2>

		<sect2 id="i2cackread" xreflabel="i2c_ack_read">
		<title> i2c_ack_read </title>
		<para>recepci&oacute;n del pulso de reconocimiento</para>
		<screen>
	unsigned char i2c_ack_read (void);
		</screen>
		<para>"0" buena recepci&oacute;n</para>
		<para>"1" mala recepci&oacute;n</para>
		</sect2>

		<sect2 id="i2cackwrite" xreflabel="i2c_ack_write">
		<title>i2c_ack_write</title>
		<para>emisi&oacute;n. del pulso de reconocimiento</para>
		<screen>
	void i2c_ack_write(unsigned char ack);
		</screen>
		<para>"0" la trama puede continuar</para>
		<para>"1" la trama se para</para>
		</sect2>

		<sect2 id="i2cwrite" xreflabel="i2c_write">
		<title>i2c_write</title>
		<para>
			el maestro escribe en el esclavo el caracter c, el caracter c puede ser una direcci&oacute;n, una registro interno, un dato
		</para>
		<screen>
	void i2c_write(unsigned char c);
		</screen>
		</sect2>

		<sect2 id="i2cwritewithack" xreflabel="i2c_write_with_ack">
		<title>i2c_write_with_ack</title>
		<para>
			El maestro escribe el caracter c en el esclavo y remite el reconocimiento (ack).
		</para>
		<para>Esta rutina junta i2c_write(c) y reception_ack()</para>
		<screen>
	unsigned char i2c_write_with_ack(unsigned char c) ;
		</screen>
		</sect2>

		<sect2 id="i2cread" xreflabel="i2c_read">
		<title>i2c_read</title>
		<para>El maestro lee el caracter enviado por el esclavo</para>
		<screen>
	unsigned char i2c_read(void);
		</screen>
		</sect2>

		<sect2 id="i2creadwithack" xreflabel="i2c_read_with_ack">
		<title>i2c_read_with_ack</title>
		<para>el maestro lee el caracter enviado por el esclavo y envia el reconocimiento (ack).</para>
		<screen>
	unsigned char i2c_read_with_ack(unsigned char ack);
		</screen>
		</sect2>


		<sect2 id="ejemploi2c" xreflabel="Ejemplo I2C">
		<title>Ejemplo de M&oacute;dulo I2C</title>
		<para> para compilar necesitas los siguientes comandos </para>
		<para>
		<screen>
Ejemplo de compilacion : ./compila.sh ej_i2c 16f877a
		</screen>
		</para>
		<para> ej_i2c.c </para>

		<screen>
	int main(void)
	{
		return 0;
	}
		</screen>
		</sect2>	

	</sect1>
