<?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>CodeWarrior for MCU中的主题 HC12: Problem passing values between routines</title>
    <link>https://community.nxp.com/t5/CodeWarrior-for-MCU/HC12-Problem-passing-values-between-routines/m-p/137252#M1973</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Why does the value being returned from my routine different from the value in the routine sending it?&lt;/DIV&gt;&lt;DIV&gt;Im using MC9S12DP256 processor.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;here is the routine doing the sending&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;uchar is declared as #define uchar unsigned char&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*------------------------------------------------------------*&lt;BR /&gt;| Name: SPI_Proc.&amp;nbsp;uchar SPI_Proc(cValue);&lt;BR /&gt;|&lt;BR /&gt;| Description: Read port&lt;BR /&gt;*/&lt;BR /&gt;uchar SPI_Proc (/*uchar cPort,*/ uchar cValue)&lt;BR /&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;uchar cData&lt;BR /&gt;/*&amp;nbsp; while (!(*(char*)SPI_STATUS[cPort] &amp;amp; SPI_TEF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;*(char*)SPI_DATA[cPort] = cValue;&lt;BR /&gt;&amp;nbsp;while (!(*(char*)SPI_STATUS[cPort] &amp;amp; SPI_IF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPIF set&lt;BR /&gt;&amp;nbsp;return *(char*)SPI_DATA[cPort];*/&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;while ((SPI0SR &amp;amp; 0x20) != 0x20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;SPI0DR /**(char*)SPI_DATA[cPort]*/ = cValue;&lt;BR /&gt;&amp;nbsp;while ((SPI0SR &amp;amp; 0x20) != 0x20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;cData = SPI0DR;&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;return cData; /**(char*)SPI_DATA[cPort];*/&lt;BR /&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Data is 154 in this routine&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Next routine in the link is in a different file&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;decleared as extern uchar SPI_Proc(uchar cValue);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*------------------------------------------------------------*&lt;BR /&gt;| Name: MAX7301_Read.&amp;nbsp;uchar MAX7301_Read(cCommand);&lt;BR /&gt;|&lt;BR /&gt;| Description: Read port&lt;BR /&gt;*/&lt;BR /&gt;uchar MAX7301_Read(/*uchar cDevice,*/ uchar cCommand)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;uchar cData;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;MAX7301_Write(/*cDevice,*/cCommand | 0x80,0);&lt;BR /&gt;&amp;nbsp;PTS /**(char*)MAX7301_SS_Port[cDevice]*/ &amp;amp;= ~ 0x80; //MAX7301_SS_SET[cDevice];&lt;BR /&gt;&amp;nbsp;(void)&amp;nbsp; SPI_Proc(/*MAX7301_Port[cDevice],*/0);&lt;BR /&gt;&amp;nbsp;cData = SPI_Proc(/*MAX7301_Port[cDevice],*/0);&lt;BR /&gt;&amp;nbsp;PTS /**(char*)MAX7301_SS_Port[cDevice]*/ |= 0x80; //MAX7301_SS_SET[cDevice];&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;return cData;&lt;BR /&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;cData is 154&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;the start of the link is&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void MAX7301_Config_Port (/*uchar cDevice,*/ uchar cCommand, uchar cDir, uchar cBit)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;uchar cData;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cCommand);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cDir);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cBit);&lt;BR /&gt;&amp;nbsp;cData = MAX7301_Read(/*cDevice,*/cCommand);&lt;BR /&gt;//&amp;nbsp; cData = cRetData;&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;cDir = cDir &amp;lt;&amp;lt; (cBit * 2);&lt;BR /&gt;&amp;nbsp;cData &amp;amp;= ~(0x03 &amp;lt;&amp;lt; (cBit * 2));&lt;BR /&gt;&amp;nbsp;cData |= cDir;&lt;BR /&gt;&amp;nbsp;MAX7301_Write (/*cDevice,*/cCommand, cData);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cCommand);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(255);&lt;BR /&gt;}&lt;BR /&gt;&lt;/DIV&gt;&lt;DIV&gt;cData when read fromMAX7301_Read is 48&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Why is this?&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;P&gt;Message Edited by CrasyCat on &lt;SPAN class="date_text"&gt;2007-04-13&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;11:51 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 21 Nov 2006 06:20:15 GMT</pubDate>
    <dc:creator>NZ_Design</dc:creator>
    <dc:date>2006-11-21T06:20:15Z</dc:date>
    <item>
      <title>HC12: Problem passing values between routines</title>
      <link>https://community.nxp.com/t5/CodeWarrior-for-MCU/HC12-Problem-passing-values-between-routines/m-p/137252#M1973</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Why does the value being returned from my routine different from the value in the routine sending it?&lt;/DIV&gt;&lt;DIV&gt;Im using MC9S12DP256 processor.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;here is the routine doing the sending&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;uchar is declared as #define uchar unsigned char&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*------------------------------------------------------------*&lt;BR /&gt;| Name: SPI_Proc.&amp;nbsp;uchar SPI_Proc(cValue);&lt;BR /&gt;|&lt;BR /&gt;| Description: Read port&lt;BR /&gt;*/&lt;BR /&gt;uchar SPI_Proc (/*uchar cPort,*/ uchar cValue)&lt;BR /&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;uchar cData&lt;BR /&gt;/*&amp;nbsp; while (!(*(char*)SPI_STATUS[cPort] &amp;amp; SPI_TEF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;*(char*)SPI_DATA[cPort] = cValue;&lt;BR /&gt;&amp;nbsp;while (!(*(char*)SPI_STATUS[cPort] &amp;amp; SPI_IF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPIF set&lt;BR /&gt;&amp;nbsp;return *(char*)SPI_DATA[cPort];*/&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;while ((SPI0SR &amp;amp; 0x20) != 0x20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;SPI0DR /**(char*)SPI_DATA[cPort]*/ = cValue;&lt;BR /&gt;&amp;nbsp;while ((SPI0SR &amp;amp; 0x20) != 0x20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;cData = SPI0DR;&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;return cData; /**(char*)SPI_DATA[cPort];*/&lt;BR /&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Data is 154 in this routine&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Next routine in the link is in a different file&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;decleared as extern uchar SPI_Proc(uchar cValue);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*------------------------------------------------------------*&lt;BR /&gt;| Name: MAX7301_Read.&amp;nbsp;uchar MAX7301_Read(cCommand);&lt;BR /&gt;|&lt;BR /&gt;| Description: Read port&lt;BR /&gt;*/&lt;BR /&gt;uchar MAX7301_Read(/*uchar cDevice,*/ uchar cCommand)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;uchar cData;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;MAX7301_Write(/*cDevice,*/cCommand | 0x80,0);&lt;BR /&gt;&amp;nbsp;PTS /**(char*)MAX7301_SS_Port[cDevice]*/ &amp;amp;= ~ 0x80; //MAX7301_SS_SET[cDevice];&lt;BR /&gt;&amp;nbsp;(void)&amp;nbsp; SPI_Proc(/*MAX7301_Port[cDevice],*/0);&lt;BR /&gt;&amp;nbsp;cData = SPI_Proc(/*MAX7301_Port[cDevice],*/0);&lt;BR /&gt;&amp;nbsp;PTS /**(char*)MAX7301_SS_Port[cDevice]*/ |= 0x80; //MAX7301_SS_SET[cDevice];&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;return cData;&lt;BR /&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;cData is 154&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;the start of the link is&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void MAX7301_Config_Port (/*uchar cDevice,*/ uchar cCommand, uchar cDir, uchar cBit)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;uchar cData;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cCommand);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cDir);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cBit);&lt;BR /&gt;&amp;nbsp;cData = MAX7301_Read(/*cDevice,*/cCommand);&lt;BR /&gt;//&amp;nbsp; cData = cRetData;&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;cDir = cDir &amp;lt;&amp;lt; (cBit * 2);&lt;BR /&gt;&amp;nbsp;cData &amp;amp;= ~(0x03 &amp;lt;&amp;lt; (cBit * 2));&lt;BR /&gt;&amp;nbsp;cData |= cDir;&lt;BR /&gt;&amp;nbsp;MAX7301_Write (/*cDevice,*/cCommand, cData);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cCommand);&lt;BR /&gt;//&amp;nbsp; Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;Disp_8b_Dec(255);&lt;BR /&gt;}&lt;BR /&gt;&lt;/DIV&gt;&lt;DIV&gt;cData when read fromMAX7301_Read is 48&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Why is this?&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;P&gt;Message Edited by CrasyCat on &lt;SPAN class="date_text"&gt;2007-04-13&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;11:51 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 21 Nov 2006 06:20:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-for-MCU/HC12-Problem-passing-values-between-routines/m-p/137252#M1973</guid>
      <dc:creator>NZ_Design</dc:creator>
      <dc:date>2006-11-21T06:20:15Z</dc:date>
    </item>
    <item>
      <title>Re: Problem passing values between routines</title>
      <link>https://community.nxp.com/t5/CodeWarrior-for-MCU/HC12-Problem-passing-values-between-routines/m-p/137253#M1974</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&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;The function &lt;FONT face="Courier New"&gt;SPI_proc()&lt;/FONT&gt; &amp;nbsp;(as you have modified it), does not wait a sufficient period for the completion of the return data byte.&amp;nbsp; You need to wait until the SPIF flag is set, to ensure the return data from the SPI slave is valid (what the code you commented out appears to do, in principle).&amp;nbsp; The following code should do as you intend.&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 face="Courier New" size="2"&gt;uchar SPI_Proc (uchar cValue)&lt;BR /&gt;{&lt;/FONT&gt;&lt;DIV&gt;&lt;FONT face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;uchar cData;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;while ((SPI0SR &amp;amp; 0x20) != 0x20);&amp;nbsp;&amp;nbsp;&amp;nbsp;// Wait for SPTEF set&lt;BR /&gt;&amp;nbsp;&amp;nbsp;SPI0DR = cValue;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;while ((SPI0SR &amp;amp; 0x80) != 0x80);&amp;nbsp;&amp;nbsp;&amp;nbsp;// Wait for SPIF set&lt;BR /&gt;&amp;nbsp;&amp;nbsp;cData = SPI0DR;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;Disp_8b_Dec(cData);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;return cData;&lt;BR /&gt;}&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 do not know whether there might also be other problems in communicating with the MAX7301 device.&amp;nbsp; The CPOL and CPHA settings will need to match its requirements.&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 secondary comment about your "commenting out" part of the code in a single line - it will make the code easier to read, and less prone to error if you comment out the &lt;U&gt;whole&lt;/U&gt; original line, and enter the code that you require in the following line.&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;/DIV&gt;&lt;P&gt;Message Edited by bigmac on &lt;SPAN class="date_text"&gt;2006-11-21&lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;12:17 PM&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 21 Nov 2006 10:13:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-for-MCU/HC12-Problem-passing-values-between-routines/m-p/137253#M1974</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2006-11-21T10:13:59Z</dc:date>
    </item>
  </channel>
</rss>

