N
neuralc
Guest
Salut à tous,
J'essaie d'utiliser le joint i2c c fichiers source.
Simulating dans proteus avec 16f876a et fm24c16 et whe-je envoyer un octet (en utilisant SendI2C) dans le StartI2C () SEN sont fixés à 1, que le matériel doit esltimul pour générer un état de départ (SDA devrait faible), mais le problème est le SDA ne va pas, ni le faible SSPIF sont à nouveau ensemble et je suis dans une boucle infinie ...
Certains l'on peut aider?
THX
NeuralC
/************************************************* *****************************
* I2C-tête de fichier
*
* Ce fichier contient les prototypes de fonctions pour les routines I2C définie
* En I2C.C.
************************************************** ****************************
* /
# ifndef _I2C_H
# define _I2C_H/ / Fonction Prototypes
char SendI2C (char, char, char *);
char GetI2C (char, char, char, char *);
char StartI2C (char);
char ReStartI2C (char);
void StopI2C (void);# endif/************************************************* *****************************
Routines I2C * (2002.11.09)
*
* Ce fichier contient les routines I2C.
* Chaque routine
de paramètres sont expliquées ci-dessus la déclaration de la fonction.
************************************************** ****************************
* /
# ifndef _I2C_C
# define _I2C_C
#
include "i2c.h"/************************************************* *****************************
* SendI2C
* I2CADD: Adresse de l'esclave I2C décalé à gauche de 1 bit
* I2CBYTES: Nombre d'octets à envoyer de I2CBUFFER
* I2CBUFFER: Pointeur sur une chaîne de caractères contenant le tampon octets à envoyer
*
* Ce sous-I2CBYTES octets de transferts de données à partir de la chaîne a fait à
* Par I2CBUFFER à l'esclave à l'adresse I2CADD.
*
* Renvoie 1: Envoyer terminé avec succès
* 0: Envoyer échoué
************************************************** ****************************
* /
SendI2C char (char I2CADD, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS = 1; / / Supposons un transfert réussi
if (StartI2C (I2CADD & 0xFE)) / / Début de transfert et d'indiquer à écrire
(
while (count <I2CBYTES) / / boucle
jusqu'à ce que tous les octets ont été envoyés
(
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CBUFFER [count ]; / / Envoyer byte
while (SSPIF == 0) / / Attendre
jusqu'à ce que des octets envoyés
)
) Else
bSUCCESS = 0; / / Indiquer pas envoyer
StopI2C (); / / Arrêter le transfert
retour bSUCCESS; / / Retourner l'indicateur de succès
)
/************************************************* *****************************
* GetI2C
* I2CADD: Adresse de l'esclave I2C décalé à gauche de 1 bit
* I2CCOMMAND:> 0 indique le commandement de recevoir, dans le premier octet de commande de
* I2CBUFFER
* = 0 indique recevoir normal
* I2CBYTES: Nombre d'octets pour obtenir de l'appareil et à écrire à I2CBUFFER
* I2CBUFFER: Pointeur sur une chaîne de caractères buffer, lu octets seront stockés ici
*
* Ce sous-I2CBYTES transferts d'octets de données de l'esclave à
* Adresse I2CADD et les stocke dans I2CBUFFER.Si une commande est de recevoir
* Indique I2CCOMMAND, le premier octet de I2CBUFFER est écrit dans le
* Esclave avant la lecture des données.
*
* Renvoie 1:
Avoir réussi
* 0: Get a échoué
************************************************** ****************************
* /
GetI2C char (char I2CADD, I2CCOMMAND char, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS;
if (I2CCOMMAND)
(
bSUCCESS = StartI2C (I2CADD & 0xFE) / / Début de transfert et d'indiquer à écrire
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CBUFFER [0] / / Send command byte
while (SSPIF == 0) / / Attendre
jusqu'à ce que des octets envoyés
ReStartI2C (I2CADD | 0x01) / /
relancer le transfert de lire et d'indiquer
) Else
bSUCCESS = StartI2C (I2CADD | 0x01) / / Début de transfert et d'indiquer lire
while (count <I2CBYTES)
(
SSPIF = 0; / / Clear interrupt flag
RCEN = 1; / / Lancer lire la séquence
while (SSPIF == 0);
I2CBUFFER [count ] = SSPBUF / / octet de la mémoire tampon de magasin
SSPIF = 0; / / Clear interrupt flag
if (count == I2CBYTES) / / Si nous
avons lu tous les octets
ACKDT = 1; / / indiquer nous fait pas ack
autre
ACKDT = 0; / /
sinon reconnaître l'octet
ACKEN = 1; / / Start reconnaître séquence
while (SSPIF == 0) / / Attendre
jusqu'à ce que reconnaissent complet
)
StopI2C (); / / Arrêter le transfert
retour bSUCCESS; / / Retourner l'indicateur de succès
)
/************************************************* *****************************
* StartI2C
* I2CADD: Adresse de l'esclave I2C (à gauche décalée de 1 bit) R / W bit
*
* Cette sous-routine I2C lance un transfert par l'envoi d'un état de départ et
* L'adresse esclave, I2CADD.
*
* Renvoie 1: Slave périphérique reconnu
* 0: Slave appareil ne reconnaît pas
************************************************** ****************************
* /
StartI2C char (char I2CADD)
(
SSPIF = 0; / / Clear interrupt flag
SEN = 1; / / Lancer état de départ
while (SSPIF == 0) / / Attendre que l'état complet de début
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CADD; / / Envoyer l'adresse de l'esclave
while (SSPIF == 0) / / Attendre que l'adresse a été envoyé
if (ACKSTAT == 0)
return 1; / /
Retourne 1 si le dispositif reconnu
autre
return 0; / /
Retourne 0 si l'appareil
n'a pas reconnu
)
/************************************************* *****************************
* ReStartI2C
* I2CADD: Adresse de l'esclave I2C (à gauche décalée de 1 bit) R / W bit
*
* Cette sous-routine envoie un redémarrage à la condition esclave à l'adresse
* I2CADD.
*
* Renvoie 1: Slave périphérique reconnu
* 0: Slave appareil ne reconnaît pas
************************************************** ****************************
* /
ReStartI2C char (char I2CADD)
(
SSPIF = 0;
RSEN = 1; / / Lancer un redémarrage condition
while (SSPIF == 0) / / Attendre
jusqu'à ce que condition de démarrage complet
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CADD; / / Envoyer l'adresse de l'esclave
while (SSPIF == 0) / / Attendre que l'adresse a été envoyé
if (ACKSTAT == 0)
return 1; / /
Retourne 1 si le dispositif reconnu
autre
return 0; / /
Retourne 0 si l'appareil
n'a pas reconnu
)
/************************************************* *****************************
* StopI2C
*
* Cette sous-routine se termine I2C un transfert par l'envoi d'un état d'arrêt.
************************************************** ****************************
* /
void StopI2C (void)
(
SSPIF = 0; / / Clear interrupt flag
PEN = 1; / / Envoyer Stop condition
while (SSPIF == 0) / / l'état d'attente
jusqu'à l'arrêt complet
)# endif
J'essaie d'utiliser le joint i2c c fichiers source.
Simulating dans proteus avec 16f876a et fm24c16 et whe-je envoyer un octet (en utilisant SendI2C) dans le StartI2C () SEN sont fixés à 1, que le matériel doit esltimul pour générer un état de départ (SDA devrait faible), mais le problème est le SDA ne va pas, ni le faible SSPIF sont à nouveau ensemble et je suis dans une boucle infinie ...
Certains l'on peut aider?
THX
NeuralC
/************************************************* *****************************
* I2C-tête de fichier
*
* Ce fichier contient les prototypes de fonctions pour les routines I2C définie
* En I2C.C.
************************************************** ****************************
* /
# ifndef _I2C_H
# define _I2C_H/ / Fonction Prototypes
char SendI2C (char, char, char *);
char GetI2C (char, char, char, char *);
char StartI2C (char);
char ReStartI2C (char);
void StopI2C (void);# endif/************************************************* *****************************
Routines I2C * (2002.11.09)
*
* Ce fichier contient les routines I2C.
* Chaque routine
de paramètres sont expliquées ci-dessus la déclaration de la fonction.
************************************************** ****************************
* /
# ifndef _I2C_C
# define _I2C_C
#
include "i2c.h"/************************************************* *****************************
* SendI2C
* I2CADD: Adresse de l'esclave I2C décalé à gauche de 1 bit
* I2CBYTES: Nombre d'octets à envoyer de I2CBUFFER
* I2CBUFFER: Pointeur sur une chaîne de caractères contenant le tampon octets à envoyer
*
* Ce sous-I2CBYTES octets de transferts de données à partir de la chaîne a fait à
* Par I2CBUFFER à l'esclave à l'adresse I2CADD.
*
* Renvoie 1: Envoyer terminé avec succès
* 0: Envoyer échoué
************************************************** ****************************
* /
SendI2C char (char I2CADD, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS = 1; / / Supposons un transfert réussi
if (StartI2C (I2CADD & 0xFE)) / / Début de transfert et d'indiquer à écrire
(
while (count <I2CBYTES) / / boucle
jusqu'à ce que tous les octets ont été envoyés
(
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CBUFFER [count ]; / / Envoyer byte
while (SSPIF == 0) / / Attendre
jusqu'à ce que des octets envoyés
)
) Else
bSUCCESS = 0; / / Indiquer pas envoyer
StopI2C (); / / Arrêter le transfert
retour bSUCCESS; / / Retourner l'indicateur de succès
)
/************************************************* *****************************
* GetI2C
* I2CADD: Adresse de l'esclave I2C décalé à gauche de 1 bit
* I2CCOMMAND:> 0 indique le commandement de recevoir, dans le premier octet de commande de
* I2CBUFFER
* = 0 indique recevoir normal
* I2CBYTES: Nombre d'octets pour obtenir de l'appareil et à écrire à I2CBUFFER
* I2CBUFFER: Pointeur sur une chaîne de caractères buffer, lu octets seront stockés ici
*
* Ce sous-I2CBYTES transferts d'octets de données de l'esclave à
* Adresse I2CADD et les stocke dans I2CBUFFER.Si une commande est de recevoir
* Indique I2CCOMMAND, le premier octet de I2CBUFFER est écrit dans le
* Esclave avant la lecture des données.
*
* Renvoie 1:
Avoir réussi
* 0: Get a échoué
************************************************** ****************************
* /
GetI2C char (char I2CADD, I2CCOMMAND char, char I2CBYTES, char * I2CBUFFER)
(
char COUNT = 0;
char bSUCCESS;
if (I2CCOMMAND)
(
bSUCCESS = StartI2C (I2CADD & 0xFE) / / Début de transfert et d'indiquer à écrire
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CBUFFER [0] / / Send command byte
while (SSPIF == 0) / / Attendre
jusqu'à ce que des octets envoyés
ReStartI2C (I2CADD | 0x01) / /
relancer le transfert de lire et d'indiquer
) Else
bSUCCESS = StartI2C (I2CADD | 0x01) / / Début de transfert et d'indiquer lire
while (count <I2CBYTES)
(
SSPIF = 0; / / Clear interrupt flag
RCEN = 1; / / Lancer lire la séquence
while (SSPIF == 0);
I2CBUFFER [count ] = SSPBUF / / octet de la mémoire tampon de magasin
SSPIF = 0; / / Clear interrupt flag
if (count == I2CBYTES) / / Si nous
avons lu tous les octets
ACKDT = 1; / / indiquer nous fait pas ack
autre
ACKDT = 0; / /
sinon reconnaître l'octet
ACKEN = 1; / / Start reconnaître séquence
while (SSPIF == 0) / / Attendre
jusqu'à ce que reconnaissent complet
)
StopI2C (); / / Arrêter le transfert
retour bSUCCESS; / / Retourner l'indicateur de succès
)
/************************************************* *****************************
* StartI2C
* I2CADD: Adresse de l'esclave I2C (à gauche décalée de 1 bit) R / W bit
*
* Cette sous-routine I2C lance un transfert par l'envoi d'un état de départ et
* L'adresse esclave, I2CADD.
*
* Renvoie 1: Slave périphérique reconnu
* 0: Slave appareil ne reconnaît pas
************************************************** ****************************
* /
StartI2C char (char I2CADD)
(
SSPIF = 0; / / Clear interrupt flag
SEN = 1; / / Lancer état de départ
while (SSPIF == 0) / / Attendre que l'état complet de début
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CADD; / / Envoyer l'adresse de l'esclave
while (SSPIF == 0) / / Attendre que l'adresse a été envoyé
if (ACKSTAT == 0)
return 1; / /
Retourne 1 si le dispositif reconnu
autre
return 0; / /
Retourne 0 si l'appareil
n'a pas reconnu
)
/************************************************* *****************************
* ReStartI2C
* I2CADD: Adresse de l'esclave I2C (à gauche décalée de 1 bit) R / W bit
*
* Cette sous-routine envoie un redémarrage à la condition esclave à l'adresse
* I2CADD.
*
* Renvoie 1: Slave périphérique reconnu
* 0: Slave appareil ne reconnaît pas
************************************************** ****************************
* /
ReStartI2C char (char I2CADD)
(
SSPIF = 0;
RSEN = 1; / / Lancer un redémarrage condition
while (SSPIF == 0) / / Attendre
jusqu'à ce que condition de démarrage complet
SSPIF = 0; / / Clear interrupt flag
SSPBUF = I2CADD; / / Envoyer l'adresse de l'esclave
while (SSPIF == 0) / / Attendre que l'adresse a été envoyé
if (ACKSTAT == 0)
return 1; / /
Retourne 1 si le dispositif reconnu
autre
return 0; / /
Retourne 0 si l'appareil
n'a pas reconnu
)
/************************************************* *****************************
* StopI2C
*
* Cette sous-routine se termine I2C un transfert par l'envoi d'un état d'arrêt.
************************************************** ****************************
* /
void StopI2C (void)
(
SSPIF = 0; / / Clear interrupt flag
PEN = 1; / / Envoyer Stop condition
while (SSPIF == 0) / / l'état d'attente
jusqu'à l'arrêt complet
)# endif