Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[PIC] SPI problem while sending multiple bytes to slave. BOth master and slave are 18f452

Status
Not open for further replies.

AmmarAkhlaq

Junior Member level 1
Joined
Dec 12, 2013
Messages
17
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
162
Need help to understand why my slave comtroller is not displaying data:
master is sending correctly but slave is not responding: I have attached mikroC project and proteus 8 simulation.
when I am saved data from master in single variable slave responded correctly when I switch to multiple variable it does not responds.
A nice advice or help would will very kind.
 

Attachments

  • V11.rar
    67 KB · Views: 91

You'll need to change at least two things:
- synchronize slave receiption on SS signal
- get rid of waits in the slave code that cause loss of data in the present design
 
synchronize slave receiption on SS signal
can you explain it more?
as far I understood
make SS low sent byte and make SS high right after sending byte out.?
 

SS handling on the master side is O.K., on the slave side, enabling SS control as you did will assure byte consistency. But you can use it also to detect the start of a multi-byte frame, which isn't done yet.

The more important point in my post is about unsuitable delays in the slave code.
 

SS handling on the master side is O.K., on the slave side, enabling SS control as you did will assure byte consistency. But you can use it also to detect the start of a multi-byte frame, which isn't done yet.

The more important point in my post is about unsuitable delays in the slave code.

