<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: SPI - COMMUNICATION in 8-bit Microcontrollers</title>
    <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175371#M12178</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;//Master code //SCI used for only checking the data#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include &amp;lt;string.h&amp;gt;void sendSPI(unsigned int);void sendSCIvalue(unsigned int);void sendSCIchar(char);#define NAME  0x0Cint dummy = 0xEE;void main(void) {//int i;                       //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR = 0x03;                                    SPCR_SPE = 1;  SPCR_SPMSTR = 1;  SPCR_CPHA = 1;//  SPCR_SPRIE = 1;  while(1){  sendSPI(NAME); }  }void sendSPI(unsigned int data)  {    unsigned int rec_data;    int x;       sendSCIvalue(data);       SPDR = data;       while(!SPSCR_SPRF);           x = SPSCR;       rec_data = SPDR;              sendSCIvalue(rec_data);         sendSCIchar(0x20);                     while(!(rec_data == 0x55))        {        SPDR = 0xFF;        while(!SPSCR_SPRF);            x = SPSCR;        rec_data = SPDR;        //sendSCIvalue(rec_data);        //sendSCIchar(0x20);              }              sendSCIvalue(rec_data);       //sendSCIchar(0x20);               SPDR = dummy;        while(!SPSCR_SPRF);          x = SPSCR;        rec_data = SPDR;        sendSCIvalue(rec_data);        sendSCIchar(0x20);                SPDR = dummy;        while(!SPSCR_SPRF);          x = SPSCR;        rec_data = SPDR;        sendSCIvalue(rec_data);        sendSCIchar(0x20);        sendSCIchar(0x0D);        sendSCIchar(0x0A);} void sendSCIvalue(unsigned int hex) { int temp4,temp3,temp2,temp1,temp0,temp,tem,te; char dec;  temp4 = hex/0x2710; dec = ((temp4 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  te = hex % 0x2710;      temp3 = te / 0x3E8; dec =  ((temp3 &amp;amp; 0xf) | 0x30);                                  //(char *) ((temp3&amp;lt;12) &amp;amp; 0xF000)|0x30;; sendSCIchar(dec);  temp2 = te % 0x3E8;  temp1 = temp2 / 0x64; dec =  ((temp1 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  temp = temp2 % 0x64;  temp0 = temp/0xA; dec  = ((temp0 &amp;amp; 0xf) | 0x30); sendSCIchar(dec); tem = temp % 0xA;     dec  = ((tem &amp;amp; 0xf) | 0x30); sendSCIchar(dec);}void sendSCIchar(char i){  unsigned char u8serialCount;  u8serialCount=SCS1;  SCDR = i;  while(!SCS1_TC);}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;//Slave code//SCI used for data verification#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void init_ports(void);void commandselection(int);void sendSPIdata(unsigned int);void sendSCIvalue(unsigned int);void sendSCIchar(char);void getthreshold (void);unsigned int eread(int);void sendSPIvalue(unsigned int);#define ELECTRODE 1unsigned int thres_value[4];unsigned int thres_setvalue[4];void main(void) {  int temp,rec_data; init_ports(); SPDR = 0X01;   while(1)    {     //SPDR = 0X01;     while(!SPSCR_SPRF);     temp = SPSCR;        //To clear the bit      rec_data = SPDR;            EnableInterrupts;     //Master is sending data continuously        SPCR_SPRIE = 1;       //To clear SPSCR_SPRF bit Interrupt routine is used                    sendSCIvalue(rec_data);     sendSCIchar(0x20);          if(rec_data == 0x0C)       commandselection(rec_data);          }}/**************************************************************************************************///Port initialization/**************************************************************************************************/void init_ports() {     //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR = 0x03;       //Baud rate                             SPCR_SPE = 1;       //Enabiling SPI   SPCR_SPMSTR = 0;    //Enabling slave  SPCR_CPHA = 1;        SPCR_SPRIE = 0;     //Interrupt reciver  }void commandselection(int command) {   // int l,m;     switch(command) {    case 0x0C:               //sendSCIvalue(command);     //sendSCIchar(0x20);     //getthreshold();           //     To read the proximity elevtrode values          sendSPIdata(0x22CC);        //   For checking purpose  using this data     SPDR = 0xAA;        break;        default :    break;    }       //sendSCIvalue(command);   //sendSCIchar(0x20);   }void getthreshold (){ int ch;  for(ch=1;ch&amp;lt;=ELECTRODE;ch++)   {        thres_value[ch-1] = eread(ch);    sendSPIdata(thres_value[ch-1]);     //send data to this function to send thru SPI      }   sendSCIchar(0x0A);   sendSCIchar(0x0D);    }/**************************************************************************************************/  //Read values of electrode/**************************************************************************************************/unsigned int eread(int ch) {  unsigned int evalue;      PTA = PTA &amp;amp; 0xFC;                //PortA 0 &amp;amp; 1 &amp;amp; port B to select electrode from 1 to 7  PTA = PTA | (ch &amp;amp; 0x03);    ch = ch &amp;lt;&amp;lt; 4;    PTB = PTB &amp;amp; 0xBF;  PTB = PTB | (ch &amp;amp; 0x40);    while(!(ADSCR &amp;amp; 0x80));    //wait until conversion completes  evalue = ADR;  return(evalue);  }/******************************************************************************************/ // //Interrupt Routine for reciving thru SPI // ///******************************************************************************************/void interrupt 13 ISR_SPI() {int temp=0,rec_data=0;temp = SPSCR;        //To clear the bit rec_data = SPDR;}    /**************************************************************************************************///Spliting of bytes and sending byte by byte/**************************************************************************************************/  void sendSPIdata(unsigned int hex) {  int temp1,temp2,temp,rec_data;  //char dec;    temp1 = hex/100;            //to split data byte by byte  temp2 = hex%100;    DisableInterrupts;  SPCR_SPRIE = 0;    while(!SPSCR_SPRF);     temp = SPSCR;             rec_data = SPDR;   sendSPIvalue(0x55);        //say to Master the data coming here after is the data it has to get  sendSPIvalue(temp1);  sendSPIvalue(temp2);    }/**************************************************************************************************///Transmit data through SCI only for testing/**************************************************************************************************/void sendSPIvalue(unsigned int i){  int temp,rec_data;     SPDR = i ;  while(!SPSCR_SPRF);  temp = SPSCR;        //To clear the bit   rec_data = SPDR;      sendSCIchar(0x20);  sendSCIvalue(rec_data);   }void sendSCIvalue(unsigned int hex) { int temp4,temp3,temp2,temp1,temp0,temp,tem,te; char dec; //int divideratio[3] = {0x2710,0x3E8,0x64,0xA}  temp4 = hex/0x2710; dec = ((temp4 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  te = hex % 0x2710;      temp3 = te / 0x3E8; dec =  ((temp3 &amp;amp; 0xf) | 0x30);                                  //(char *) ((temp3&amp;lt;12) &amp;amp; 0xF000)|0x30;; sendSCIchar(dec);  temp2 = te % 0x3E8;  temp1 = temp2 / 0x64; dec =  ((temp1 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  temp = temp2 % 0x64;  temp0 = temp/0xA; dec  = ((temp0 &amp;amp; 0xf) | 0x30); sendSCIchar(dec); tem = temp % 0xA;     dec  = ((tem &amp;amp; 0xf) | 0x30); sendSCIchar(dec);}void sendSCIchar(char i){  unsigned char u8serialCount;  u8serialCount=SCS1;  SCDR = i;  while(!SCS1_TC);}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&amp;nbsp;Hello bigmac,&lt;BR /&gt;&lt;BR /&gt;These are the codes I have used to send data from master and slave.&lt;BR /&gt;&lt;BR /&gt;In 3rd concept&amp;nbsp; first master is sending command after that I am making it slave.so it will have to do in continuous loop say for eg while(1); til the second master is sending data once 2nd master&amp;nbsp; sends the data&lt;BR /&gt;Again first master has to send data&amp;nbsp; if it is continuous mode ie while(1) till an interrupts occur how to make it again as master to send data/&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 29 Oct 2020 09:23:57 GMT</pubDate>
    <dc:creator>Opal</dc:creator>
    <dc:date>2020-10-29T09:23:57Z</dc:date>
    <item>
      <title>SPI - COMMUNICATION - MC68HC908QB8</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175369#M12176</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;SPAN style="font-family: Arial;"&gt;Hi Everyone,&lt;BR /&gt;&lt;BR /&gt;I am using Controller MC68HC908QB8.&lt;BR /&gt;I am using 2 controllers one as master and another as slave.I am sending command from master to slave and accourding to that data slave has to process and send the data back to master. I am using master&amp;nbsp; to send command&amp;nbsp; and receive the data back .&amp;nbsp; Slave will start transmission only when master initiates the transmission but master has to initiate only after the process in the slave have finished.How can I achive this.&lt;BR /&gt;I used 2 concepts delay accourding to the proccess time taken in slave used delay in master and another one is from master I will send data continuosly and get the same data once the process is over I will send one data after that whatever data comes it will take the data as output. But the problem is it losed the sequence after 6 th value.&lt;BR /&gt;&lt;BR /&gt;I am not able to trace why it happened so Pls could any one help me.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Added p/n to subject.&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Message Edited by NLFSJ on &lt;/SPAN&gt;&lt;SPAN class="date_text"&gt;2007-12-28&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;12:41 PM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 27 Dec 2007 13:54:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175369#M12176</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2007-12-27T13:54:08Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175370#M12177</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Hello,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Possible alternative methods to that of&amp;nbsp;simply providing a time delay within the master -&lt;/FONT&gt;&lt;/DIV&gt;&lt;OL&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Use a separate handshake output from the slave end, which can be asserted whenever new data is ready.&amp;nbsp; Of course, this requires an additional pin for each device.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Provide handshaking within the SPI protocol, where the first byte value returned by the slave determines whether new data is available with&amp;nbsp;subsequent transfer(s).&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Operate with dual masters.&amp;nbsp; Each end would normally operate as a slave, but would become a master only when it had data to send.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;For methods 2 and 3, it would be usual to utilize the SPI interrupt for slave operation.&amp;nbsp; Interrupt is rarely necessary for master operation.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I assume that method 2 might be similar to one of the methods you have tried.&amp;nbsp; It is not possible to suggest a solution to your current problem without further details of the code you are using for master and slave ends, the data sequence used, and exactly how the problem is evidenced.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Regards,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Mac&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 27 Dec 2007 17:27:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175370#M12177</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2007-12-27T17:27:34Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175371#M12178</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;//Master code //SCI used for only checking the data#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include &amp;lt;string.h&amp;gt;void sendSPI(unsigned int);void sendSCIvalue(unsigned int);void sendSCIchar(char);#define NAME  0x0Cint dummy = 0xEE;void main(void) {//int i;                       //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR = 0x03;                                    SPCR_SPE = 1;  SPCR_SPMSTR = 1;  SPCR_CPHA = 1;//  SPCR_SPRIE = 1;  while(1){  sendSPI(NAME); }  }void sendSPI(unsigned int data)  {    unsigned int rec_data;    int x;       sendSCIvalue(data);       SPDR = data;       while(!SPSCR_SPRF);           x = SPSCR;       rec_data = SPDR;              sendSCIvalue(rec_data);         sendSCIchar(0x20);                     while(!(rec_data == 0x55))        {        SPDR = 0xFF;        while(!SPSCR_SPRF);            x = SPSCR;        rec_data = SPDR;        //sendSCIvalue(rec_data);        //sendSCIchar(0x20);              }              sendSCIvalue(rec_data);       //sendSCIchar(0x20);               SPDR = dummy;        while(!SPSCR_SPRF);          x = SPSCR;        rec_data = SPDR;        sendSCIvalue(rec_data);        sendSCIchar(0x20);                SPDR = dummy;        while(!SPSCR_SPRF);          x = SPSCR;        rec_data = SPDR;        sendSCIvalue(rec_data);        sendSCIchar(0x20);        sendSCIchar(0x0D);        sendSCIchar(0x0A);} void sendSCIvalue(unsigned int hex) { int temp4,temp3,temp2,temp1,temp0,temp,tem,te; char dec;  temp4 = hex/0x2710; dec = ((temp4 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  te = hex % 0x2710;      temp3 = te / 0x3E8; dec =  ((temp3 &amp;amp; 0xf) | 0x30);                                  //(char *) ((temp3&amp;lt;12) &amp;amp; 0xF000)|0x30;; sendSCIchar(dec);  temp2 = te % 0x3E8;  temp1 = temp2 / 0x64; dec =  ((temp1 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  temp = temp2 % 0x64;  temp0 = temp/0xA; dec  = ((temp0 &amp;amp; 0xf) | 0x30); sendSCIchar(dec); tem = temp % 0xA;     dec  = ((tem &amp;amp; 0xf) | 0x30); sendSCIchar(dec);}void sendSCIchar(char i){  unsigned char u8serialCount;  u8serialCount=SCS1;  SCDR = i;  while(!SCS1_TC);}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;//Slave code//SCI used for data verification#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void init_ports(void);void commandselection(int);void sendSPIdata(unsigned int);void sendSCIvalue(unsigned int);void sendSCIchar(char);void getthreshold (void);unsigned int eread(int);void sendSPIvalue(unsigned int);#define ELECTRODE 1unsigned int thres_value[4];unsigned int thres_setvalue[4];void main(void) {  int temp,rec_data; init_ports(); SPDR = 0X01;   while(1)    {     //SPDR = 0X01;     while(!SPSCR_SPRF);     temp = SPSCR;        //To clear the bit      rec_data = SPDR;            EnableInterrupts;     //Master is sending data continuously        SPCR_SPRIE = 1;       //To clear SPSCR_SPRF bit Interrupt routine is used                    sendSCIvalue(rec_data);     sendSCIchar(0x20);          if(rec_data == 0x0C)       commandselection(rec_data);          }}/**************************************************************************************************///Port initialization/**************************************************************************************************/void init_ports() {     //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR = 0x03;       //Baud rate                             SPCR_SPE = 1;       //Enabiling SPI   SPCR_SPMSTR = 0;    //Enabling slave  SPCR_CPHA = 1;        SPCR_SPRIE = 0;     //Interrupt reciver  }void commandselection(int command) {   // int l,m;     switch(command) {    case 0x0C:               //sendSCIvalue(command);     //sendSCIchar(0x20);     //getthreshold();           //     To read the proximity elevtrode values          sendSPIdata(0x22CC);        //   For checking purpose  using this data     SPDR = 0xAA;        break;        default :    break;    }       //sendSCIvalue(command);   //sendSCIchar(0x20);   }void getthreshold (){ int ch;  for(ch=1;ch&amp;lt;=ELECTRODE;ch++)   {        thres_value[ch-1] = eread(ch);    sendSPIdata(thres_value[ch-1]);     //send data to this function to send thru SPI      }   sendSCIchar(0x0A);   sendSCIchar(0x0D);    }/**************************************************************************************************/  //Read values of electrode/**************************************************************************************************/unsigned int eread(int ch) {  unsigned int evalue;      PTA = PTA &amp;amp; 0xFC;                //PortA 0 &amp;amp; 1 &amp;amp; port B to select electrode from 1 to 7  PTA = PTA | (ch &amp;amp; 0x03);    ch = ch &amp;lt;&amp;lt; 4;    PTB = PTB &amp;amp; 0xBF;  PTB = PTB | (ch &amp;amp; 0x40);    while(!(ADSCR &amp;amp; 0x80));    //wait until conversion completes  evalue = ADR;  return(evalue);  }/******************************************************************************************/ // //Interrupt Routine for reciving thru SPI // ///******************************************************************************************/void interrupt 13 ISR_SPI() {int temp=0,rec_data=0;temp = SPSCR;        //To clear the bit rec_data = SPDR;}    /**************************************************************************************************///Spliting of bytes and sending byte by byte/**************************************************************************************************/  void sendSPIdata(unsigned int hex) {  int temp1,temp2,temp,rec_data;  //char dec;    temp1 = hex/100;            //to split data byte by byte  temp2 = hex%100;    DisableInterrupts;  SPCR_SPRIE = 0;    while(!SPSCR_SPRF);     temp = SPSCR;             rec_data = SPDR;   sendSPIvalue(0x55);        //say to Master the data coming here after is the data it has to get  sendSPIvalue(temp1);  sendSPIvalue(temp2);    }/**************************************************************************************************///Transmit data through SCI only for testing/**************************************************************************************************/void sendSPIvalue(unsigned int i){  int temp,rec_data;     SPDR = i ;  while(!SPSCR_SPRF);  temp = SPSCR;        //To clear the bit   rec_data = SPDR;      sendSCIchar(0x20);  sendSCIvalue(rec_data);   }void sendSCIvalue(unsigned int hex) { int temp4,temp3,temp2,temp1,temp0,temp,tem,te; char dec; //int divideratio[3] = {0x2710,0x3E8,0x64,0xA}  temp4 = hex/0x2710; dec = ((temp4 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  te = hex % 0x2710;      temp3 = te / 0x3E8; dec =  ((temp3 &amp;amp; 0xf) | 0x30);                                  //(char *) ((temp3&amp;lt;12) &amp;amp; 0xF000)|0x30;; sendSCIchar(dec);  temp2 = te % 0x3E8;  temp1 = temp2 / 0x64; dec =  ((temp1 &amp;amp; 0xf) | 0x30); sendSCIchar(dec);  temp = temp2 % 0x64;  temp0 = temp/0xA; dec  = ((temp0 &amp;amp; 0xf) | 0x30); sendSCIchar(dec); tem = temp % 0xA;     dec  = ((tem &amp;amp; 0xf) | 0x30); sendSCIchar(dec);}void sendSCIchar(char i){  unsigned char u8serialCount;  u8serialCount=SCS1;  SCDR = i;  while(!SCS1_TC);}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&amp;nbsp;Hello bigmac,&lt;BR /&gt;&lt;BR /&gt;These are the codes I have used to send data from master and slave.&lt;BR /&gt;&lt;BR /&gt;In 3rd concept&amp;nbsp; first master is sending command after that I am making it slave.so it will have to do in continuous loop say for eg while(1); til the second master is sending data once 2nd master&amp;nbsp; sends the data&lt;BR /&gt;Again first master has to send data&amp;nbsp; if it is continuous mode ie while(1) till an interrupts occur how to make it again as master to send data/&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:23:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175371#M12178</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2020-10-29T09:23:57Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175372#M12179</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Hello,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I see some potential problems with your slave code.&amp;nbsp; You are clearing the SPI receive flag within the ISR, but are then reading and writing to SPDR within main and other functions.&amp;nbsp; To maintain synchronism, I would suggest that the reading and writing also needs to be done within the ISR, with possibly the following sequence -&lt;/FONT&gt;&lt;/DIV&gt;&lt;OL&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Clear SPRF flag (read SPSCR)&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Read SPDR, test for command value, and place in global variable, if required.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT size="2"&gt;Test for data value to be returned (possibly by means of a global flag)&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT size="2"&gt;If so, write return value to SPDR, else write "no data" value to SPDR&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;The data value will be returned when the master initiates the next transfer.&amp;nbsp; All other processing&amp;nbsp;should be done from outside the ISR, using the global variables to communicate with the ISR.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I presume that&amp;nbsp;you have the SS pin tied permanently low at the slave.&amp;nbsp; This&amp;nbsp;could be problematic with the presence of any spurious clock pulses (perhaps caused by noise).&amp;nbsp; IMHO it is better to frame the sequence by the master returning SS high after each transfer.&amp;nbsp; With CPHA = 1, this could be done after the transfer of a number of bytes.&amp;nbsp; However, with CPHA = 0, it &lt;U&gt;must&lt;/U&gt; be done after the transfer of every byte.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I notice that you have set the master for the slowest SPI clock rate.&amp;nbsp; Usual practice is to use the fastest clock rate available, that is compatible with the slave device.&amp;nbsp; However, I also notice that you are sending a continuous data stream from the master, by virtue of the while loop.&amp;nbsp; A better arrangement would be to pace the sending of data&amp;nbsp;for a rate comparable with the slave command processing time, perhaps using the TIM module within the master.&amp;nbsp; For the present code, the pacing is determined by the slow SPI clock rate.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Primarily within your code for the master, you have a separate line that reads SPSCR.&amp;nbsp; This line is unnecessary since it alway occurs after the SPRF flag (within the same register) has been tested.&amp;nbsp; When I use the SPI module, I would usually test for the SPTEF flag being set before writing to the&amp;nbsp;SPDR register.&amp;nbsp; While not always necessary, particularly for the HC908 SPI,&amp;nbsp; it can avoid potential problems&amp;nbsp;when using&amp;nbsp;other 9S08 devices.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;A final observation is your widespread use of 16-bit variables.&amp;nbsp; With an 8-bit MCU, more efficient code will result if you declare 8-bit variables, preferably unsigned, unless it is absolutely necessary to use larger ones.&amp;nbsp; Since 8-bit values are always used for peripherals such as the SPI and SCI, it makes no sense to use 16-bit values in these instances.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Regards,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Mac&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 28 Dec 2007 11:00:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175372#M12179</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2007-12-28T11:00:31Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175373#M12180</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Hello ,&lt;BR /&gt;&lt;BR /&gt;Thank you.&lt;BR /&gt;I have written a program only to communicate between master and slave. Master has to send data continuosly but slave will place a data only after a delay. If slave didnt place any data in Data register then master will receive whatever data in the slave shift register.&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;//Master code#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void sendSCIvalue(unsigned int);void sendSCIchar(char);void main(void) {  EnableInterrupts; //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR_SPR1 = 0;  SPSCR_SPR0 = 0;                                      SPCR_SPE = 1;  SPCR_SPMSTR = 1;  SPCR_CPHA = 1;  SPCR_SPRIE = 1;    SPDR = 0xFF;  while(1);  }/******************************************************************************************/ // //Interrupt Routine for reciving thru SPI // ///******************************************************************************************/void interrupt 13 ISR_SPI() {int temp=0,rec_data=0;temp = SPSCR;        //To clear the bit rec_data = SPDR;sendSCIvalue(rec_data);sendSCIchar(0x20);SPDR = 0xFF;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;Code for slave&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void sendSCIvalue(unsigned int);void sendSCIchar(char);void delay(void);int k=0 ;void main(void) {  EnableInterrupts;  //Set Oscillator frequency  OSCSC  = 0x20;          // Set bus speed to 12.8 MHZ   OSCTRIM = Optional;     // this macro loads value at $FFC0 and store it in $0038.                        // bus clock speed is 3.2MHz +- 5%                        // Set up configuration registers     CONFIG2 = 0x05;     // Enable reset and IRQ pins    CONFIG1 = 0x01;     // disable the watch dog.  DDRA = 0x03;  DDRB = 0x40;  PTAPUE_PTAPUE2=1;   //enable pullup resistor on PTA2 // Configure ADC   ADCLK = 0x14;       // ADC 10 bit    ADSCR = 0x23;       // continuous conversion, channel 3 (PTA5)   // Configure ESCI   SCPSC = 0b10000111; //Baudrate = ((12.8Mhz/4) / (64*1*1*5.21875)) = 9580   SCC1  = 0x40;    SCC2  = 0x08;  // Configure SPI    SPSCR_SPR1 = 0;  SPSCR_SPR0 = 0;                                      SPCR_SPE = 1;  SPCR_SPMSTR = 0;  SPCR_CPHA = 1;  SPCR_SPRIE = 1;      SPDR = 0xAA;  while(1);}/******************************************************************************************/ // //Interrupt Routine for reciving thru SPI // ///******************************************************************************************/void interrupt 13 ISR_SPI() {int temp=0,rec_data=0;temp = SPSCR;        //To clear the bit rec_data = SPDR;sendSCIvalue(rec_data);SPDR = 0xAA;sendSCIchar(0x20);if(k == 0) {    k = 1;     delay();    sendSCIchar(0x20);    }}void delay() {int i;for(i=0; i&amp;lt;100 ;i++);SPDR = 0xAA; k = 0;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;There is no connection for SS pin in both slave and master. In slave part I am getting 255 as output and after some time there is no output in hyper terminal. In master part I am getting 170 and sometimes 255 but after some time only getting 0 contniously. Kindly help me to trace why it is happening so.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:23:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175373#M12180</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2020-10-29T09:23:59Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175374#M12181</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;FONT color="#ff00ff"&gt;Sorry !&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;In slave code&lt;/FONT&gt; &lt;FONT color="#ff00ff"&gt;&lt;FONT color="#ff00ff"&gt;, In reciver&amp;nbsp; Interrupt routine this line should not be there&amp;nbsp; //SPDR = 0xAA .&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;FONT color="#ff00ff"&gt;Once again sorry for inconvenience.&lt;BR /&gt;&lt;BR /&gt;Thanks!&lt;BR /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 28 Dec 2007 16:40:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175374#M12181</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2007-12-28T16:40:51Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175375#M12182</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Just a couple of notes on what I see.&lt;BR /&gt;&lt;BR /&gt;1. I would recommend getting the SCI send OUT of the interrupt.&amp;nbsp; Interrupts should be very short and I don't know if your SCI routine blocks until the character is sent or not but serial communication at 9600 baud takes each byte 1ms where an SPIbyte can be sent in 10us or less.&amp;nbsp; Store the byte and set a flag in the interrupt and check the flag in main to send the byte and clear the flag.&lt;BR /&gt;&lt;BR /&gt;2. The SS line or some type of CS or Chip Select is usefull for "packetizing" your data to break up your data stream.&amp;nbsp; I have used this approach often between coprocessors.&lt;BR /&gt;&lt;BR /&gt;If you will contact me off list, I will send you some code I have for a project which swaps 9 bytes between two processors using SPI.&amp;nbsp; You could probably edrop it in and use it.&amp;nbsp; It was written for an 'S08GB60&lt;BR /&gt;&lt;BR /&gt;Peter&lt;BR /&gt;peter.house@centricsystems.com&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 28 Dec 2007 22:27:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175375#M12182</guid>
      <dc:creator>PeterHouse</dc:creator>
      <dc:date>2007-12-28T22:27:18Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175376#M12183</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Hi,&lt;BR /&gt;&lt;BR /&gt;I understand&amp;nbsp; first point But without using SCI how can I know whether data is coming&lt;BR /&gt;correct or not. Both in master and slave side.&lt;BR /&gt;&lt;BR /&gt;If I use SCI in slave side alone to display the data from the master,then I am getting the output&lt;BR /&gt;contniously.&lt;BR /&gt;&lt;BR /&gt;If I use SCI in both master and slave then I am not getting data contniously in both side.&lt;BR /&gt;&lt;BR /&gt;If I use SCI in master alone then also I am not getting output contniously It stops after 2 secs.&lt;BR /&gt;&lt;BR /&gt;Slave code is:&lt;BR /&gt;TMOD = 0xFFFF;&lt;BR /&gt;TSC = 0X42; //Internal frequency %4&lt;BR /&gt;void interrupt 13 ISR_SPI() {&lt;BR /&gt;&lt;BR /&gt;int temp=0;&lt;BR /&gt;char rec_data=0;&lt;BR /&gt;&lt;BR /&gt;temp = SPSCR;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //To clear the bit&lt;BR /&gt;rec_data = SPDR;&lt;BR /&gt;&amp;nbsp; if( flag == 1) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; SPDR = name;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; //sendSCIchar(rec_data);&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; flag = 0;&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;//Timer Interrupt&lt;BR /&gt;&lt;BR /&gt;interrupt 6&amp;nbsp; void TIM_ISR(void)&lt;BR /&gt;&lt;BR /&gt;{&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TSC_TOF = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag++;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sendSCIvalue(0x01);&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;Master code:&lt;BR /&gt;void interrupt 13 ISR_SPI() {&lt;BR /&gt;&lt;BR /&gt;int temp=0;&lt;BR /&gt;char rec_data=0;&lt;BR /&gt;&lt;BR /&gt;temp = SPSCR;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //To clear the bit&lt;BR /&gt;rec_data = SPDR;&lt;BR /&gt;&lt;BR /&gt;//sendSCIvalue(rec_data);&lt;BR /&gt;sendSCIchar(rec_data);&lt;BR /&gt;&amp;nbsp;SPDR = name;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Could you send that code also pls.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 29 Dec 2007 12:42:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175376#M12183</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2007-12-29T12:42:32Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175377#M12184</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;I am not suggesting you not use the SCI.&amp;nbsp; I am suggesting in the interrupt routine you store the received data and set a flag.&amp;nbsp; In you main loop you should check the flag and if it is set then clear it and send the byte using the SCI.&amp;nbsp; This keeps your interrupt routine very short and your main loop can "spin" while the SCI transmits the byte.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;Here is some pseudo code for the main loop:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;char Byte_2_Send&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;char Byte_2_Send_Flag&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;#define TRUE 1&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;#define FALSE 0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;{&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;// Check to see if SCI is busy transmitting&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;if ( SCI_Busy )&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;// Busy - Do Nothing&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;else&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;// Not Busy - Check to See if Data is Ready to Send&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; // Check to See if Data is Ready to Send&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; if ( Byte_2_Send_flag == TRUE )&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Data is Ready - Send it&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SCI_Data_Register = Byte_2_Send&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Byte_2_Send_Flag = FALSE&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; else&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; // Data is Not Ready - Do Nothing&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; end if&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;end if&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;Here is some pseudo code for the Intterupt:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;{&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Byte_2_Send = SPIDR&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&amp;nbsp;&amp;nbsp; Byte_2_Send_Flag = TRUE&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; // Don't forget to clear Interrupts and other housekeeping&lt;BR /&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;Good Luck,&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Arial"&gt;&lt;FONT color="#0000ff"&gt;&lt;FONT size="2"&gt;&lt;SPAN class="235095717-28122007"&gt;Peter&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 02 Jan 2008 23:32:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175377#M12184</guid>
      <dc:creator>PeterHouse</dc:creator>
      <dc:date>2008-01-02T23:32:32Z</dc:date>
    </item>
    <item>
      <title>Re: SPI - COMMUNICATION</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175378#M12185</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Hello,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I have done one simple program in SPI&amp;nbsp;.&lt;/DIV&gt;&lt;DIV&gt;From master sending one char contniously ,If reciver flag is set then after clearing the flag send the recived value to SCI. In slave , only clearing &amp;nbsp;the SPI reciver flag. Since In SPI when master start transmitting it will also start receving what ever data in the slave shift register at that time. So &amp;nbsp;from the second data of transfer from master. Master is expected to receive whatever data that send to slave previously.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT color="#330066"&gt;Master Code:&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;while(1)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;SPDR = &lt;FONT color="#CC0000"&gt;name&lt;/FONT&gt;;&lt;BR /&gt;&amp;nbsp; while(!SPSCR_SPRF);&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rec_data = SPDR;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; sendSCIchar(rec_data);&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT color="#330066"&gt;Slave code:&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;while(1)&lt;BR /&gt;&amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; while(!SPSCR_SPRF);&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rec_data = SPDR;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;When &lt;FONT color="#993300"&gt;&lt;/FONT&gt;&lt;FONT color="#CC0000"&gt;name&amp;nbsp;= &amp;nbsp;'A'&lt;/FONT&gt;&amp;nbsp; Not getting A all the times.&lt;/DIV&gt;&lt;DIV&gt;When &lt;FONT color="#CC0000"&gt;name = &amp;nbsp;'B'&lt;/FONT&gt;&amp;nbsp; Getting B contniouly.&lt;/DIV&gt;&lt;DIV&gt;When sending&amp;nbsp; two data in the while loop that is when sending A and B from master.&lt;/DIV&gt;&lt;DIV&gt;Getting AB contniously.&lt;/DIV&gt;&lt;DIV&gt;when &lt;FONT color="#CC0000"&gt;name = 'C'&lt;/FONT&gt;&amp;nbsp;Getting different characters in the middle.&lt;/DIV&gt;&lt;DIV&gt;when &lt;FONT color="#CC0000"&gt;name = 'D'&lt;/FONT&gt; Getting D contniously.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;when &lt;FONT color="#CC0000"&gt;SPDR = 0xAA&lt;/FONT&gt; getting contniously.&lt;/DIV&gt;&lt;DIV&gt;when &lt;FONT color="#CC0000"&gt;SPDR = 0xAB&lt;/FONT&gt; getting different character in the middle.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;My assumption is when the characters equivalent binary ends with (LSB) &lt;FONT color="#CC00CC"&gt;1&lt;/FONT&gt;&amp;nbsp;I am getting this problem.&lt;/DIV&gt;&lt;DIV&gt;I didnt understand why it is behaving differently still problem with my Code. Or problem with my circuit.&lt;/DIV&gt;&lt;DIV&gt;Or whether my understaning of SPI is not correct.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Kindly Help to solve this problem.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 07 Jan 2008 14:13:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/SPI-COMMUNICATION-MC68HC908QB8/m-p/175378#M12185</guid>
      <dc:creator>Opal</dc:creator>
      <dc:date>2008-01-07T14:13:20Z</dc:date>
    </item>
  </channel>
</rss>

