Proteus e I2C

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

 
Io non deap analizzare il codice, ma in generale le cuciture ok.Avete messo la resistenza di pull-up a SDA e SCL linee?
Usa proteo log per vedere se la ricezione eeprom è l'inizio e la fermata condizioni.Cercherò di guardare il codice meglio durante la notte.

 
HUPS ...:!!!!
Lettura meglio aiutare il PIC16 modello, a mio avviso:

I2C non modellato - assegnazione di SSPCON2 solo negozi valore.
I2C non modellato - assegnazione di SSPADD solo negozi valore.
I2C non modellato - leggere di SSPCON2 restituisce solo il valore corrente.
I2C non modellato - leggere di SSPADD restituisce solo il valore corrente.

Il modello di PIC non il modello I2C modalità della MSSP.
Iscritto al SSPCON2 o registri SSPADD semplicemente memorizza il valore iscritto nel registro e non avviare qualsiasi altra azione.
Lettura dei registri restituisce loro valori iniziali o il valore ultimo scritto per loro.
SO è spiegato .....

SDA, SCL, hanno pull up, thx Elavionic

THX

NeuralC

 
ciao amicoun esempio migliore è già in proteo come interfaccia con 12c pic vedere file di esempio, anche se si dispone di eliminare il problema con la lettura di pic16dll
file di aiuto

 

Welcome to EDABoard.com

Sponsor

Back
Top