<?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>Kinetis MicrocontrollersのトピックRe: K64 SPI Read problem</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838075#M50641</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks Jing for the response.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I had to make a BitBang routine to&amp;nbsp;have it work, but I still winder why hardware SPI does not work like that?&lt;BR /&gt;Here are my code for initialization and read:&lt;/P&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;&lt;P&gt;void Spi_init( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SIM_SCGC6 |= SIM_SCGC6_SPI0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR6 |= PORT_MUX_GPIO;&amp;nbsp; //&amp;nbsp; CS1&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR8 |= PORT_MUX_GPIO; //&amp;nbsp; CS2&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR10 |= PORT_MUX_GPIO; // CS3&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PDDR |= (1 &amp;lt;&amp;lt; 6)|(1&amp;lt;&amp;lt;8)|(1&amp;lt;&amp;lt;10); //set to OUT&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PDOR |= (1 &amp;lt;&amp;lt; 6)|(1&amp;lt;&amp;lt;8)|(1&amp;lt;&amp;lt;10); // set to HIGH&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR3 |= PORT_MUX_ALT2; // SPI2_SIN&amp;nbsp;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR2 |= PORT_MUX_ALT2 | PORT_DSE_HIGH | PORT_PE | PORT_PS_UP_ENABLE; //&amp;nbsp;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR1 |= PORT_MUX_ALT2 | PORT_DSE_HIGH | PORT_PE | PORT_PS_UP_ENABLE; // SCLK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= (SPI_MCR_MSTR);&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~(SPI_MCR_DIS_RXF | SPI_MCR_DIS_TXF );// enable FIFOs&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_CTAR0 = (SPI_CTAR_ASC_4 | SPI_CTAR_PBR_7 | SPI_CTAR_DBR | SPI_CTAR_FMSZ_16 |&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI_CTAR_PDT_7 | SPI_CTAR_BR_8 | SPI_CTAR_CPHA | SPI_CTAR_CPOL | SPI_CTAR_PCSSCK_3 ); //&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~(SPI_MCR_MDIS | SPI_MCR_HALT); //enable SPI and start transfer&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;unsigned short spiread(unsigned char chn, unsigned short addr )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short rread = 0;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int cs;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;if( chn == 1 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 6;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else if( chn == 2 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 8;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else if( chn == 3 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 10;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PCOR = cs;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= SPI_MCR_HALT;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= SPI_MCR_CLR_RXF | SPI_MCR_CLR_TXF;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR |= (SPI_SR_EOQF | SPI_SR_TFUF | SPI_SR_TFFF | SPI_SR_RFOF | SPI_SR_RFDF | &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI_SR_TCF); //clear the status bits (write-1-to-clear)&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~SPI_MCR_HALT;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_PUSHR = ((addr | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0) | 0x8000);&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;while( !(SPI0_SR &amp;amp; SPI_SR_RFDF) ){};&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;(void)SPI0_POPR;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR = SPI_SR_RFDF; // clear the reception flag (not self-clearing)&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_PUSHR = ( 0x0000 | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_EOQ );&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;while( !(SPI0_SR &amp;amp; SPI_SR_RFDF) ){};&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;rread = SPI0_POPR;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR = SPI_SR_RFDF; // clear the reception flag (not self-clearing)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pause(100);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PSOR = cs;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;return rread ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can you look at my code and tell if you see something.&lt;BR /&gt;&lt;BR /&gt;Thanks and best Regards.&lt;BR /&gt;Aleksey&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 07 Dec 2018 18:24:31 GMT</pubDate>
    <dc:creator>alekseystarovoy</dc:creator>
    <dc:date>2018-12-07T18:24:31Z</dc:date>
    <item>
      <title>K64 SPI Read problem</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838073#M50639</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi.&lt;/P&gt;&lt;P&gt;I am having a problem using K64 device and doing SPI read.&lt;BR /&gt;All of the examples that I found on SPI&amp;nbsp;saying to send 0xFF to SOUT line as a dummy write to get a read back.&lt;BR /&gt;So, what it does, it keeps SOUT line high and reads all of the toggling in the SIN line.&lt;BR /&gt;And this all works great, but the problem is, that my device that I am trying to talk require SOUT line to be LOW for it to&lt;BR /&gt;for it to respond correctly.&lt;/P&gt;&lt;P&gt;However, when I send 0x00 as a dummy write, and I can see my logic analyzer shows me correct response from the device, I cannot get correct readback from POPR register. Most of the time it is giving me bunch of zeros.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I there anybody who experienced same problem, and the way of resolving it?&lt;BR /&gt;&lt;BR /&gt;Thanks.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-Lex&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 06 Dec 2018 00:57:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838073#M50639</guid>
      <dc:creator>alekseystarovoy</dc:creator>
      <dc:date>2018-12-06T00:57:15Z</dc:date>
    </item>
    <item>
      <title>Re: K64 SPI Read problem</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838074#M50640</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Aleksey,&lt;/P&gt;&lt;P&gt;It sounds strange. As you can see in the reference manual, what it writes to&amp;nbsp;SOUT has no impact on SIN. I think the problem may caused by error setting. You can try the example frdmk64f_dspi_interrupt which you can find in sdk. In this example , one dspi instance used as DSPI master and another dspi instance used as DSPI slave in the same board. You can simulate your device by the slave instance.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Jing&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 07 Dec 2018 06:01:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838074#M50640</guid>
      <dc:creator>jingpan</dc:creator>
      <dc:date>2018-12-07T06:01:11Z</dc:date>
    </item>
    <item>
      <title>Re: K64 SPI Read problem</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838075#M50641</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks Jing for the response.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I had to make a BitBang routine to&amp;nbsp;have it work, but I still winder why hardware SPI does not work like that?&lt;BR /&gt;Here are my code for initialization and read:&lt;/P&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;&lt;P&gt;void Spi_init( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SIM_SCGC6 |= SIM_SCGC6_SPI0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR6 |= PORT_MUX_GPIO;&amp;nbsp; //&amp;nbsp; CS1&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR8 |= PORT_MUX_GPIO; //&amp;nbsp; CS2&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTA_PCR10 |= PORT_MUX_GPIO; // CS3&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PDDR |= (1 &amp;lt;&amp;lt; 6)|(1&amp;lt;&amp;lt;8)|(1&amp;lt;&amp;lt;10); //set to OUT&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PDOR |= (1 &amp;lt;&amp;lt; 6)|(1&amp;lt;&amp;lt;8)|(1&amp;lt;&amp;lt;10); // set to HIGH&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR3 |= PORT_MUX_ALT2; // SPI2_SIN&amp;nbsp;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR2 |= PORT_MUX_ALT2 | PORT_DSE_HIGH | PORT_PE | PORT_PS_UP_ENABLE; //&amp;nbsp;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PORTD_PCR1 |= PORT_MUX_ALT2 | PORT_DSE_HIGH | PORT_PE | PORT_PS_UP_ENABLE; // SCLK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= (SPI_MCR_MSTR);&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~(SPI_MCR_DIS_RXF | SPI_MCR_DIS_TXF );// enable FIFOs&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_CTAR0 = (SPI_CTAR_ASC_4 | SPI_CTAR_PBR_7 | SPI_CTAR_DBR | SPI_CTAR_FMSZ_16 |&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI_CTAR_PDT_7 | SPI_CTAR_BR_8 | SPI_CTAR_CPHA | SPI_CTAR_CPOL | SPI_CTAR_PCSSCK_3 ); //&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~(SPI_MCR_MDIS | SPI_MCR_HALT); //enable SPI and start transfer&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;unsigned short spiread(unsigned char chn, unsigned short addr )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short rread = 0;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int cs;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;if( chn == 1 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 6;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else if( chn == 2 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 8;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else if( chn == 3 ){&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 1 &amp;lt;&amp;lt; 10;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cs = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PCOR = cs;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= SPI_MCR_HALT;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR |= SPI_MCR_CLR_RXF | SPI_MCR_CLR_TXF;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR |= (SPI_SR_EOQF | SPI_SR_TFUF | SPI_SR_TFFF | SPI_SR_RFOF | SPI_SR_RFDF | &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI_SR_TCF); //clear the status bits (write-1-to-clear)&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_MCR &amp;amp;= ~SPI_MCR_HALT;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_PUSHR = ((addr | SPI_PUSHR_CONT | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0) | 0x8000);&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;while( !(SPI0_SR &amp;amp; SPI_SR_RFDF) ){};&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;(void)SPI0_POPR;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR = SPI_SR_RFDF; // clear the reception flag (not self-clearing)&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_PUSHR = ( 0x0000 | SPI_PUSHR_PCS0 | SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_EOQ );&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;while( !(SPI0_SR &amp;amp; SPI_SR_RFDF) ){};&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;rread = SPI0_POPR;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;SPI0_SR = SPI_SR_RFDF; // clear the reception flag (not self-clearing)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pause(100);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIOA_PSOR = cs;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;return rread ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can you look at my code and tell if you see something.&lt;BR /&gt;&lt;BR /&gt;Thanks and best Regards.&lt;BR /&gt;Aleksey&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 07 Dec 2018 18:24:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-SPI-Read-problem/m-p/838075#M50641</guid>
      <dc:creator>alekseystarovoy</dc:creator>
      <dc:date>2018-12-07T18:24:31Z</dc:date>
    </item>
  </channel>
</rss>

