<?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のトピックcan't send data about 1 in TWR-K60F120</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712845#M43771</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;everyone:&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; I am learning&amp;nbsp;CAN Module.This is my program.when it is debugged, the flag about sending data doesn't be&amp;nbsp;equal to 1.So it can't be sent successfully.&lt;/P&gt;&lt;P&gt;main.c:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/32081iA248290C53402E26/image-size/large?v=v2&amp;amp;px=999" role="button" title="1.png" alt="1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CANInit（can be initialized）:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;uint8 CANInit(uint8 CANChannel,uint32 baudrateKHz,uint8 selfLoop,uint8 idMask)&lt;BR /&gt;{&lt;BR /&gt; int8 i;&lt;BR /&gt; CAN_MemMapPtr CANBaseAdd;&lt;BR /&gt; &lt;BR /&gt; //使能FlexCAN外部时钟&lt;BR /&gt; OSC0_CR |= OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK;//*晶振提供外部时钟&lt;BR /&gt; &lt;BR /&gt; //通过模块号选择模块基地址&lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; CANBaseAdd = CAN0_BASE_PTR;&lt;BR /&gt; else if(CANChannel == 1)&lt;BR /&gt; CANBaseAdd = CAN1_BASE_PTR;&lt;BR /&gt; &lt;BR /&gt; //使能CAN模块时钟&lt;BR /&gt; if(CANBaseAdd == CAN0_BASE_PTR)&lt;BR /&gt; SIM_SCGC6 |= SIM_SCGC6_FLEXCAN0_MASK;//使能CAN0的时钟模块&lt;BR /&gt; else&lt;BR /&gt; SIM_SCGC3 |= SIM_SCGC3_FLEXCAN1_MASK;//使能CAN1的时钟模块&lt;BR /&gt; /* &lt;BR /&gt; //使能CAN中断&lt;BR /&gt; if(CANChannel == 0)//使能CAN0的中断 &lt;BR /&gt; { &lt;BR /&gt; NVICICPR0 = (NVICICPR0 &amp;amp; ~(0x07&amp;lt;&amp;lt;29)) | (0x07&amp;lt;&amp;lt;29);//清除挂载在FlexCAN0的中断 &lt;BR /&gt; NVICISER0 = (NVICISER0 &amp;amp; ~(0x07&amp;lt;&amp;lt;29)) | (0x07&amp;lt;&amp;lt;29);//使能FlexCAN0中断 &lt;BR /&gt; &lt;BR /&gt; NVICICPR1 = (NVICICPR1 &amp;amp; ~(0x1F&amp;lt;&amp;lt;0)) | (0x1F);//清除挂载在FlexCAN0的中断 &lt;BR /&gt; NVICISER1 = (NVICISER1 &amp;amp; ~(0x1F&amp;lt;&amp;lt;0)) | (0x1F);//使能FlexCAN0中断 &lt;BR /&gt; } &lt;BR /&gt; else //使能CAN1的中断&lt;BR /&gt; {&lt;BR /&gt; NVICICPR1 = (NVICICPR1 &amp;amp; ~(0xFF&amp;lt;&amp;lt;5)) | (0xFF&amp;lt;&amp;lt;5);//清除挂载在FlexCAN1的中断 &lt;BR /&gt; NVICISER1 = (NVICISER1 &amp;amp; ~(0xFF&amp;lt;&amp;lt;5)) | (0xFF&amp;lt;&amp;lt;5);//使能FlexCAN1中断 &lt;BR /&gt; }&lt;BR /&gt;*/&lt;BR /&gt; //配置CAN_RX/TX复用引脚功能&lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; {&lt;BR /&gt; PORTE_PCR24 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //上拉 *PORT PCR寄存器的设置&lt;BR /&gt; PORTE_PCR25 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //上拉&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; PORTC_PCR17 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //Tx上拉&lt;BR /&gt; PORTC_PCR16 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //Rx上拉&lt;BR /&gt; } &lt;BR /&gt; //选择时钟源，外设时钟48MHz，内部时钟：12MHz&lt;BR /&gt; CAN_CTRL1_REG(CANBaseAdd) |= CAN_CTRL1_CLKSRC_MASK;//选择内部时钟 &lt;BR /&gt;// CAN_CTRL1_REG(CANBaseAdd) &amp;amp;=~CAN_CTRL1_CLKSRC_MASK;//应该是外部时钟源吧？&lt;BR /&gt; &lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) |= CAN_MCR_FRZ_MASK; //使能冻结模式 &lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) &amp;amp;= ~CAN_MCR_MDIS_MASK;//使能CAN模块&lt;BR /&gt; //确认已退出冻结模式&lt;BR /&gt; while((CAN_MCR_LPMACK_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)));&lt;BR /&gt; //软件复位&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) ^= CAN_MCR_SOFTRST_MASK; &lt;BR /&gt; //等待复位完成&lt;BR /&gt; while(CAN_MCR_SOFTRST_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)); &lt;BR /&gt; //等待进入冻结模式 &lt;BR /&gt; while(!(CAN_MCR_FRZACK_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)));&lt;BR /&gt; // Set local priority&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd)|=CAN_MCR_LPRIOEN_MASK; &lt;BR /&gt; //将16个邮箱缓冲区内容清0&lt;BR /&gt; for(i=0;i&amp;lt;16;i++)&lt;BR /&gt; {&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].CS = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].ID = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].WORD0 = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].WORD1 = 0x00000000;&lt;BR /&gt; }&lt;BR /&gt; //接收邮箱过滤IDE比较，RTR不比较&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_EACEN_MASK;//0 Rx Mailbox filter’s IDE bit is always compared and RTR is never compared despite mask bits.&lt;BR /&gt; //远程请求帧产生&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_RRS_MASK; //0 Remote Response Frame is generated.&lt;BR /&gt; //邮箱首先从接收FIFO队列匹配然后再在邮箱中匹配&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_MRP_MASK;//0 Matching starts from Rx FIFO and continues on Mailboxes&lt;BR /&gt; //使用一个32位过滤器&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) |= (CAN_MCR_REG(CANBaseAdd) &amp;amp; ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0);&lt;BR /&gt; //设置波特率&lt;BR /&gt; if(SetCANBand(CANChannel,baudrateKHz) == 1)//若设置错误&lt;BR /&gt; return 1;&lt;BR /&gt; //模式选择：回环模式或正常模式&lt;BR /&gt; //采用正常模式，即注释以下程序&lt;BR /&gt; // if(1==selfLoop)&lt;BR /&gt; // CAN_CTRL1_REG(CANBaseAdd) |= CAN_CTRL1_LPB_MASK;//使用回环模式&lt;/P&gt;&lt;P&gt;//初始化掩码寄存器&lt;BR /&gt; if(1==idMask)//屏蔽ID&lt;BR /&gt; {&lt;BR /&gt; CAN_RXMGMASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; CAN_RX14MASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; CAN_RX15MASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; }&lt;BR /&gt; else//不屏蔽ID&lt;BR /&gt; {&lt;BR /&gt; CAN_RXMGMASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; CAN_RX14MASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; CAN_RX15MASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;//如果单独掩码功能使能，为每个队列初始化单独的掩码寄存器&lt;BR /&gt; if(CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_IRMQ_MASK)&lt;BR /&gt; {&lt;BR /&gt; for(i = 0; i &amp;lt; NUMBER_OF_MB ; i++)&lt;BR /&gt; { &lt;BR /&gt; CANBaseAdd-&amp;gt;RXIMR[i] = 0x1FFFFFFFL;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; //只有在冻结模式下才能配置，配置完推出冻结模式&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) &amp;amp;= ~(CAN_MCR_HALT_MASK);&lt;BR /&gt; //等待直到退出冻结模式&lt;BR /&gt; while( CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_FRZACK_MASK); &lt;BR /&gt; //等到不在冻结模式，休眠模式或者停止模式&lt;BR /&gt; while((CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_NOTRDY_MASK));&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CANSendData（SendData）&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;uint8 CANSendData(uint8 CANChannel,uint16 iMB, uint32 id,uint8 length,uint8 Data[])&lt;BR /&gt;{&lt;BR /&gt; int16 i,wno,bno;&lt;BR /&gt; uint32 word[2] = {0};&lt;BR /&gt; CAN_MemMapPtr CANBaseAdd;&lt;BR /&gt; &lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; CANBaseAdd = CAN0_BASE_PTR;&lt;BR /&gt; else if(CANChannel == 1)&lt;BR /&gt; CANBaseAdd = CAN1_BASE_PTR;&lt;BR /&gt; &lt;BR /&gt; //缓冲区和数据长度设置错误&lt;BR /&gt; if(iMB &amp;gt;= NUMBER_OF_MB || length &amp;gt;8)&lt;BR /&gt; return 1; //超出范围&lt;BR /&gt; &lt;BR /&gt; //转换8个字节转换成32位的word存储&lt;BR /&gt; wno = (length-1)&amp;gt;&amp;gt;2;//是否超过4字节&lt;BR /&gt; bno = (length-1)%4; //&lt;BR /&gt; if(wno &amp;gt; 0) //长度大于4(即发送数据超过4字节)&lt;BR /&gt; {&lt;BR /&gt; word[0] = (&lt;BR /&gt; (Data[0]&amp;lt;&amp;lt;24) &lt;BR /&gt; | (Data[1]&amp;lt;&amp;lt;16) &lt;BR /&gt; | (Data[2]&amp;lt;&amp;lt; 8) &lt;BR /&gt; | Data[3]&lt;BR /&gt; );&lt;BR /&gt; }&lt;BR /&gt; for(i=0;i&amp;lt;=bno;i++)&lt;BR /&gt; word[wno] |= Data[(wno&amp;lt;&amp;lt;2)+i] &amp;lt;&amp;lt; (24-(i&amp;lt;&amp;lt;3));&lt;/P&gt;&lt;P&gt;/////////////////////////////////////////////////////// &lt;BR /&gt; // ID 格式&lt;BR /&gt; // B31 30 29 28 27 26 ... 11 10 9 8 7 6 5 4 3 2 1 0&lt;BR /&gt; // | | | |&lt;BR /&gt; // | | |------------------------------------|&lt;BR /&gt; // | | |--&amp;gt; 29 位 ID&lt;BR /&gt; // | |&lt;BR /&gt; // | |--&amp;gt; RTR 1: 远程帧, 0: 数据帧&lt;BR /&gt; // |&lt;BR /&gt; // |-------&amp;gt; IDE 1 : 扩展ID, 0: 标准ID&lt;BR /&gt; ///////////////////////////////////////////////////////&lt;BR /&gt; &lt;BR /&gt; //通过id判断帧类型——扩展帧&lt;BR /&gt; wno = (id &amp;amp; CAN_MSG_IDE_MASK)&amp;gt;&amp;gt;CAN_MSG_IDE_BIT_NO; //IDE&lt;BR /&gt; //通过id判断帧类型——远程帧&lt;BR /&gt; bno = (id &amp;amp; CAN_MSG_TYPE_MASK)&amp;gt;&amp;gt;CAN_MSG_TYPE_BIT_NO;//RTR&lt;BR /&gt; &lt;BR /&gt; //获得ID位数&lt;BR /&gt; i = wno? 0: FLEXCAN_MB_ID_STD_BIT_NO;&lt;BR /&gt; &lt;BR /&gt; //以下四步骤为发送过程&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].CS = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_INACTIVE)//缓冲区写激活代码&lt;BR /&gt; | (wno&amp;lt;&amp;lt;FLEXCAN_MB_CS_IDE_BIT_NO)//缓冲区写IDE位&lt;BR /&gt; | (bno&amp;lt;&amp;lt;FLEXCAN_MB_CS_RTR_BIT_NO)//缓冲区写RTR位&lt;BR /&gt; | FLEXCAN_MB_CS_LENGTH(length); //缓冲区写数据长度&lt;BR /&gt; &lt;BR /&gt; //缓冲区写ID&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].ID = (1 &amp;lt;&amp;lt; FLEXCAN_MB_ID_PRIO_BIT_NO) //传输的优先级&lt;BR /&gt; | ((id &amp;amp; ~(CAN_MSG_IDE_MASK|CAN_MSG_TYPE_MASK))&amp;lt;&amp;lt;i); &lt;BR /&gt; &lt;BR /&gt; //缓冲区写内容&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].WORD0 = word[0];&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].WORD1 = word[1];&lt;/P&gt;&lt;P&gt;//延迟&lt;BR /&gt; for(i = 0;i &amp;lt; 100;i++);&lt;BR /&gt; &lt;BR /&gt; //通过制定的发送代码开始发送&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].CS = (CANBaseAdd-&amp;gt;MB[iMB].CS &amp;amp; ~(FLEXCAN_MB_CS_CODE_MASK)) &lt;BR /&gt; | FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE);//写激活代码&lt;BR /&gt; &lt;BR /&gt; &lt;BR /&gt; //限时等待发送完成（如果使用中断则限时等待语句可删除）&lt;BR /&gt; i=0;&lt;BR /&gt; &lt;BR /&gt; GPIOA_PTOR|=GPIO_PDOR_PDO(GPIO_PIN(29));//指示灯的亮、暗状态切换 &lt;BR /&gt; while(!(CANBaseAdd-&amp;gt;IFLAG1 &amp;amp; (1&amp;lt;&amp;lt;iMB)))&lt;BR /&gt; {&lt;BR /&gt; if((i++)&amp;gt;0x1000)&lt;BR /&gt; return 1;&lt;BR /&gt; }&lt;BR /&gt; //清报文缓冲区中断标志&lt;BR /&gt; &lt;BR /&gt; CANBaseAdd-&amp;gt;IFLAG1 = (1&amp;lt;&amp;lt;iMB);&lt;BR /&gt; GPIOA_PTOR&amp;amp;=~GPIO_PDOR_PDO(GPIO_PIN(28));//指示灯的亮、暗状态切换&lt;BR /&gt; return 0;&lt;BR /&gt; &lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 25 Sep 2017 13:18:37 GMT</pubDate>
    <dc:creator>minminzhengzhen</dc:creator>
    <dc:date>2017-09-25T13:18:37Z</dc:date>
    <item>
      <title>can't send data about 1 in TWR-K60F120</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712845#M43771</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;everyone:&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; I am learning&amp;nbsp;CAN Module.This is my program.when it is debugged, the flag about sending data doesn't be&amp;nbsp;equal to 1.So it can't be sent successfully.&lt;/P&gt;&lt;P&gt;main.c:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/32081iA248290C53402E26/image-size/large?v=v2&amp;amp;px=999" role="button" title="1.png" alt="1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CANInit（can be initialized）:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;uint8 CANInit(uint8 CANChannel,uint32 baudrateKHz,uint8 selfLoop,uint8 idMask)&lt;BR /&gt;{&lt;BR /&gt; int8 i;&lt;BR /&gt; CAN_MemMapPtr CANBaseAdd;&lt;BR /&gt; &lt;BR /&gt; //使能FlexCAN外部时钟&lt;BR /&gt; OSC0_CR |= OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK;//*晶振提供外部时钟&lt;BR /&gt; &lt;BR /&gt; //通过模块号选择模块基地址&lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; CANBaseAdd = CAN0_BASE_PTR;&lt;BR /&gt; else if(CANChannel == 1)&lt;BR /&gt; CANBaseAdd = CAN1_BASE_PTR;&lt;BR /&gt; &lt;BR /&gt; //使能CAN模块时钟&lt;BR /&gt; if(CANBaseAdd == CAN0_BASE_PTR)&lt;BR /&gt; SIM_SCGC6 |= SIM_SCGC6_FLEXCAN0_MASK;//使能CAN0的时钟模块&lt;BR /&gt; else&lt;BR /&gt; SIM_SCGC3 |= SIM_SCGC3_FLEXCAN1_MASK;//使能CAN1的时钟模块&lt;BR /&gt; /* &lt;BR /&gt; //使能CAN中断&lt;BR /&gt; if(CANChannel == 0)//使能CAN0的中断 &lt;BR /&gt; { &lt;BR /&gt; NVICICPR0 = (NVICICPR0 &amp;amp; ~(0x07&amp;lt;&amp;lt;29)) | (0x07&amp;lt;&amp;lt;29);//清除挂载在FlexCAN0的中断 &lt;BR /&gt; NVICISER0 = (NVICISER0 &amp;amp; ~(0x07&amp;lt;&amp;lt;29)) | (0x07&amp;lt;&amp;lt;29);//使能FlexCAN0中断 &lt;BR /&gt; &lt;BR /&gt; NVICICPR1 = (NVICICPR1 &amp;amp; ~(0x1F&amp;lt;&amp;lt;0)) | (0x1F);//清除挂载在FlexCAN0的中断 &lt;BR /&gt; NVICISER1 = (NVICISER1 &amp;amp; ~(0x1F&amp;lt;&amp;lt;0)) | (0x1F);//使能FlexCAN0中断 &lt;BR /&gt; } &lt;BR /&gt; else //使能CAN1的中断&lt;BR /&gt; {&lt;BR /&gt; NVICICPR1 = (NVICICPR1 &amp;amp; ~(0xFF&amp;lt;&amp;lt;5)) | (0xFF&amp;lt;&amp;lt;5);//清除挂载在FlexCAN1的中断 &lt;BR /&gt; NVICISER1 = (NVICISER1 &amp;amp; ~(0xFF&amp;lt;&amp;lt;5)) | (0xFF&amp;lt;&amp;lt;5);//使能FlexCAN1中断 &lt;BR /&gt; }&lt;BR /&gt;*/&lt;BR /&gt; //配置CAN_RX/TX复用引脚功能&lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; {&lt;BR /&gt; PORTE_PCR24 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //上拉 *PORT PCR寄存器的设置&lt;BR /&gt; PORTE_PCR25 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //上拉&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; PORTC_PCR17 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //Tx上拉&lt;BR /&gt; PORTC_PCR16 = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //Rx上拉&lt;BR /&gt; } &lt;BR /&gt; //选择时钟源，外设时钟48MHz，内部时钟：12MHz&lt;BR /&gt; CAN_CTRL1_REG(CANBaseAdd) |= CAN_CTRL1_CLKSRC_MASK;//选择内部时钟 &lt;BR /&gt;// CAN_CTRL1_REG(CANBaseAdd) &amp;amp;=~CAN_CTRL1_CLKSRC_MASK;//应该是外部时钟源吧？&lt;BR /&gt; &lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) |= CAN_MCR_FRZ_MASK; //使能冻结模式 &lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) &amp;amp;= ~CAN_MCR_MDIS_MASK;//使能CAN模块&lt;BR /&gt; //确认已退出冻结模式&lt;BR /&gt; while((CAN_MCR_LPMACK_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)));&lt;BR /&gt; //软件复位&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) ^= CAN_MCR_SOFTRST_MASK; &lt;BR /&gt; //等待复位完成&lt;BR /&gt; while(CAN_MCR_SOFTRST_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)); &lt;BR /&gt; //等待进入冻结模式 &lt;BR /&gt; while(!(CAN_MCR_FRZACK_MASK &amp;amp; CAN_MCR_REG(CANBaseAdd)));&lt;BR /&gt; // Set local priority&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd)|=CAN_MCR_LPRIOEN_MASK; &lt;BR /&gt; //将16个邮箱缓冲区内容清0&lt;BR /&gt; for(i=0;i&amp;lt;16;i++)&lt;BR /&gt; {&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].CS = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].ID = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].WORD0 = 0x00000000;&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[i].WORD1 = 0x00000000;&lt;BR /&gt; }&lt;BR /&gt; //接收邮箱过滤IDE比较，RTR不比较&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_EACEN_MASK;//0 Rx Mailbox filter’s IDE bit is always compared and RTR is never compared despite mask bits.&lt;BR /&gt; //远程请求帧产生&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_RRS_MASK; //0 Remote Response Frame is generated.&lt;BR /&gt; //邮箱首先从接收FIFO队列匹配然后再在邮箱中匹配&lt;BR /&gt; CAN_CTRL2_REG(CANBaseAdd) &amp;amp;= ~CAN_CTRL2_MRP_MASK;//0 Matching starts from Rx FIFO and continues on Mailboxes&lt;BR /&gt; //使用一个32位过滤器&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) |= (CAN_MCR_REG(CANBaseAdd) &amp;amp; ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0);&lt;BR /&gt; //设置波特率&lt;BR /&gt; if(SetCANBand(CANChannel,baudrateKHz) == 1)//若设置错误&lt;BR /&gt; return 1;&lt;BR /&gt; //模式选择：回环模式或正常模式&lt;BR /&gt; //采用正常模式，即注释以下程序&lt;BR /&gt; // if(1==selfLoop)&lt;BR /&gt; // CAN_CTRL1_REG(CANBaseAdd) |= CAN_CTRL1_LPB_MASK;//使用回环模式&lt;/P&gt;&lt;P&gt;//初始化掩码寄存器&lt;BR /&gt; if(1==idMask)//屏蔽ID&lt;BR /&gt; {&lt;BR /&gt; CAN_RXMGMASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; CAN_RX14MASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; CAN_RX15MASK_REG(CANBaseAdd) = 0x1FFFFFFF;&lt;BR /&gt; }&lt;BR /&gt; else//不屏蔽ID&lt;BR /&gt; {&lt;BR /&gt; CAN_RXMGMASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; CAN_RX14MASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; CAN_RX15MASK_REG(CANBaseAdd) = 0x0;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;//如果单独掩码功能使能，为每个队列初始化单独的掩码寄存器&lt;BR /&gt; if(CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_IRMQ_MASK)&lt;BR /&gt; {&lt;BR /&gt; for(i = 0; i &amp;lt; NUMBER_OF_MB ; i++)&lt;BR /&gt; { &lt;BR /&gt; CANBaseAdd-&amp;gt;RXIMR[i] = 0x1FFFFFFFL;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; //只有在冻结模式下才能配置，配置完推出冻结模式&lt;BR /&gt; CAN_MCR_REG(CANBaseAdd) &amp;amp;= ~(CAN_MCR_HALT_MASK);&lt;BR /&gt; //等待直到退出冻结模式&lt;BR /&gt; while( CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_FRZACK_MASK); &lt;BR /&gt; //等到不在冻结模式，休眠模式或者停止模式&lt;BR /&gt; while((CAN_MCR_REG(CANBaseAdd) &amp;amp; CAN_MCR_NOTRDY_MASK));&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CANSendData（SendData）&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;uint8 CANSendData(uint8 CANChannel,uint16 iMB, uint32 id,uint8 length,uint8 Data[])&lt;BR /&gt;{&lt;BR /&gt; int16 i,wno,bno;&lt;BR /&gt; uint32 word[2] = {0};&lt;BR /&gt; CAN_MemMapPtr CANBaseAdd;&lt;BR /&gt; &lt;BR /&gt; if(CANChannel == 0)&lt;BR /&gt; CANBaseAdd = CAN0_BASE_PTR;&lt;BR /&gt; else if(CANChannel == 1)&lt;BR /&gt; CANBaseAdd = CAN1_BASE_PTR;&lt;BR /&gt; &lt;BR /&gt; //缓冲区和数据长度设置错误&lt;BR /&gt; if(iMB &amp;gt;= NUMBER_OF_MB || length &amp;gt;8)&lt;BR /&gt; return 1; //超出范围&lt;BR /&gt; &lt;BR /&gt; //转换8个字节转换成32位的word存储&lt;BR /&gt; wno = (length-1)&amp;gt;&amp;gt;2;//是否超过4字节&lt;BR /&gt; bno = (length-1)%4; //&lt;BR /&gt; if(wno &amp;gt; 0) //长度大于4(即发送数据超过4字节)&lt;BR /&gt; {&lt;BR /&gt; word[0] = (&lt;BR /&gt; (Data[0]&amp;lt;&amp;lt;24) &lt;BR /&gt; | (Data[1]&amp;lt;&amp;lt;16) &lt;BR /&gt; | (Data[2]&amp;lt;&amp;lt; 8) &lt;BR /&gt; | Data[3]&lt;BR /&gt; );&lt;BR /&gt; }&lt;BR /&gt; for(i=0;i&amp;lt;=bno;i++)&lt;BR /&gt; word[wno] |= Data[(wno&amp;lt;&amp;lt;2)+i] &amp;lt;&amp;lt; (24-(i&amp;lt;&amp;lt;3));&lt;/P&gt;&lt;P&gt;/////////////////////////////////////////////////////// &lt;BR /&gt; // ID 格式&lt;BR /&gt; // B31 30 29 28 27 26 ... 11 10 9 8 7 6 5 4 3 2 1 0&lt;BR /&gt; // | | | |&lt;BR /&gt; // | | |------------------------------------|&lt;BR /&gt; // | | |--&amp;gt; 29 位 ID&lt;BR /&gt; // | |&lt;BR /&gt; // | |--&amp;gt; RTR 1: 远程帧, 0: 数据帧&lt;BR /&gt; // |&lt;BR /&gt; // |-------&amp;gt; IDE 1 : 扩展ID, 0: 标准ID&lt;BR /&gt; ///////////////////////////////////////////////////////&lt;BR /&gt; &lt;BR /&gt; //通过id判断帧类型——扩展帧&lt;BR /&gt; wno = (id &amp;amp; CAN_MSG_IDE_MASK)&amp;gt;&amp;gt;CAN_MSG_IDE_BIT_NO; //IDE&lt;BR /&gt; //通过id判断帧类型——远程帧&lt;BR /&gt; bno = (id &amp;amp; CAN_MSG_TYPE_MASK)&amp;gt;&amp;gt;CAN_MSG_TYPE_BIT_NO;//RTR&lt;BR /&gt; &lt;BR /&gt; //获得ID位数&lt;BR /&gt; i = wno? 0: FLEXCAN_MB_ID_STD_BIT_NO;&lt;BR /&gt; &lt;BR /&gt; //以下四步骤为发送过程&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].CS = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_INACTIVE)//缓冲区写激活代码&lt;BR /&gt; | (wno&amp;lt;&amp;lt;FLEXCAN_MB_CS_IDE_BIT_NO)//缓冲区写IDE位&lt;BR /&gt; | (bno&amp;lt;&amp;lt;FLEXCAN_MB_CS_RTR_BIT_NO)//缓冲区写RTR位&lt;BR /&gt; | FLEXCAN_MB_CS_LENGTH(length); //缓冲区写数据长度&lt;BR /&gt; &lt;BR /&gt; //缓冲区写ID&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].ID = (1 &amp;lt;&amp;lt; FLEXCAN_MB_ID_PRIO_BIT_NO) //传输的优先级&lt;BR /&gt; | ((id &amp;amp; ~(CAN_MSG_IDE_MASK|CAN_MSG_TYPE_MASK))&amp;lt;&amp;lt;i); &lt;BR /&gt; &lt;BR /&gt; //缓冲区写内容&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].WORD0 = word[0];&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].WORD1 = word[1];&lt;/P&gt;&lt;P&gt;//延迟&lt;BR /&gt; for(i = 0;i &amp;lt; 100;i++);&lt;BR /&gt; &lt;BR /&gt; //通过制定的发送代码开始发送&lt;BR /&gt; CANBaseAdd-&amp;gt;MB[iMB].CS = (CANBaseAdd-&amp;gt;MB[iMB].CS &amp;amp; ~(FLEXCAN_MB_CS_CODE_MASK)) &lt;BR /&gt; | FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE);//写激活代码&lt;BR /&gt; &lt;BR /&gt; &lt;BR /&gt; //限时等待发送完成（如果使用中断则限时等待语句可删除）&lt;BR /&gt; i=0;&lt;BR /&gt; &lt;BR /&gt; GPIOA_PTOR|=GPIO_PDOR_PDO(GPIO_PIN(29));//指示灯的亮、暗状态切换 &lt;BR /&gt; while(!(CANBaseAdd-&amp;gt;IFLAG1 &amp;amp; (1&amp;lt;&amp;lt;iMB)))&lt;BR /&gt; {&lt;BR /&gt; if((i++)&amp;gt;0x1000)&lt;BR /&gt; return 1;&lt;BR /&gt; }&lt;BR /&gt; //清报文缓冲区中断标志&lt;BR /&gt; &lt;BR /&gt; CANBaseAdd-&amp;gt;IFLAG1 = (1&amp;lt;&amp;lt;iMB);&lt;BR /&gt; GPIOA_PTOR&amp;amp;=~GPIO_PDOR_PDO(GPIO_PIN(28));//指示灯的亮、暗状态切换&lt;BR /&gt; return 0;&lt;BR /&gt; &lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 25 Sep 2017 13:18:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712845#M43771</guid>
      <dc:creator>minminzhengzhen</dc:creator>
      <dc:date>2017-09-25T13:18:37Z</dc:date>
    </item>
    <item>
      <title>Re: can't send data about 1 in TWR-K60F120</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712846#M43772</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I will answer your question here: '&lt;A _jive_internal="true" href="https://community.nxp.com/thread/460963"&gt;can't send data about CAN Module in TWR-K60F120&lt;/A&gt;'.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Robin&lt;/P&gt;&lt;P style="min- padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Sep 2017 07:07:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712846#M43772</guid>
      <dc:creator>Robin_Shen</dc:creator>
      <dc:date>2017-09-26T07:07:10Z</dc:date>
    </item>
    <item>
      <title>Re: can't send data about 1 in TWR-K60F120</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712847#M43773</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;hello：&lt;/P&gt;&lt;P&gt;I am eager to hope a demo about CAN module for K60FN1M0。Because I program a CAN send procedures refer to the other procedures, but CAN sends data unsuccessfully. I don't figure out the reason.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Sep 2017 08:19:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/can-t-send-data-about-1-in-TWR-K60F120/m-p/712847#M43773</guid>
      <dc:creator>minminzhengzhen</dc:creator>
      <dc:date>2017-09-26T08:19:34Z</dc:date>
    </item>
  </channel>
</rss>

