<?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 9s12xet256 CAN in S12 / MagniV Microcontrollers</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/9s12xet256-CAN/m-p/487227#M12082</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I met a problem when I was trying to send messages using MSCAN module in 9S12XET256. I read it in the datesheet that&amp;nbsp; CAN0TFLG would be set by hardware ,but when I put the data in the buffer, I cleared the flag,but the flag did not be set ,so the process was stopped in finding an empty buffer after i sent data 3 times.I donnot know why?&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;code:&lt;/P&gt;&lt;P&gt;########################################################&lt;/P&gt;&lt;P&gt;CAN.h&lt;/P&gt;&lt;P&gt;#########################################################&lt;/P&gt;&lt;P&gt;#ifndef _CAN_H_&lt;/P&gt;&lt;P&gt;#define _CAN_H_&lt;/P&gt;&lt;P&gt;&amp;nbsp; #include "MC9S12XET256.h"&lt;/P&gt;&lt;P&gt;&amp;nbsp; #define BOOL&amp;nbsp; byte&lt;/P&gt;&lt;P&gt;&amp;nbsp; //宏定义busclk == 16M&lt;/P&gt;&lt;P&gt;&amp;nbsp; #define busclk&amp;nbsp; 16&lt;/P&gt;&lt;P&gt;&amp;nbsp; //宏定义busclk == 8M&lt;/P&gt;&lt;P&gt;&amp;nbsp; //#define busclk 8&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //定义结构体&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; typedef struct{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword Tx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Prio;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Data[8];&lt;/P&gt;&lt;P&gt;&amp;nbsp; } MSCAN_T_Msg;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; typedef struct{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword Rx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Rx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Rx_Data[8];&lt;/P&gt;&lt;P&gt;&amp;nbsp; } MSCAN_R_Msg;&lt;/P&gt;&lt;P&gt;//函数声明&amp;nbsp; &lt;/P&gt;&lt;P&gt;//extern void createMsg(MSCAN_T_Msg *Msg,dword id,byte d[8],byte length,byte prio) ;&lt;/P&gt;&lt;P&gt;extern void setBaudRate(word baud_rate);&lt;/P&gt;&lt;P&gt;extern BOOL CAN_Send(MSCAN_T_Msg Msg);&lt;/P&gt;&lt;P&gt;//extern BOOL CAN1_Send(MSCAN_T_Msg Msg);&lt;/P&gt;&lt;P&gt;extern BOOL CAN_Receive(MSCAN_R_Msg *msg);&lt;/P&gt;&lt;P&gt;extern void CAN_Init(byte loop); &lt;/P&gt;&lt;P&gt;//extern void CAN1_Init(byte loop);&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;###########################################################################&lt;/P&gt;&lt;P&gt;CAN.c&lt;/P&gt;&lt;P&gt;###########################################################################&lt;/P&gt;&lt;P&gt;//********************************************************&lt;/P&gt;&lt;P&gt;// 需先在CAN.h中设置总线时钟，默认设置16M&amp;nbsp; &lt;/P&gt;&lt;P&gt;//********************************************************&lt;/P&gt;&lt;P&gt;#include "CAN.h"&lt;/P&gt;&lt;P&gt;//MSCAN_R_Msg RxMsg;&lt;/P&gt;&lt;P&gt;//MSCAN_T_Msg TxMsg;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 初始化函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;void CAN_Init(byte loop)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; MODRR_MODRR0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; MODRR_MODRR1 = 1;&amp;nbsp; //选择PM0 PM1作为CAN0的引脚&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (loop) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果 loop = 1;使能环回自测&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAN0CTL1 = CAN0CTL1_LOOPB_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL0 = CAN0CTL0_INITRQ_MASK;//进入初始化模式&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(!CAN0CTL1_INITAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待初始化响应&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL1 = CAN0CTL1_CANE_MASK;//使能模块,选择晶振（4M）时钟作为时钟源&lt;/P&gt;&lt;P&gt;&amp;nbsp; //setBaudRate(250);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0BTR0 = 0X00;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0BTR1 = 0X1C;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //250k&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR0 = _canbtr0; &lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR0 = CANBTR0_BRP0_MASK+CANBTR0_SJW_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //波特率2分频,同步跳转宽度4&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1 = _canbtr1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1_TSEG = 3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1_TSEG = 10;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //相位缓冲段SEG1、SEG2长度设置 4,11个Tq&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAC_IDAM = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Four 16-bit acceptance filters&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR0 = 0x00;CAN0IDMR0 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR1 = 0x00;CAN0IDMR1 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR2 = 0x00;CAN0IDMR2 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR3 = 0x00;CAN0IDMR3 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR4 = 0x00;CAN0IDMR4 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR5 = 0x00;CAN0IDMR5 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR6 = 0x00;CAN0IDMR6 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR7 = 0x00;CAN0IDMR7 = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //接受所有的地址的消息&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL0_INITRQ = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //关闭CAN初始化&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(CAN0CTL1_INITAK)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待关闭初始化响应&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!CANCTL0_SYNCH)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待CAN同步(连到总线是需要判断同步)&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; CAN0RFLG_RXF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //清空消息接受缓冲器&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; CAN0RIER_RXFIE = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //使能接收消息中断&amp;nbsp; &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 接收数据函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;BOOL CAN_Receive(MSCAN_R_Msg *msg) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //接收8个数据&lt;/P&gt;&lt;P&gt;&amp;nbsp; byte i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (CAN0RFLG_RXF){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果接收缓冲器满，返回0&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; /* if (CANRXIDR1_IDE==0) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果是标准格式帧结构&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_ID = (word)((CANRXIDR1&amp;lt;&amp;lt;8)+CANRXIDR0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if(CANRXIDR1_IDE==1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果是扩展格式帧结构&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_ID = (CANRXIDR3&amp;lt;&amp;lt;24)+(CANRXIDR2&amp;lt;&amp;lt;16)+(CANRXIDR1&amp;lt;&amp;lt;8)+CANRXIDR0;//MSCAN Receive Identifier Register 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; }*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; msg-&amp;gt;Rx_ID = (CAN0RXIDR3&amp;lt;&amp;lt;24)+(CAN0RXIDR2&amp;lt;&amp;lt;16)+(CAN0RXIDR1&amp;lt;&amp;lt;8)+CAN0RXIDR0;//MSCAN Receive Identifier Register 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; msg-&amp;gt;Rx_Length= CAN0RXDLR;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;msg-&amp;gt;Rx_Length;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_Data[i] = *(&amp;amp;(CAN0RXDSR0)+i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0RFLG = CAN0RFLG_RXF_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return (1);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 发送数据函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;BOOL CAN_Send(MSCAN_T_Msg Msg) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; byte i,Txbuf_empty_flag=0;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if(Msg.Tx_Length&amp;gt;8)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果Msg的长度大于8，返回0&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; //if(CANCTL0_SYNCH!= 0 )&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果没有同步，返回0 &lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; return (0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; while (!(CAN0TFLG &amp;amp; (0x01&amp;lt;&amp;lt;Txbuf_empty_flag))) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Txbuf_empty_flag++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Txbuf_empty_flag &amp;gt;= 3)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Txbuf_empty_flag = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //从三个传输缓冲器中找一个空的&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TBSEL = (0x01&amp;lt;&amp;lt;Txbuf_empty_flag);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //选择可用的buffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR0 = (byte)(Msg.Tx_ID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR1 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;8);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR2 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;16);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR3 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;24);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXDLR = Msg.Tx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXTBPR = Msg.Tx_Prio;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;Msg.Tx_Length;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(&amp;amp;CAN0TXDSR0 + i) = Msg.Tx_Data[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TFLG =(0x01&amp;lt;&amp;lt;Txbuf_empty_flag);&amp;nbsp; //清除标志位&lt;/P&gt;&lt;P&gt;&amp;nbsp; while((CAN0TFLG&amp;amp;(0x01&amp;lt;&amp;lt;Txbuf_empty_flag))== 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; return (1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#########################################################################&lt;/P&gt;&lt;P&gt;main.c&lt;/P&gt;&lt;P&gt;##########################################################################&lt;/P&gt;&lt;P&gt;#include &amp;lt;hidef.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* common defines and macros */&lt;/P&gt;&lt;P&gt;#include "derivative.h"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* derivative-specific definitions */&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include "CAN.h"&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void delay() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; int i,j;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;500;i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(j=0;j&amp;lt;500;j++);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;MSCAN_R_Msg r_msg;&lt;/P&gt;&lt;P&gt;MSCAN_T_Msg t_msg;&lt;/P&gt;&lt;P&gt;unsigned char i;&lt;/P&gt;&lt;P&gt;byte *t;&lt;/P&gt;&lt;P&gt;void main(void) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; PORTA = 0XFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DDRA = 0XFF;/* put your own code here */&lt;/P&gt;&lt;P&gt;&amp;nbsp; //PLL_SetBusClk_16M();&lt;/P&gt;&lt;P&gt;&amp;nbsp; //setBusClk16M_4OSC();&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Timer_OC_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN_Init(1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN1RIER_RXFIE = 1;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; EnableInterrupts;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for(;;) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void)CAN_Send(t_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTA_PA0 = ~PORTA_PA0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _FEED_COP(); /* feeds the dog */&lt;/P&gt;&lt;P&gt;&amp;nbsp; } /* loop forever */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* please make sure that you never leave main */&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;#pragma CODE_SEG NON_BANKED&lt;/P&gt;&lt;P&gt;interrupt VectorNumber_Vcan0rx void CAN_Receice_ISR(void) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; DisableInterrupts;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0RFLG_RXF = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; (void)CAN_Receive(&amp;amp;r_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp; t_msg.Tx_ID = r_msg.Rx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp; t_msg.Tx_Length = r_msg.Rx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; if(r_msg.Rx_Data[7] == 0x01) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTA =~PORTA;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for( i=0;i&amp;lt;8;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; t = t_msg.Tx_Data+i;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *t= r_msg.Rx_Data[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; (void)CAN_Send(t_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &lt;/P&gt;&lt;P&gt;&amp;nbsp; EnableInterrupts;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#pragma CODE_SEG DEFAULT&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;*/&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 07 Apr 2016 04:03:00 GMT</pubDate>
    <dc:creator>chris_qin</dc:creator>
    <dc:date>2016-04-07T04:03:00Z</dc:date>
    <item>
      <title>9s12xet256 CAN</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/9s12xet256-CAN/m-p/487227#M12082</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I met a problem when I was trying to send messages using MSCAN module in 9S12XET256. I read it in the datesheet that&amp;nbsp; CAN0TFLG would be set by hardware ,but when I put the data in the buffer, I cleared the flag,but the flag did not be set ,so the process was stopped in finding an empty buffer after i sent data 3 times.I donnot know why?&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;code:&lt;/P&gt;&lt;P&gt;########################################################&lt;/P&gt;&lt;P&gt;CAN.h&lt;/P&gt;&lt;P&gt;#########################################################&lt;/P&gt;&lt;P&gt;#ifndef _CAN_H_&lt;/P&gt;&lt;P&gt;#define _CAN_H_&lt;/P&gt;&lt;P&gt;&amp;nbsp; #include "MC9S12XET256.h"&lt;/P&gt;&lt;P&gt;&amp;nbsp; #define BOOL&amp;nbsp; byte&lt;/P&gt;&lt;P&gt;&amp;nbsp; //宏定义busclk == 16M&lt;/P&gt;&lt;P&gt;&amp;nbsp; #define busclk&amp;nbsp; 16&lt;/P&gt;&lt;P&gt;&amp;nbsp; //宏定义busclk == 8M&lt;/P&gt;&lt;P&gt;&amp;nbsp; //#define busclk 8&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //定义结构体&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; typedef struct{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword Tx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Prio;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Tx_Data[8];&lt;/P&gt;&lt;P&gt;&amp;nbsp; } MSCAN_T_Msg;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; typedef struct{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword Rx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Rx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte Rx_Data[8];&lt;/P&gt;&lt;P&gt;&amp;nbsp; } MSCAN_R_Msg;&lt;/P&gt;&lt;P&gt;//函数声明&amp;nbsp; &lt;/P&gt;&lt;P&gt;//extern void createMsg(MSCAN_T_Msg *Msg,dword id,byte d[8],byte length,byte prio) ;&lt;/P&gt;&lt;P&gt;extern void setBaudRate(word baud_rate);&lt;/P&gt;&lt;P&gt;extern BOOL CAN_Send(MSCAN_T_Msg Msg);&lt;/P&gt;&lt;P&gt;//extern BOOL CAN1_Send(MSCAN_T_Msg Msg);&lt;/P&gt;&lt;P&gt;extern BOOL CAN_Receive(MSCAN_R_Msg *msg);&lt;/P&gt;&lt;P&gt;extern void CAN_Init(byte loop); &lt;/P&gt;&lt;P&gt;//extern void CAN1_Init(byte loop);&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;###########################################################################&lt;/P&gt;&lt;P&gt;CAN.c&lt;/P&gt;&lt;P&gt;###########################################################################&lt;/P&gt;&lt;P&gt;//********************************************************&lt;/P&gt;&lt;P&gt;// 需先在CAN.h中设置总线时钟，默认设置16M&amp;nbsp; &lt;/P&gt;&lt;P&gt;//********************************************************&lt;/P&gt;&lt;P&gt;#include "CAN.h"&lt;/P&gt;&lt;P&gt;//MSCAN_R_Msg RxMsg;&lt;/P&gt;&lt;P&gt;//MSCAN_T_Msg TxMsg;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 初始化函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;void CAN_Init(byte loop)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; MODRR_MODRR0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; MODRR_MODRR1 = 1;&amp;nbsp; //选择PM0 PM1作为CAN0的引脚&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (loop) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果 loop = 1;使能环回自测&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAN0CTL1 = CAN0CTL1_LOOPB_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL0 = CAN0CTL0_INITRQ_MASK;//进入初始化模式&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(!CAN0CTL1_INITAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待初始化响应&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL1 = CAN0CTL1_CANE_MASK;//使能模块,选择晶振（4M）时钟作为时钟源&lt;/P&gt;&lt;P&gt;&amp;nbsp; //setBaudRate(250);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0BTR0 = 0X00;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0BTR1 = 0X1C;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //250k&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR0 = _canbtr0; &lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR0 = CANBTR0_BRP0_MASK+CANBTR0_SJW_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //波特率2分频,同步跳转宽度4&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1 = _canbtr1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1_TSEG = 3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //CANBTR1_TSEG = 10;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //相位缓冲段SEG1、SEG2长度设置 4,11个Tq&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAC_IDAM = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Four 16-bit acceptance filters&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR0 = 0x00;CAN0IDMR0 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR1 = 0x00;CAN0IDMR1 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR2 = 0x00;CAN0IDMR2 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR3 = 0x00;CAN0IDMR3 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR4 = 0x00;CAN0IDMR4 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR5 = 0x00;CAN0IDMR5 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR6 = 0x00;CAN0IDMR6 = 0xFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0IDAR7 = 0x00;CAN0IDMR7 = 0xFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //接受所有的地址的消息&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0CTL0_INITRQ = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //关闭CAN初始化&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(CAN0CTL1_INITAK)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待关闭初始化响应&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!CANCTL0_SYNCH)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //等待CAN同步(连到总线是需要判断同步)&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; CAN0RFLG_RXF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //清空消息接受缓冲器&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; CAN0RIER_RXFIE = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //使能接收消息中断&amp;nbsp; &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 接收数据函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;BOOL CAN_Receive(MSCAN_R_Msg *msg) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //接收8个数据&lt;/P&gt;&lt;P&gt;&amp;nbsp; byte i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (CAN0RFLG_RXF){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果接收缓冲器满，返回0&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; /* if (CANRXIDR1_IDE==0) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果是标准格式帧结构&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_ID = (word)((CANRXIDR1&amp;lt;&amp;lt;8)+CANRXIDR0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if(CANRXIDR1_IDE==1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果是扩展格式帧结构&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_ID = (CANRXIDR3&amp;lt;&amp;lt;24)+(CANRXIDR2&amp;lt;&amp;lt;16)+(CANRXIDR1&amp;lt;&amp;lt;8)+CANRXIDR0;//MSCAN Receive Identifier Register 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; }*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; msg-&amp;gt;Rx_ID = (CAN0RXIDR3&amp;lt;&amp;lt;24)+(CAN0RXIDR2&amp;lt;&amp;lt;16)+(CAN0RXIDR1&amp;lt;&amp;lt;8)+CAN0RXIDR0;//MSCAN Receive Identifier Register 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; msg-&amp;gt;Rx_Length= CAN0RXDLR;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;msg-&amp;gt;Rx_Length;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg-&amp;gt;Rx_Data[i] = *(&amp;amp;(CAN0RXDSR0)+i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0RFLG = CAN0RFLG_RXF_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return (1);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;//MSCAN 发送数据函数&lt;/P&gt;&lt;P&gt;//**********************************************************&lt;/P&gt;&lt;P&gt;BOOL CAN_Send(MSCAN_T_Msg Msg) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; byte i,Txbuf_empty_flag=0;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if(Msg.Tx_Length&amp;gt;8)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果Msg的长度大于8，返回0&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; //if(CANCTL0_SYNCH!= 0 )&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果没有同步，返回0 &lt;/P&gt;&lt;P&gt;&amp;nbsp; //&amp;nbsp; return (0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; while (!(CAN0TFLG &amp;amp; (0x01&amp;lt;&amp;lt;Txbuf_empty_flag))) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Txbuf_empty_flag++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Txbuf_empty_flag &amp;gt;= 3)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Txbuf_empty_flag = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //从三个传输缓冲器中找一个空的&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TBSEL = (0x01&amp;lt;&amp;lt;Txbuf_empty_flag);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //选择可用的buffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR0 = (byte)(Msg.Tx_ID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR1 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;8);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR2 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;16);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXIDR3 = (byte)(Msg.Tx_ID&amp;gt;&amp;gt;24);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXDLR = Msg.Tx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TXTBPR = Msg.Tx_Prio;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;Msg.Tx_Length;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(&amp;amp;CAN0TXDSR0 + i) = Msg.Tx_Data[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0TFLG =(0x01&amp;lt;&amp;lt;Txbuf_empty_flag);&amp;nbsp; //清除标志位&lt;/P&gt;&lt;P&gt;&amp;nbsp; while((CAN0TFLG&amp;amp;(0x01&amp;lt;&amp;lt;Txbuf_empty_flag))== 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; return (1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#########################################################################&lt;/P&gt;&lt;P&gt;main.c&lt;/P&gt;&lt;P&gt;##########################################################################&lt;/P&gt;&lt;P&gt;#include &amp;lt;hidef.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* common defines and macros */&lt;/P&gt;&lt;P&gt;#include "derivative.h"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* derivative-specific definitions */&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include "CAN.h"&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void delay() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; int i,j;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for(i=0;i&amp;lt;500;i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(j=0;j&amp;lt;500;j++);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;MSCAN_R_Msg r_msg;&lt;/P&gt;&lt;P&gt;MSCAN_T_Msg t_msg;&lt;/P&gt;&lt;P&gt;unsigned char i;&lt;/P&gt;&lt;P&gt;byte *t;&lt;/P&gt;&lt;P&gt;void main(void) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; PORTA = 0XFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DDRA = 0XFF;/* put your own code here */&lt;/P&gt;&lt;P&gt;&amp;nbsp; //PLL_SetBusClk_16M();&lt;/P&gt;&lt;P&gt;&amp;nbsp; //setBusClk16M_4OSC();&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Timer_OC_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN_Init(1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN1RIER_RXFIE = 1;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; EnableInterrupts;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for(;;) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void)CAN_Send(t_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTA_PA0 = ~PORTA_PA0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _FEED_COP(); /* feeds the dog */&lt;/P&gt;&lt;P&gt;&amp;nbsp; } /* loop forever */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* please make sure that you never leave main */&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;#pragma CODE_SEG NON_BANKED&lt;/P&gt;&lt;P&gt;interrupt VectorNumber_Vcan0rx void CAN_Receice_ISR(void) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; DisableInterrupts;&lt;/P&gt;&lt;P&gt;&amp;nbsp; CAN0RFLG_RXF = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; (void)CAN_Receive(&amp;amp;r_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp; t_msg.Tx_ID = r_msg.Rx_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp; t_msg.Tx_Length = r_msg.Rx_Length;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; if(r_msg.Rx_Data[7] == 0x01) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTA =~PORTA;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; for( i=0;i&amp;lt;8;i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; t = t_msg.Tx_Data+i;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *t= r_msg.Rx_Data[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; (void)CAN_Send(t_msg);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &lt;/P&gt;&lt;P&gt;&amp;nbsp; EnableInterrupts;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#pragma CODE_SEG DEFAULT&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;*/&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 07 Apr 2016 04:03:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/9s12xet256-CAN/m-p/487227#M12082</guid>
      <dc:creator>chris_qin</dc:creator>
      <dc:date>2016-04-07T04:03:00Z</dc:date>
    </item>
    <item>
      <title>Re: 9s12xet256 CAN</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/9s12xet256-CAN/m-p/487228#M12083</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Zhanqiang,&lt;/P&gt;&lt;P&gt;In general, TX flag is set again, when CAN module detect acknowledge.&lt;/P&gt;&lt;P&gt;So, if there isn’t node on bus who acknowledge data from MSCAN module, TX buffer will be not freed.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note: Be careful, MODRR registers could be written just once in normal mode. So, all you configuration for one MODRR register must be written by single command.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; I cannot recommend to using CAN send function inside CAN RX interrupt due to potential problem with selecting TX buffer. This way, we could call CAN_Send() inside CAN_Send() function. So at least one of CAN_Send() will failure in that case.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I hope it helps you.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards&lt;/P&gt;&lt;P&gt;Radek&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 07 Apr 2016 14:52:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/9s12xet256-CAN/m-p/487228#M12083</guid>
      <dc:creator>RadekS</dc:creator>
      <dc:date>2016-04-07T14:52:48Z</dc:date>
    </item>
  </channel>
</rss>

