N
neuralc
Guest
Ciao a tutti,
Sto cercando di utilizzare l'allegata i2c c file sorgente.
Simulazione in Proteus con 16f876a e fm24c16, whe e inviare un byte (usando SendI2C) nel StartI2C () i disabili sono fissati a 1, che dovrebbe esltimul l'hardware di generare una condizione di avvio (SDA dovrebbe andare basso), ma il problema è l'SDA non va né il basso SSPIF sono di nuovo insieme e ottenere un loop infinito ...
Alcuni si può aiutare?
THX
NeuralC
/************************************************* *****************************
* I2C Header file
*
* Questo file contiene la funzione dei prototipi per l'I2C routine definita
* A I2C.C.
************************************************** ****************************
* /
# ifndef _I2C_H
# define _I2C_H/ / Funzione Prototipi
char SendI2C (char, char, char *);
char GetI2C (char, char, char, char *);
char StartI2C (char);
char ReStartI2C (char);
StopI2C nullo (void);# endif/************************************************* *****************************
* I2C Routines (2002.11.09)
*
* Questo file contiene la routine I2C.
* Ogni routine parametri sono spiegato sopra della dichiarazione della funzione.
************************************************** ****************************
* /
# ifndef _I2C_C
# define _I2C_C
# include "i2c.h"/************************************************* *****************************
* SendI2C
* I2CADD: Indirizzo del dispositivo slave I2C spostato a sinistra di 1 bit
* I2CBYTES: Numero di byte da inviare I2CBUFFER
* I2CBUFFER: Puntatore ad un buffer di stringa contenente i byte di inviare
*
* Questo subroutine trasferimenti I2CBYTES byte di dati da osservare per la stringa
* Da I2CBUFFER al dispositivo slave con indirizzo I2CADD.
*
* Restituisce 1: Invia a termine con successo
* 0: Invia fallito
************************************************** ****************************
* /
char SendI2C (char I2CADD, char I2CBYTES, char * I2CBUFFER)
(
char count = 0;
char bSUCCESS = 1; / / Si supponga di successo di trasferimento
if (StartI2C (I2CADD & 0xFE)) / / Avvia il trasferimento e indicare scrivere
(
while (count <I2CBYTES) / / loop fino a quando tutti i byte sono stati inviati
(
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CBUFFER [count ]; / / Invia byte
while (SSPIF == 0); / / Attendere fino al byte inviati
)
) Else
bSUCCESS = 0; / / Indicare inviare non
StopI2C (); / / Stop al trasferimento
ritorno bSUCCESS; / / Ritorno successo indicatore
)
/************************************************* *****************************
* GetI2C
* I2CADD: Indirizzo del dispositivo slave I2C spostato a sinistra di 1 bit
* I2CCOMMAND:> 0 indica comandato ricevere, nel comando del primo byte
* I2CBUFFER
* = 0 indica normale ricevere
* I2CBYTES: Numero di byte per andare dal dispositivo e scrivere I2CBUFFER
* I2CBUFFER: Puntatore ad una stringa di buffer, bytes leggere saranno memorizzati qui
*
* Questo subroutine trasferimenti I2CBYTES byte di dati dal dispositivo slave
* Indirizzo I2CADD e li memorizza nella I2CBUFFER.Se uno è comandato ricevere
* Indicato da I2CCOMMAND, il primo byte di I2CBUFFER è scritto nel
* Slave dispositivo prima di procedere alla lettura di tutti i dati.
*
* Restituisce 1: ArrivareProspettiPartner successo
* 0: non ArrivareProspettiPartner
************************************************** ****************************
* /
char GetI2C (char I2CADD, char I2CCOMMAND, char I2CBYTES, char * I2CBUFFER)
(
char count = 0;
char bSUCCESS;
if (I2CCOMMAND)
(
bSUCCESS = StartI2C (I2CADD & 0xFE); / / Avvia il trasferimento e indicare scrivere
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CBUFFER [0]; / / Invia comando byte
while (SSPIF == 0); / / Attendere fino al byte inviati
ReStartI2C (I2CADD | 0x01); / / riavviare il trasferimento e indicare leggere
) Else
bSUCCESS = StartI2C (I2CADD | 0x01) / / Avvia il trasferimento e indicare leggere
while (count <I2CBYTES)
(
SSPIF = 0; / / Cancella interrompere bandiera
RCEN = 1; / / Inizializzare leggere sequenza
while (SSPIF == 0);
I2CBUFFER [count ] = SSPBUF; / / Store byte in tampone
SSPIF = 0; / / Cancella interrompere bandiera
if (COUNT == I2CBYTES) / / Se abbiamo letto tutti i byte
ACKDT = 1; / / indicano che
stiamo fatto non ack
altro
ACKDT = 0; / / else riconoscere il byte
ACKEN = 1; / / Start riconoscere la sequenza
while (SSPIF == 0); / / Attendere che riconoscono completo
)
StopI2C (); / / Stop al trasferimento
ritorno bSUCCESS; / / Ritorno successo indicatore
)
/************************************************* *****************************
* StartI2C
* I2CADD: Indirizzo del dispositivo slave I2C (spostato a sinistra di 1 bit) R / W bit
*
* Questo avvia una subroutine I2C trasferimento con l'invio di una condizione di avviare e
* L'indirizzo del dispositivo slave, I2CADD.
*
* Restituisce 1: Slave dispositivo riconosciuto
* 0: Slave dispositivo non riconoscere
************************************************** ****************************
* /
char StartI2C (char I2CADD)
(
SSPIF = 0; / / Cancella interrompere bandiera
SEN = 1; / / Inizializzare iniziare condizione
while (SSPIF == 0); / / Attendere fino a quando l'inizio condizione completo
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CADD; / / Invia l'indirizzo del dispositivo slave
while (SSPIF == 0); / / Attendere fino a quando l'indirizzo è stato inviato
if (ACKSTAT == 0)
return 1; / / return 1 se il dispositivo riconosciuto
altro
return 0; / / return 0 se il dispositivo non ha riconosciuto
)
/************************************************* *****************************
* ReStartI2C
* I2CADD: Indirizzo del dispositivo slave I2C (spostato a sinistra di 1 bit) R / W bit
*
* Questo subroutine invia un riavvio condizione per il dispositivo con indirizzo slave
* I2CADD.
*
* Restituisce 1: Slave dispositivo riconosciuto
* 0: Slave dispositivo non riconoscere
************************************************** ****************************
* /
char ReStartI2C (char I2CADD)
(
SSPIF = 0;
RSEN = 1; / / Inizializzare Riavviare condizione
while (SSPIF == 0); / / Attendere fino a quando l'inizio condizione completo
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CADD; / / Invia l'indirizzo del dispositivo slave
while (SSPIF == 0); / / Attendere fino a quando l'indirizzo è stato inviato
if (ACKSTAT == 0)
return 1; / / return 1 se il dispositivo riconosciuto
altro
return 0; / / return 0 se il dispositivo non ha riconosciuto
)
/************************************************* *****************************
* StopI2C
*
* Questo subroutine termina uno I2C trasferimento con l'invio di una condizione di arresto.
************************************************** ****************************
* /
StopI2C nullo (void)
(
SSPIF = 0; / / Cancella interrompere bandiera
PEN = 1; / / Invia condizione di arresto
while (SSPIF == 0); / / Attendere fino a quando condizione di arresto completo
)# endif
Sto cercando di utilizzare l'allegata i2c c file sorgente.
Simulazione in Proteus con 16f876a e fm24c16, whe e inviare un byte (usando SendI2C) nel StartI2C () i disabili sono fissati a 1, che dovrebbe esltimul l'hardware di generare una condizione di avvio (SDA dovrebbe andare basso), ma il problema è l'SDA non va né il basso SSPIF sono di nuovo insieme e ottenere un loop infinito ...
Alcuni si può aiutare?
THX
NeuralC
/************************************************* *****************************
* I2C Header file
*
* Questo file contiene la funzione dei prototipi per l'I2C routine definita
* A I2C.C.
************************************************** ****************************
* /
# ifndef _I2C_H
# define _I2C_H/ / Funzione Prototipi
char SendI2C (char, char, char *);
char GetI2C (char, char, char, char *);
char StartI2C (char);
char ReStartI2C (char);
StopI2C nullo (void);# endif/************************************************* *****************************
* I2C Routines (2002.11.09)
*
* Questo file contiene la routine I2C.
* Ogni routine parametri sono spiegato sopra della dichiarazione della funzione.
************************************************** ****************************
* /
# ifndef _I2C_C
# define _I2C_C
# include "i2c.h"/************************************************* *****************************
* SendI2C
* I2CADD: Indirizzo del dispositivo slave I2C spostato a sinistra di 1 bit
* I2CBYTES: Numero di byte da inviare I2CBUFFER
* I2CBUFFER: Puntatore ad un buffer di stringa contenente i byte di inviare
*
* Questo subroutine trasferimenti I2CBYTES byte di dati da osservare per la stringa
* Da I2CBUFFER al dispositivo slave con indirizzo I2CADD.
*
* Restituisce 1: Invia a termine con successo
* 0: Invia fallito
************************************************** ****************************
* /
char SendI2C (char I2CADD, char I2CBYTES, char * I2CBUFFER)
(
char count = 0;
char bSUCCESS = 1; / / Si supponga di successo di trasferimento
if (StartI2C (I2CADD & 0xFE)) / / Avvia il trasferimento e indicare scrivere
(
while (count <I2CBYTES) / / loop fino a quando tutti i byte sono stati inviati
(
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CBUFFER [count ]; / / Invia byte
while (SSPIF == 0); / / Attendere fino al byte inviati
)
) Else
bSUCCESS = 0; / / Indicare inviare non
StopI2C (); / / Stop al trasferimento
ritorno bSUCCESS; / / Ritorno successo indicatore
)
/************************************************* *****************************
* GetI2C
* I2CADD: Indirizzo del dispositivo slave I2C spostato a sinistra di 1 bit
* I2CCOMMAND:> 0 indica comandato ricevere, nel comando del primo byte
* I2CBUFFER
* = 0 indica normale ricevere
* I2CBYTES: Numero di byte per andare dal dispositivo e scrivere I2CBUFFER
* I2CBUFFER: Puntatore ad una stringa di buffer, bytes leggere saranno memorizzati qui
*
* Questo subroutine trasferimenti I2CBYTES byte di dati dal dispositivo slave
* Indirizzo I2CADD e li memorizza nella I2CBUFFER.Se uno è comandato ricevere
* Indicato da I2CCOMMAND, il primo byte di I2CBUFFER è scritto nel
* Slave dispositivo prima di procedere alla lettura di tutti i dati.
*
* Restituisce 1: ArrivareProspettiPartner successo
* 0: non ArrivareProspettiPartner
************************************************** ****************************
* /
char GetI2C (char I2CADD, char I2CCOMMAND, char I2CBYTES, char * I2CBUFFER)
(
char count = 0;
char bSUCCESS;
if (I2CCOMMAND)
(
bSUCCESS = StartI2C (I2CADD & 0xFE); / / Avvia il trasferimento e indicare scrivere
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CBUFFER [0]; / / Invia comando byte
while (SSPIF == 0); / / Attendere fino al byte inviati
ReStartI2C (I2CADD | 0x01); / / riavviare il trasferimento e indicare leggere
) Else
bSUCCESS = StartI2C (I2CADD | 0x01) / / Avvia il trasferimento e indicare leggere
while (count <I2CBYTES)
(
SSPIF = 0; / / Cancella interrompere bandiera
RCEN = 1; / / Inizializzare leggere sequenza
while (SSPIF == 0);
I2CBUFFER [count ] = SSPBUF; / / Store byte in tampone
SSPIF = 0; / / Cancella interrompere bandiera
if (COUNT == I2CBYTES) / / Se abbiamo letto tutti i byte
ACKDT = 1; / / indicano che
stiamo fatto non ack
altro
ACKDT = 0; / / else riconoscere il byte
ACKEN = 1; / / Start riconoscere la sequenza
while (SSPIF == 0); / / Attendere che riconoscono completo
)
StopI2C (); / / Stop al trasferimento
ritorno bSUCCESS; / / Ritorno successo indicatore
)
/************************************************* *****************************
* StartI2C
* I2CADD: Indirizzo del dispositivo slave I2C (spostato a sinistra di 1 bit) R / W bit
*
* Questo avvia una subroutine I2C trasferimento con l'invio di una condizione di avviare e
* L'indirizzo del dispositivo slave, I2CADD.
*
* Restituisce 1: Slave dispositivo riconosciuto
* 0: Slave dispositivo non riconoscere
************************************************** ****************************
* /
char StartI2C (char I2CADD)
(
SSPIF = 0; / / Cancella interrompere bandiera
SEN = 1; / / Inizializzare iniziare condizione
while (SSPIF == 0); / / Attendere fino a quando l'inizio condizione completo
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CADD; / / Invia l'indirizzo del dispositivo slave
while (SSPIF == 0); / / Attendere fino a quando l'indirizzo è stato inviato
if (ACKSTAT == 0)
return 1; / / return 1 se il dispositivo riconosciuto
altro
return 0; / / return 0 se il dispositivo non ha riconosciuto
)
/************************************************* *****************************
* ReStartI2C
* I2CADD: Indirizzo del dispositivo slave I2C (spostato a sinistra di 1 bit) R / W bit
*
* Questo subroutine invia un riavvio condizione per il dispositivo con indirizzo slave
* I2CADD.
*
* Restituisce 1: Slave dispositivo riconosciuto
* 0: Slave dispositivo non riconoscere
************************************************** ****************************
* /
char ReStartI2C (char I2CADD)
(
SSPIF = 0;
RSEN = 1; / / Inizializzare Riavviare condizione
while (SSPIF == 0); / / Attendere fino a quando l'inizio condizione completo
SSPIF = 0; / / Cancella interrompere bandiera
SSPBUF = I2CADD; / / Invia l'indirizzo del dispositivo slave
while (SSPIF == 0); / / Attendere fino a quando l'indirizzo è stato inviato
if (ACKSTAT == 0)
return 1; / / return 1 se il dispositivo riconosciuto
altro
return 0; / / return 0 se il dispositivo non ha riconosciuto
)
/************************************************* *****************************
* StopI2C
*
* Questo subroutine termina uno I2C trasferimento con l'invio di una condizione di arresto.
************************************************** ****************************
* /
StopI2C nullo (void)
(
SSPIF = 0; / / Cancella interrompere bandiera
PEN = 1; / / Invia condizione di arresto
while (SSPIF == 0); / / Attendere fino a quando condizione di arresto completo
)# endif