Here is I am positing updated code for both slave and master with the video clip of what I got so far. red leds are data transmitted by master while yellow is data received by slave . I should get continues sending and receiving but it is not happing. You can see it in video clip. is still not understand that thing about SS.
Help me out I badly needed :sad:
Code:
unsigned char Theta1,Theta2,Theta3,Count2,Count3,datain,intiCom,  ready,Thetax=0,Thetay,Thetaz,x,y,z1,reset;
unsigned char Write(char dataout);
void mapInput();
void SysInit();
void sent_data(unsigned char Theta1 ,unsigned char Theta2 , unsigned char Theta3 );
void main(){
      SysInit();
      intiCom=0;
      PORTB=0xFF;
      delay_ms(1000);
      PORTB=0x00;
      intiCom=Write(0x0F); // inititalize the communication:    1
      //Send 0x0F if reviced is F0 the Communication line is stablish
      PORTB = intiCom;
      //Delay_ms(500);
      if(intiCom==0xF0)
      {
         while(1)
         {
             sent_data(45,45,1);
             delay_ms(500);
             sent_data(45,45,2);
         }
      }


}
unsigned char Write(unsigned char dataout)
{

      PORTD = dataout;
      PORTC.B2=0;          // SS select low  slave is selected  port C pin 2
      delay_ms(50);        // wait
      SPI1_Write(dataout); // transmit the dataout
      while(SSPSTAT.BF);   // wait till end of data transmission
      delay_ms(50);        // wait.
      PORTC.B2=1;
      return  SSPBUF;
}
void SysInit()
{
     TRISA=0xFF; // configure Port A as input
     ADCON1=0x06;// disable ADC and make all the pins of Port A as digital input.
     TRISD=0x00; // configure Port D as output
     PORTD=0x00; // Clear all pin of Port D
     TRISB=0x00; // configure Port B as output
     PORTB=0x00; // Clear all pin of Port B
     TRISC.B2=0; // Output for Slave select
     TRISC.B3=0; // SCK output
     TRISC.B4=1; // SDI input
     TRISC.B5=0; // SDO output
     PORTC.B2=1; // SS select high no slave is select
     //Set SPI1 module to master mode, clock = Fosc/4, data sampled at the middle of interval,
     //clock idle state low and data transmitted at low to high edge:
     SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); // Setup the spi
}
void sent_data(unsigned char Theta1 ,unsigned char Theta2 , unsigned char Theta3 )
{

          ready=Write(0x10);            //2
          Delay_ms(50);
          if(ready==0x70)
          {
              Thetax=Write(Theta1);     //3
              Delay_ms(50);
          }
          if(Thetax==0x30)
          {
                x=Write(0x05);          //4
                Delay_ms(50);
          }
          if(x==0x40)
          {
            Thetay=Write(Theta2);       //5
            Delay_ms(50);
          }
          if(Thetay==0x50)
          {
             y=Write(0x06);             //6

             Delay_ms(50);
          }
          if(y==0x60)
         {
            Thetaz=Write(Theta3);       //7
            //PORTB=Thetaz;
            Delay_ms(50);
         }
         if(Thetaz==0x80)
         {
                z1=Write(0x08);         //8
                //PORTB=z1;
                Delay_ms(50);
         }
         if((z1==0x90)&&(y==0x60)&&(x==0x40))
         {
             reset= Write(0x09);        //9
             z1=0;
             y=0;
             x=0;
             Thetaz=0;
             Thetay=0;
             Thetax=0;
             ready=0;
             PORTB=Theta3;

         }

}
slave code
Code:
void mydelay_10us(long int a);
unsigned short datain,dataout;
unsigned char Received(unsigned short dataout);
unsigned long int total,high1,high2,high3,low,theta1,Required_delay1  =0,theta2;
unsigned long int Required_delay2=0,theta3,Required_delay3=0;
unsigned char intiCom=0,ready=0,Thetax=0,x,Thetay,y,Thetaz,z1,up  date;
void main(){
  SysInit();
  InitTimer1();
  theta1=90;
  theta2=90;
  theta3=90;
  intiCom=0;
  intiCom=Received(0xF0);
  //  inititalize  the communication:
  //  Send 0x0F if reveiced is F0 the Communication line is stablish
  while(1)
  {
      ready = Received(0x70);             // 2  Ready for communication
      //PORTB  =  ready;
      if(ready==0x10)
      {
          Thetax = Received(0x30);        // 3  receive theta 1 is ready
          //PORTB =  Thetax;
          x = Received(0x40);             // 4  conform that Theta 1 has been recived
      }
      if(x==0x05)
      {
           Thetay=Received(0x50);         // 5  receive theta2 if reception of theta 1 is conformed
           //PORTB = Thetay;
           y= Received(0x60);             // 6  conform that Theta 2 has been recived
      }
      if(y==0x06)
      {
            Thetaz=Received(0x80);        // 7  receive theta3 if reception of theta 2 is conformed
            //PORTB = Thetaz;
            z1 = Received(0x90);          // 8  conform that Theta 3 has been recived
      }
      if((z1==0x08)&&(y==0x06)&&(x==0x05)) //  after conformation of all the theta 1 2 3
      {
           
            update=Received(0xA0);        // 9 if update comand is revieced the chage the value of angles.
           
            if(update==0x09)
            {
                theta1=(long int)Thetax;
                theta2=(long int)Thetay;
                theta3=(long int)Thetaz;
                PORTB=theta3;
                update=0;
                z1 = 0;
                x  = 0;
                y  = 0;
                ready=0;
            }
      
      }
  }

}
unsigned char Received(unsigned short dataout)
{
     datain= SPI1_Read(dataout);
     return datain;
}
void SysInit()
{
  ADCON1=0x06;    // disable ADC and make all the pins of Port A as digital input
  TRISA=0xFF;
  PORTA=0x00;
  TRISB=0x00;
  PORTB=0x00;
  TRISD=0x00;
  PORTD=0x00;
  TRISE=0x00;
  PORTE=0x00;
  TRISC.B6=0;
  TRISC.B7=0;
  TRISC.B4=1;    // SDI input
  TRISC.B3=1;    // SCK input from master
  TRISC.B5=0;    // SDO output
  SSPSTAT.SMP=0; // input data sampled at middle
  SSPSTAT.CKE=0; // transition from idle to active
  SPI1_Init_Advanced(_SPI_SLAVE_SS_ENABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
}
video is in attachment
help me out I will realy appreciate
View attachment New folder.rar
 
Last edited:

You have removed both erroneous and necessary parts from the slave code.

It_right to remove the delay statement, but while(SSPSTAT.BF) or a an equivalent method to wait for received data must be kept.
 

is this
while(SSPSTAT.BF)
statement correct ?? I had doubt about that that was the reason of removal>
can you plz tell me about the problem I showed in video who can I get continuous data transfer?? I really have to get the continues data.
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top