Proteus et I2C

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

 
Je ne suis pas d'analyser DEAP votre code, mais, en général, les coutures ok.Avez-vous mis le pull-up à la résistance des lignes SDA et SCL?
Utilisez proteus logs pour voir si l'eeprom est la réception de la démarrer et d'arrêter les conditions.Je
vais essayer de regarder le code de votre mieux pendant la nuit.

 
HUPS ...:!!!!
Lecture PIC16 modèle le mieux aider, je considère:

I2C pas le modèle - la cession de magasins SSPCON2 seulement valeur.
I2C pas le modèle - la cession de magasins SSPADD seulement valeur.
I2C pas modélisé - lire des SSPCON2 renvoie uniquement la valeur actuelle.
I2C pas modélisé - lire des SSPADD renvoie uniquement la valeur actuelle.

Le modèle de PIC ne I2C modèle le mode de la MSSP.
Écrit à l'SSPCON2 ou SSPADD enregistre simplement les magasins valeur écrite dans le registre et ne pas susciter de toute autre action.
La lecture des registres de rendement ou de leur valeur initiale de la valeur dernier écrit pour eux.
SO est expliqué .....

SDA, SCL, ont pull up, thx Elavionic

THX

NeuralC

 
salut amiun meilleur exemple est déjà en proteus comment 12c interface avec pic voir l'exemple de fichier, même si vous avez vous débarrasser du problème par la lecture de pic16dll
fichier d'aide

 

Welcome to EDABoard.com

Sponsor

Back
Top