PIC16F SSPADD causando que SCL baje pronto

1

No puedo comunicarme con mi RTC (PCF8563). Estoy intentando comunicarme con él utilizando un PIC16F876 sobre el bus I2C. El código de abajo es todo lo que estoy haciendo en mi main (). No puedo recibir un ACK del RTC. Por alguna razón, cuando configuro SSPADD se crea una condición adicional de INICIO que está eliminando todo. Estoy seguro de que es el SSPADD, como lo demuestra un paso a paso y su eliminación. ¿Alguien puede explicar esto? Tengo, al enviar dos condiciones de inicio, hice que se detuviera y reconociera la dirección correcta. En esa situación, SDA permanece ALTA. Si configuro SSPADD antes de habilitar SEN, no enviará nada. Ambos pines están conectados a + 5V a través de una resistencia de 2.2kohm (también experimentada con 10kohm).

TRISC = 0b00011000; //RC3-RC4 INPUTS
SSPM3 = 1; //set as I2C master
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;
SMP = 1; //disable slew rate control (running at 100khz)
SSPEN = 1; //enable serial port

SEN = 1; //create START condition
SSPADD = 0x09; //set baud rate to 100khz
SSPBUF = 0xA2; //buffer in number

Captura de pantalla del analizador lógico: SCL en la parte superior, SDA en la parte inferior:

    
pregunta Michael

2 respuestas

2

Desde su código parece que no está esperando SSPIF después de configurar el SEN. Si comprendo la hoja de datos correctamente, debe esperar a que aparezca el SSPIF antes de intentar cualquier operación "siguiente", donde START, ADDRESS, DATA y STOP son todas operaciones. Entonces debería ser algo como:

Start
wait for SSPIF and clear it
Send Addresss
wait for SSPIF and clear it
loop while more bytes:
  Send a byte
  wait for SSPIF and clear it
Stop

SSPIF estaba destinado a ser utilizado desde un controlador de interrupciones, pero necesita una forma de saber que una operación ha finalizado, por lo que podría usarla de cualquier manera. Si hay otra señal que indica que la operación IIC ha finalizado, también puede utilizarla.

La razón por la que creo que su código 'casi' funciona es porque configurar SSPADD después de SEN, le da al motor de la IIC el tiempo para completar el INICIO, por lo que el envío de la dirección funciona a pesar de que no esperó el SSPIF. Si elimina SSPADD (o lo mueve), entonces dos operaciones, START y ADDRESS están demasiado juntas, y el motor IIC ignora el comando ADDRESS.

    
respondido por el mikijov
0

Debes esperar a inactivo como dice MikiJ. Aquí hay un par de ejemplos de código:

void i2c_waitForIdle()
{
 while (( SSPCON2 & 0x1F ) | RW ) {}; // wait for idle and not writing
}

void i2c_start()
{
 i2c_waitForIdle();
 SEN=1;
}

El i2c_waitForIdle() comprueba los 5 bits inferiores del registro SSPCON2 (todos relacionados con condiciones inactivas / no inactivas), y también el bit R / W del registro SSPSTAT para asegurarse de que estén todos en 0 y que no ocurra nada. Tenga en cuenta que este código es para algunas versiones anteriores de Hi-Tech C, por lo que es posible que deba cambiarlo según sea necesario.

Luego, i2c_start() simplemente llama a i2c_waitForIdle() y luego establece el bit de inicio (bit 0 de SSP2CON)

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas