+ Post New Thread
Results 1 to 7 of 7
  1. #1
    Junior Member level 1
    Points: 130, Level: 1
    AmmarAkhlaq's Avatar
    Join Date
    Dec 2013
    Posts
    17
    Helped
    0 / 0
    Points
    130
    Level
    1

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

    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.
    Always looking for source of knowledge

    •   AltAdvertisement

        
       

  2. #2
    Super Moderator
    Points: 260,224, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    45,441
    Helped
    13826 / 13826
    Points
    260,224
    Level
    100

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    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


    1 members found this post helpful.

    •   AltAdvertisement

        
       

  3. #3
    Junior Member level 1
    Points: 130, Level: 1
    AmmarAkhlaq's Avatar
    Join Date
    Dec 2013
    Posts
    17
    Helped
    0 / 0
    Points
    130
    Level
    1

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    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.?
    Always looking for source of knowledge



    •   AltAdvertisement

        
       

  4. #4
    Super Moderator
    Points: 260,224, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    45,441
    Helped
    13826 / 13826
    Points
    260,224
    Level
    100

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    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.



  5. #5
    Junior Member level 1
    Points: 130, Level: 1
    AmmarAkhlaq's Avatar
    Join Date
    Dec 2013
    Posts
    17
    Helped
    0 / 0
    Points
    130
    Level
    1

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    Quote Originally Posted by FvM View Post
    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
    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
    New folder.rar
    Last edited by AmmarAkhlaq; 23rd March 2014 at 17:09.
    Always looking for source of knowledge



  6. #6
    Super Moderator
    Points: 260,224, Level: 100
    Awards:
    1st Helpful Member

    Join Date
    Jan 2008
    Location
    Bochum, Germany
    Posts
    45,441
    Helped
    13826 / 13826
    Points
    260,224
    Level
    100

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    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.



    •   AltAdvertisement

        
       

  7. #7
    Junior Member level 1
    Points: 130, Level: 1
    AmmarAkhlaq's Avatar
    Join Date
    Dec 2013
    Posts
    17
    Helped
    0 / 0
    Points
    130
    Level
    1

    Re: SPI problem while sending multiple bytes to slave. BOth master and slave are 18f4

    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 by AmmarAkhlaq; 23rd March 2014 at 17:44.
    Always looking for source of knowledge



--[[ ]]--