<?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 MCF51JM128 CAN tx issues in ColdFire/68K Microcontrollers and Processors</title>
    <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155812#M4508</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm writing a CAN transmit function and I'm having problems with the wrong data being transmitted onto the bus.&amp;nbsp; The data that is transmitted on to the bus (and received when in loopback mode) is not what I am writing into the IDR0..3, DSR0..7, and DLR registers.&amp;nbsp; I can scope the tx line and see the data transmitted is, indeed, what is being received in loopback mode: the wrong data.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm using Codewarrior V6.2 and the DEMOJM board.&amp;nbsp; The tx function follows:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;
void CAN_send_bytes(N_AI_t N_AI, N_data_t* data, signed int len)
{
&amp;nbsp; char *dataptr;
&amp;nbsp; volatile char temp0, temp1, temp2, temp3;
 
DisableInterrupts;
//standard (11-bit) addressing only
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp0 = (char)( N_AI.CANID &amp;gt;&amp;gt; 3 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 = (char)( N_AI.CANID &amp;lt;&amp;lt; 5 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 &amp;amp;= ~0x10;//&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR1_IDE = 0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(N_AI.RTR)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 |= 0x08;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 &amp;amp;= ~0x08;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2 = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp3 = 0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR0 = temp0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR1 = temp1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR2 = temp2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR3 = temp3;

&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRDLR = 8;//(char)len + 1; //data + 1 N_PCI byte
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp0 = (char)(len &amp;amp; 0x0F);
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRDSR0 = temp0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; dataptr = (char*)&amp;amp;CANRDSR1;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(len--)&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *dataptr = *data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++dataptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++data;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp; do
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANTBSEL = CANTFLG;
&amp;nbsp; }while(!CANTBSEL); //select available transmit register.&amp;nbsp; keep looping until one is available.
 
&amp;nbsp; CANTFLG = CANTBSEL;
EnableInterrupts; 
}&lt;/PRE&gt;&lt;P&gt;I think that I'm using the process stated in the Functional Description and Programmer's Model sections of the data sheet.&amp;nbsp; Any ideas on where I'm going wrong?&lt;/P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class="message-edit-history"&gt;&lt;SPAN class="edit-author"&gt;Message Edited by ElBonte on&lt;/SPAN&gt; &lt;SPAN class="local-date"&gt;2009-02-24&lt;/SPAN&gt; &lt;SPAN class="local-time"&gt;04:13 PM&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 29 Oct 2020 08:59:38 GMT</pubDate>
    <dc:creator>ElBonte</dc:creator>
    <dc:date>2020-10-29T08:59:38Z</dc:date>
    <item>
      <title>MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155812#M4508</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm writing a CAN transmit function and I'm having problems with the wrong data being transmitted onto the bus.&amp;nbsp; The data that is transmitted on to the bus (and received when in loopback mode) is not what I am writing into the IDR0..3, DSR0..7, and DLR registers.&amp;nbsp; I can scope the tx line and see the data transmitted is, indeed, what is being received in loopback mode: the wrong data.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm using Codewarrior V6.2 and the DEMOJM board.&amp;nbsp; The tx function follows:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;
void CAN_send_bytes(N_AI_t N_AI, N_data_t* data, signed int len)
{
&amp;nbsp; char *dataptr;
&amp;nbsp; volatile char temp0, temp1, temp2, temp3;
 
DisableInterrupts;
//standard (11-bit) addressing only
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp0 = (char)( N_AI.CANID &amp;gt;&amp;gt; 3 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 = (char)( N_AI.CANID &amp;lt;&amp;lt; 5 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 &amp;amp;= ~0x10;//&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR1_IDE = 0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(N_AI.RTR)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 |= 0x08;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp1 &amp;amp;= ~0x08;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2 = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp3 = 0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR0 = temp0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR1 = temp1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR2 = temp2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRIDR3 = temp3;

&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRDLR = 8;//(char)len + 1; //data + 1 N_PCI byte
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; temp0 = (char)(len &amp;amp; 0x0F);
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANRDSR0 = temp0;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; dataptr = (char*)&amp;amp;CANRDSR1;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(len--)&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *dataptr = *data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++dataptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++data;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp; do
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; CANTBSEL = CANTFLG;
&amp;nbsp; }while(!CANTBSEL); //select available transmit register.&amp;nbsp; keep looping until one is available.
 
&amp;nbsp; CANTFLG = CANTBSEL;
EnableInterrupts; 
}&lt;/PRE&gt;&lt;P&gt;I think that I'm using the process stated in the Functional Description and Programmer's Model sections of the data sheet.&amp;nbsp; Any ideas on where I'm going wrong?&lt;/P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class="message-edit-history"&gt;&lt;SPAN class="edit-author"&gt;Message Edited by ElBonte on&lt;/SPAN&gt; &lt;SPAN class="local-date"&gt;2009-02-24&lt;/SPAN&gt; &lt;SPAN class="local-time"&gt;04:13 PM&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 08:59:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155812#M4508</guid>
      <dc:creator>ElBonte</dc:creator>
      <dc:date>2020-10-29T08:59:38Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155813#M4509</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This should be done before accessing TX message buffer, not after:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do&lt;BR /&gt;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CANTBSEL = CANTFLG;&lt;BR /&gt;&amp;nbsp; }while(!CANTBSEL); //select available transmit register.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;CANTBSEL is used to map one of 3 TX buffers to the memory map. So you should first set up CANTBSEL, fill TX buffer (DSRx, IDRx, DLC registers), then clear TX flag like you do CANTFLG=CANTBSEL.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 02:27:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155813#M4509</guid>
      <dc:creator>kef</dc:creator>
      <dc:date>2009-02-25T02:27:38Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155814#M4510</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;OK, I must've misunderstood how the buffering mechanism works.&amp;nbsp; I'll try that now.&amp;nbsp; Thank you.&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 02:34:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155814#M4510</guid>
      <dc:creator>ElBonte</dc:creator>
      <dc:date>2009-02-25T02:34:49Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155815#M4511</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;No luck with that last effort.&amp;nbsp; I simplified the function to just write constants to the CANRIDRx and CANRDSRx registers as follows:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;
void CAN_send_bytes(N_AI_t N_AI, N_data_t* data, signed int len){  char *dataptr;  volatile char temp0, temp1, temp2, temp3;    do  {    CANTBSEL = CANTFLG;  }while(!CANTBSEL); //select available transmit register.  keep looping until one is available.  CANRIDR0 = 0x55;  CANRIDR1 = 0x55;  CANRIDR2 = 0x55;  CANRIDR3 = 0x55;  CANRDSR0 = 0xAA;  CANRDSR1 = 0xAA;  CANRDSR2 = 0xAA;  CANRDSR3 = 0xAA;  CANRDSR4 = 0xAA;  CANRDSR5 = 0xAA;  CANRDSR6 = 0xAA;  CANRDSR7 = 0xAA;  CANRDLR  = 8;    CANTFLG = CANTBSEL;}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;The frame that is received in loopback mode has CANRIDR0 = 0x92 and CANRIDR1 = 0xF0, CANRDSR0 = 0x69 and CANRDSR1 = 0x4D.&amp;nbsp; CANRDLR is always 12 (0xC).&amp;nbsp; Other registers are random.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any other suggestions?&amp;nbsp; I'm running out of ideas as to what I could be doing wrong and how to debug this.&lt;/P&gt;&amp;nbsp;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 08:59:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155815#M4511</guid>
      <dc:creator>ElBonte</dc:creator>
      <dc:date>2020-10-29T08:59:40Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155816#M4512</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Don't know why IDR0 and DLC differ, but please don't compare&amp;nbsp;DSR. You are sending 11bit-ID message with RTR set, so no data is sent.&lt;/P&gt;&lt;P&gt;Do you read all messages from receive queue? Is RXF=0 before you send your message, and RXF=1 after?&lt;/P&gt;&lt;DIV class="message-edit-history"&gt;&lt;SPAN class="edit-author"&gt;Message Edited by kef on&lt;/SPAN&gt; &lt;SPAN class="local-date"&gt;2009-02-24&lt;/SPAN&gt; &lt;SPAN class="local-time"&gt;10:02 PM&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 04:01:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155816#M4512</guid>
      <dc:creator>kef</dc:creator>
      <dc:date>2009-02-25T04:01:45Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155817#M4513</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Understood on not comparing DSR, as the (corrupt) received data indicates it isn't a a data frame.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am receiving the frame using the CANrx interrupt, so the flag must be getting set by the CAN module.&amp;nbsp; Just to double-check, I checked the RXF before the CANTFLG=CANTBSEL; line and the flag is cleared.&amp;nbsp; There is only one frame in the receive FIFO for each frame I attempt to send.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Just for reference, the frame I am trying to send (at least prior to the last post) has the ID = 0x7DF, IDE=0, and RTR=0 and DLR = 8.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks, by the way, for the help.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 04:17:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155817#M4513</guid>
      <dc:creator>ElBonte</dc:creator>
      <dc:date>2009-02-25T04:17:53Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155818#M4514</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;OK, figured it out.&amp;nbsp; I was writing to the CAN rx registers (CAN&lt;STRONG&gt;R&lt;/STRONG&gt;DRx, CAN&lt;STRONG&gt;R&lt;/STRONG&gt;IDx, and CAN&lt;STRONG&gt;R&lt;/STRONG&gt;DLR) which was, of course, doing nothing.&amp;nbsp; I am now correctly writing to the transmit registers (CAN&lt;STRONG&gt;T&lt;/STRONG&gt;DRx, CAN&lt;STRONG&gt;T&lt;/STRONG&gt;IDx, and CAN&lt;STRONG&gt;T&lt;/STRONG&gt;DLR, respectively).&amp;nbsp; I never connected the R in those register names with "Receive".&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 06:48:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155818#M4514</guid>
      <dc:creator>ElBonte</dc:creator>
      <dc:date>2009-02-25T06:48:48Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51JM128 CAN tx issues</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155819#M4515</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Wow. Didn't notice R vs T in register names. Full MSCAN module register names differ slightly from family to family, so I didn't check if all letters&amp;nbsp;are OK :smileyhappy:. Hope receive is working OK now.&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Feb 2009 13:01:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51JM128-CAN-tx-issues/m-p/155819#M4515</guid>
      <dc:creator>kef</dc:creator>
      <dc:date>2009-02-25T13:01:50Z</dc:date>
    </item>
  </channel>
</rss>

