CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Problem with SPI protocol for the counter LS7366R

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
romfisch



Joined: 05 May 2013
Posts: 2

View user's profile Send private message

Problem with SPI protocol for the counter LS7366R
PostPosted: Sun May 05, 2013 7:17 am     Reply with quote

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

View user's profile Send private message

PostPosted: Sun May 05, 2013 10:42 am     Reply with quote

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

View user's profile Send private message

PostPosted: Mon May 06, 2013 12:44 am     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Jul 03, 2013 12:05 am     Reply with quote

hi romfisch,

gonna try your program!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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