Proteus og I2C

N

neuralc

Guest
Hei alle,

Jeg prøver å bruke den vedlagte i2c c kildefilene.

Simulere i Proteus med 16f876a og fm24c16 og whe jeg sende en byte (med SendI2C) i StartI2C () at SEN er satt til 1, som bør esltimul maskinvaren til å generere en start tilstand (SDA bør gå lavt), men problemet er SDA ikke går lav verken SSPIF satt igjen, og jeg får en uendelig loop ...

Noen en kan hjelpe?

THX

NeuralC

/************************************************* *****************************
* I2C topptekstfilen
*
* Denne filen inneholder funksjonen prototyper for I2C rutiner definert
* I I2C.C.
************************************************** ****************************
* /

# ifndef _I2C_H
# define _I2C_H/ / Funksjon prototyper

char SendI2C (char, røye, char *);
char GetI2C (char, røye, røye, char *);
char StartI2C (char);
char ReStartI2C (char);
void StopI2C (void);# endif/************************************************* *****************************
* I2C Rutiner (2002.11.09)
*
* Denne filen inneholder I2C rutiner.
* Hver rutine's parametere er forklart ovenfor funksjonen erklæringen.
************************************************** ****************************
* /

# ifndef _I2C_C
# define _I2C_C

#
include "i2c.h"/************************************************* *****************************
* SendI2C
* I2CADD: Adresse til I2C slave enheten skiftet etter 1 bit
* I2CBYTES: Antall byte å sende fra I2CBUFFER
* I2CBUFFER: Peker til en streng buffer inneholder byte å sende
*
* Dette subroutine overføringer I2CBYTES byte med data fra strengen påpekt
* By I2CBUFFER til slave enhet på adressen I2CADD.
*
* Returnerer 1: Send fullført
* 0: Send mislyktes
************************************************** ****************************
* /

char SendI2C (char I2CADD, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS = 1; / / Anta vellykket overføring

if (StartI2C (I2CADD & 0xFE)) / / Start overføring og indiker skrive
(
while (COUNT <I2CBYTES) / / Loop til alle byte er sendt
(
SSPIF = 0; / / Clear avbruddsordrelinje flagg
SSPBUF = I2CBUFFER [COUNT ]; / / Send byte

while (SSPIF == 0); / / Vent til byte sendt
)
) Else
bSUCCESS = 0; / / Indiker sende mislyktes

StopI2C (); / / Stopp overføring

return bSUCCESS; / / Return suksess indikator
)

/************************************************* *****************************
* GetI2C
* I2CADD: Adresse til I2C slave enheten skiftet etter 1 bit
* I2CCOMMAND:> 0 indikerer befalt motta, kommandoen i første byte av
* I2CBUFFER
* = 0 angir normal motta
* I2CBYTES: Antall byte for å få fra enheten og skrive til I2CBUFFER
* I2CBUFFER: Peker til en streng buffer, bytes les vil bli lagret her
*
* Dette subroutine overføringer I2CBYTES bytes av data fra slave enheten på
* Adresse I2CADD og lagrer dem i I2CBUFFER.Hvis en befalt mottar er
* Indikert av I2CCOMMAND den første byte av I2CBUFFER skrives til
* Slave enheten før du leser data.
*
* Returnerer 1: Få vellykket
* 0: Få mislyktes
************************************************** ****************************
* /

char GetI2C (char I2CADD, char I2CCOMMAND, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS;

if (I2CCOMMAND)
(
bSUCCESS = StartI2C (I2CADD & 0xFE); / / Start overføring og indiker skrive

SSPIF = 0; / / Clear avbruddsordrelinje flagg
SSPBUF = I2CBUFFER [0]; / / Send kommando byte

while (SSPIF == 0); / / Vent til byte sendt

ReStartI2C (I2CADD | 0x01); / / Start overføring og indiker lese
) Else
bSUCCESS = StartI2C (I2CADD | 0x01); / / Start overføring og indiker lese

while (COUNT <I2CBYTES)
(
SSPIF = 0; / / Clear avbruddsordrelinje flagg
RCEN = 1; / / Start lese sekvens

while (SSPIF == 0);

I2CBUFFER [COUNT ] = SSPBUF; / / Store byte i buffer
SSPIF = 0; / / Clear avbruddsordrelinje flagg

if (COUNT == I2CBYTES) / / Hvis vi
har lest alle bytes
ACKDT = 1; / / indikerer vi gjort ved å ikke ack
ellers
ACKDT = 0; / / else erkjenne byte

ACKEN = 1; / / Start erkjenner sekvens

while (SSPIF == 0); / / Vent til erkjenner komplett
)

StopI2C (); / / Stopp overføring

return bSUCCESS; / / Return suksess indikator
)

/************************************************* *****************************
* StartI2C
* I2CADD: Adresse til I2C slave enhet (venstre forskjøvet av 1 bit) R / W bit
*
* Dette subroutine initierer en I2C overføre ved å sende en start tilstand og
*
The slave enheten adresse, I2CADD.
*
* Returnerer 1: Slave enhet erkjente
* 0: Slave enheten mislyktes å erkjenne
************************************************** ****************************
* /

char StartI2C (char I2CADD)
(
SSPIF = 0; / / Clear avbruddsordrelinje flagg
SEN = 1; / / Start starte tilstand

while (SSPIF == 0); / / Vent til Start tilstand komplett

SSPIF = 0; / / Clear avbruddsordrelinje flagg
SSPBUF = I2CADD; / / Send adressen til slave enhet

while (SSPIF == 0); / / Vent til adressen er sendt

if (ACKSTAT == 0)
return 1; / / Return 1 hvis enheten erkjente
ellers
return 0; / / Returner 0 hvis enheten ikke erkjenner
)

/************************************************* *****************************
* ReStartI2C
* I2CADD: Adresse til I2C slave enhet (venstre forskjøvet av 1 bit) R / W bit
*
* Dette subroutine sender en omstart tilstanden til slave enheten ved adresse
* I2CADD.
*
* Returnerer 1: Slave enhet erkjente
* 0: Slave enheten mislyktes å erkjenne
************************************************** ****************************
* /

char ReStartI2C (char I2CADD)
(
SSPIF = 0;
RSEN = 1; / / Start Start tilstand

while (SSPIF == 0); / / Vent til start tilstand komplett

SSPIF = 0; / / Clear avbruddsordrelinje flagg
SSPBUF = I2CADD; / / Send adressen til slave enhet

while (SSPIF == 0); / / Vent til adressen er sendt

if (ACKSTAT == 0)
return 1; / / Return 1 hvis enheten erkjente
ellers
return 0; / / Returner 0 hvis enheten ikke erkjenner
)

/************************************************* *****************************
* StopI2C
*
* Dette subroutine ender en I2C overføre ved å sende en Stopp tilstand.
************************************************** ****************************
* /

void StopI2C (void)
(
SSPIF = 0; / / Clear avbruddsordrelinje flagg
PEN = 1; / / Send Stopp tilstand

while (SSPIF == 0); / / Vent til stoppe tilstand komplett
)# endif

 
Jeg vil ikke analysere deap koden din, men generelt sømmer ok.Vil du sette pull-up motstander på SDA og SCL linjer?
Bruk Proteus-logger for å se om EEPROM mottar start og stopp forhold.Skal jeg prøve å se på koden din bedre i løpet av natten.

 
HUPS ...:!!!!
Reading bedre PIC16 modellen hjelper,
kan jeg vise:

I2C ikke modellert - Oppgaven til SSPCON2 bare lagrer verdien.
I2C ikke modellert - Oppgaven til SSPADD bare lagrer verdien.
I2C ikke modellert - lest av SSPCON2 bare returnerer gjeldende verdien.
I2C ikke modellert - lest av SSPADD bare returnerer gjeldende verdien.

Den PIC modellen ikke modell I2C modus på MSSP.
Skriftlig til SSPCON2 eller SSPADD registrerer bare lagrer skrevet verdien i register og ikke egge andre tiltak.
Leser registrerer tilbake sine opprinnelige verdier eller verdien siste skrevet til dem.
SO forklares .....

SDA, SCL har trekker opp, thx Elavionic

THX

NeuralC

 
hi vennet bedre eksempel er allerede i Proteus hvordan grensesnittet 12C med pic se eksempelvarianter filen, selv om du er kvitt problemet ved å lese av pic16dll
hjelpefil

 

Welcome to EDABoard.com

Sponsor

Back
Top