|
|
View previous topic :: View next topic |
Author |
Message |
romfisch
Joined: 05 May 2013 Posts: 2
|
Problem with SPI protocol for the counter LS7366R |
Posted: Sun May 05, 2013 7:17 am |
|
|
Hello,
I'm trying to communicate in SPI with the counter LS7366R, but it doesn't work.
So I do a test :
1) First, in the function Init_L7366R I initialize the registers MDR0 and MDR1.
2) Secondly, every 2 seconds, I ask the counter to give me the value of the register MDR1.
3) Finally the Pic send me this value (via RS232).
I did a test and the RS232 is OK. But I always get the value Ox00 when the pic should send me the value OxC3.
Code: |
#include <16F876A.h>
#include <stdio.h> //Librairie standard (x: printf, scanf, etc...)
#include <stdlib.h> // Librairie pour la fonction abs
#USE DELAY (clock = 20000000) // Frequence horloge = 20Mhz
#FUSES NOWDT,HS, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv = PIN_C7, bits=8, stop=1)
// Voir s'il faut faire un : #use spi (options=) !!!!
// Les defines (en majuscules car directive pré-processeur):
#define SS PIN_C0 // Pin de selection du slave
#define SDO PIN_C5 //
#define SDI PIN_C4
#define SCK PIN_C3
#define LED_DEBUG1 PIN_A0
#define LED_DEBUG2 PIN_A5
#define ENABLE PIN_C1
#define IN_A PIN_A2
#define IN_B PIN_A1
//----------Variables LS7366R-------------------------
#define WR_MDR0 0x88 // Registre qui configure le mode de quadrature, le mode de comptage et le mode d'indexage
#define WR_MDR1 0x90 // Registre qui configure la taille du compteur et l'utilisation des flags.
#define CONF_MDR0 0x01 // [0000 0001] : b7=FilterClockDivisionFactor|
#define CONF_MDR1 0xC3 // [1100 0011] : b7=Flag_on_Carry |b6=Flag_on_Borrow|b5=NOP|b4=NOP|b3=Not_Used|b2==Enable_Couting|b1b0=1-Byte_counter_Mode
#define LOAD_OTR 0xE8 // Transfer CTNR to OTR in "parallel" : permet ensuite de lire OTR sans perturber le comptage !
#define READ_OTR 0x68 // Une fois le contenu de CNTR transféré dans OTR, on lit OTR.
#define READ_STR 0x70 // STR registre d'info sur l'état du compteur : b7=carry |b6=Borrow| b5=CMP| b4=INDEX_LATCH| b3=CEN|b2=PLS| b1=Conut_Direction_Indecator| b0=Sign_Bit
#define CLEAR_STR 0x30
#define CLEAR_CTR 0x20
#define READ_CTR 0x60
#define READ_MDR0 0x48
#define READ_MDR1 0x50
//----------------------------------------------------
#bit BF = 0x94.0 // Bit 0 du registre SSPSTAT : 0 : pas de donnée dans SSPBUF // 1 : Il y a une donnée dans SSPBUF
#bit SMP = 0x94.7 // Bit 7 du registre SSPSTAT : Détermine a quel moment du cycle d'horloge on effectue la capture du bit sur SDI (0: Milieu | 1 : Fin)
#bit CKE = 0x94.6 // Bit 6 du registre SSPSTAT : Détermine que sens de transistion d'horloge accompagne le placement du bit sur SDO (0 : Repos -> Actif)
#bit CKP = 0x14.4 // Bit 4 du registre SSPCON : Donne le niveau de l'etat de repos (0 : Etat de repos = Etat Bas | 1 : Etat de repos = Etat Haut)
#bit SSPEN = 0x14.5 // Bit 5 du registre SSPCON : 1 = Mise en route du module SSP
#bit WCOL = 0x14.7 // Bit 7 du registre SSPCON : 1 = on a essayé d'écrire dans SSPBUF (pour envoyer un nv octet) alors que le transfer de l'octet précédent n'est pas encore envoyé
#byte SSPBUF = 0x13
#int_RDA // Interruption rs232
void RDA_isr()
{
char recu;
recu = getchar();
putchar(recu);
output_toggle(LED_DEBUG2);
if (recu==0x65)
{
output_toggle(LED_DEBUG1);
}
}
//Prototypes des fonctions :
char Lire_Data(char);
void Init_L7366R(void);
void main()
{
// Déclaration des variables locales au Main :
int compteur=1;
port_b_pullups(TRUE); //Resistance PullUp du port B
output_bit(ENABLE,0); // Désactive le L6203
// Initilisation :
output_bit(LED_DEBUG1,1); // Les diodes de Debug sont utilisées pour repérer un eventuel reset du Pic
output_bit(LED_DEBUG2,1);
delay_ms(2000); // Petite tempo pour laisser le temps à l'alim de se stabiliser.
output_bit(LED_DEBUG1,0); // Les diodes de Debug sont utilisées pour repérer un eventuel reset du Pic
output_bit(LED_DEBUG2,0);
setup_adc_ports(NO_ANALOGS) ; // Toutes les pins du ports A sont en digital
// Reglage des Timers :
setup_timer_2 (T2_DIV_BY_1, 200, 1); // Prédiviseur=1|PR2=200(->F_PWM=25KHz)|Postdiviseur=1, mais on s'en fout pour le PWM
// Direction des ports : (1 = Entrée; 0 = Sortie)
SET_TRIS_A( 0b000000); // *
SET_TRIS_B( 0b00000000); // *
SET_TRIS_C( 0b10010000); // RC4=entrée, car SDI| RC7=entrée, car RX
// Mise en route du module SPI
setup_spi(spi_master |spi_l_to_h | SPI_CLK_DIV_64 ); // En mode master| On completera par CKE et CKP | F_SPI = F_cycle /16 = 5MHz / 16 = 312.5 kHz
CKP =0; // Etat de repos = Etat Bas (0)
CKE=1; // Le master met sa donnée lors de la transition : Etat de Repos --> Etat Actif
SMP = 0; // Le master lit sa donnée en milieu du cycle (car le slve place sa donnée en début de cycle. cf son Datasheet)
//Autorisation des interruptions :
enable_interrupts(INT_RDA); // Autorise les interruptions rs232
enable_interrupts(GLOBAL); // Autorisation globale des interruptions
output_bit(IN_B,1); // on compte dans le sens positif
Init_L7366R(); // On configure les registres MDR0 et MDR1 du LS7366R
output_bit(SS,1); // Deselectionne le slave
while (1)
{
delay_ms(2000);
compteur = Lire_Data(READ_MDR1);
putchar (compteur);
}
}
void Init_L7366R(void)
{
char donnee;
output_bit(SS,1);
delay_ms(1);
output_bit(SS,0); // Selectionne le Slave
delay_us(1); // tempo de 1 us (datasheet dit 120 ns)
SPI_write(WR_MDR0); // On veut configurer MDR0
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee =spi_read(); // On lit la donnée pour effacer le Flag SSPSTAT,BF
SPI_write(CONF_MDR0); // On envoie la config de MDR0
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee =spi_read(); // On lit la donnée pour effacer le Flag SSPSTAT,BF
output_bit(SS,1); // Deselectionne le slave
WCOL =0;
output_bit(SS,1);
delay_ms(1);
output_bit(SS,0); // Selectionne le Slave
delay_us(1); // tempo de 1 us (datasheet dit 120 ns)
SPI_write(WR_MDR1); // On veut configurer MDR1
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee =spi_read(); // On lit la donnée pour effacer le Flag SSPSTAT,BF
SPI_write(CONF_MDR1); // On envoie la config de MDR0
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee =spi_read(); // On lit la donnée pour effacer le Flag SSPSTAT,BF
output_bit(SS,1); // Deselectionne le slave
WCOL=0;
}
char Lire_Data(char op_code)
{
char donnee_slave; // Attention à la taile de la variable selon la config du compteur du LS7366R
output_bit(SS,1);
delay_ms(1);
output_bit(SS,0); // Selectionne le Slave
delay_us(1); // tempo de 1 us (datasheet dit 120 ns)
SPI_write(op_code); // Envoie la commande
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee_slave =spi_read(); // On lit la donnée pour effacer le Flag SSPSTAT,BF
SPI_write(0x00); // Envoie une "dummy" donnée pour lire la donnée envoyée par le Slave
while(!spi_data_is_in()){} // On boucle tant qu'on n'a rien reçu dans SSPBUF (<=> Fin de com) <==ON POURRAIT EGALEMENT TESTER SSPSTAT,BF==>
donnee_slave =spi_read();
output_bit(SS,1); // Deselectionne le slave
return donnee_slave;
} |
Someone could tell me where I do a error ?
For information here is the datasheet of the counter
http://www.lsicsi.com/pdfs/Data_Sheets/LS7366R.pdf
My version of the compiler is : 4.013
I thank you per advance for your help.
Romain |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 05, 2013 10:42 am |
|
|
Your program is complex and it could be much more simple.
But first,
1. What is the Vdd voltage of the PIC and of the LS7366 ?
Are they both 5v ? Or is there a different Vdd voltage on each chip?
2. Post a list of the SPI pin connections between the PIC and the LS7366.
Post the pin numbers, not the pin names. |
|
|
romfisch
Joined: 05 May 2013 Posts: 2
|
|
Posted: Mon May 06, 2013 12:44 am |
|
|
Hello,
and thank you for your answer.
I find my error : There was an error on the connections between the Pic and the counter.
Now it works !
Romain |
|
|
hasimi20
Joined: 04 Sep 2010 Posts: 19
|
|
Posted: Wed Jul 03, 2013 12:05 am |
|
|
hi romfisch,
gonna try your program! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|