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 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