<?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>S32GのトピックMPC 5748 CANFD</title>
    <link>https://community.nxp.com/t5/S32G/MPC-5748-CANFD/m-p/1896182#M7379</link>
    <description>&lt;P&gt;您好，我最近在测试MPC5748G的CANFD功能，能实现它的发送以及接收中断功能，但是目前遇到的问题是，我无法使用block块1/2来进行发送数据，只能使用block0才能发送数据，如下是我的代码：&lt;/P&gt;&lt;DIV&gt;void FlexCAN0_Init(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint32_t i = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* enable the FlexCAN module, reset and freeze */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.R = (0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_FRZ&amp;nbsp; /* enabled to enter Freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_HALT /* enter freeze mode if FRZ bit is set */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //| CAN_MCR_SOFTRST /* soft reset */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //| CAN_MCR_SRXDIS&amp;nbsp; /* self reception enabled */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_BCC&amp;nbsp; /* individual Rx masking and queue */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 0x0000001F);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* double check that we are actually in freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(0 == CAN_0.MCR.B.FRZACK) {};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(0 == CAN_0.MCR.B.NOTRDY) {};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.R = (0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_FRZ&amp;nbsp; /* enabled to enter Freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_HALT /* enter freeze mode if FRZ bit is set */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*| CAN_MCR_SRXDIS */ /* self reception enabled */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_BCC&amp;nbsp; /* individual Rx masking and queue */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_AEN&amp;nbsp; /* Safe Tx abort enable */&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| CAN_MCR_FDEN /* CAN FD enabled */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 0x0000001F); /* enable 32 MBs */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.CBT.R = 0x802D29AD; // Nominal bit time: 40 MHz clksrc, 500K bps with 40 tq&lt;/DIV&gt;&lt;DIV&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; // EPRESDIV = 1, EPROPSEG = 10, EPSEG1 = 13, EPREG2 = 13&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.CBT.R = 0x80272A67;&amp;nbsp; // bitrate=500kbps, CPI clk=40 MHz; Prescaler= 2, PROPSEG=11, PSEG1=20, PSEG2=8, RJW=8, smp=80%&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.FDCBT.R = 0x00111421;&amp;nbsp; // bitrateFD=2000kbps, CPI clk=40 MHz; fPrescaler= 2, fPROPSEG=5, fPSEG1=2, fPSEG2=2, fRJW=2, smp=80%&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.FDCBT.R = 0x00130862; // Data bit time: 40 MHz clksrc, 2Mbps with 10 tq&lt;/DIV&gt;&lt;DIV&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; // FPRESDIV = 1, FPROPSEG = 2, FPSEG1 = 3, FPREG2 = 4&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.FDCBT.R = 0x00330425;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.FDCTRL.R = 0x8030000;&amp;nbsp; // bit rate switching enable, 64byte payload for region 0&lt;/DIV&gt;&lt;DIV&gt;//&amp;nbsp; &amp;nbsp; CAN_0.FDCTRL.B.MBDSR1 = 3;&amp;nbsp; &amp;nbsp; // TCD disabled&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* clear MB are for first 32MBs */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;(32*4);i++)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.RAMn[i].R = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* set mask registers - all ID bits must match */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;32;i++)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CAN_0.RXIMR[i].R = 0x1FFFFFFF;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.CTRL2.R |= 0x1000; // set ISOCANFDEN bit 大端&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /*enable interrupt for MB3*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.IMASK1.R = 0x00000004; //小端&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Finally clear the HALT flag in MCR to enable the FlexCAN&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* to synchronize with the CAN bus and allow&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* participation in communication. */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.B.HALT = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* wait until FlexCAN ready */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(1 == CAN_0.MCR.B.FRZACK){};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(1 == CAN_0.MCR.B.NOTRDY){};&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*******************************************************************************&lt;/DIV&gt;&lt;DIV&gt;Function Name : GetMBAddr&lt;/DIV&gt;&lt;DIV&gt;Engineer&amp;nbsp; &amp;nbsp; &amp;nbsp; : Petr Stancik&lt;/DIV&gt;&lt;DIV&gt;Date&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Jun-22-2021&lt;/DIV&gt;&lt;DIV&gt;Parameters&amp;nbsp; &amp;nbsp; : mb ... mb number used&lt;/DIV&gt;&lt;DIV&gt;Modifies&amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;Returns&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: address of MB&lt;/DIV&gt;&lt;DIV&gt;Notes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: get address of selected MB depending on payload set for memory block&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; memory block 0 is only checked&lt;/DIV&gt;&lt;DIV&gt;Issues&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;*******************************************************************************/&lt;/DIV&gt;&lt;DIV&gt;uint32_t GetMBAddr(uint32_t mb)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//根据payload有效载荷大小来计算出每个MB的地址长度，因为这个版本的库没有封装MB寄存器&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//检查的MBDSR0位的有效载荷大小，这个位描述的是block 0 的有效载荷，如果要知道其他 block 的 MB就需要修改与的位，以及下方RAMn的积地址（修改RAMn是个人理解，还未实践过）&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t payload_size = 1UL &amp;lt;&amp;lt; (((CAN_0.FDCTRL.R &amp;amp; 0x30000U) &amp;gt;&amp;gt; 16U) + 3U); // R &amp;amp; 0x30000U get payload size for memory block 0&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//根据上面的小算法按照有效载荷大小来计算MB地址长度，根据地址长度在基地址上进行偏移得到想要的MB寄存器的地址&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//CAN_0.RAMn是每个元素占用4字节，384/96 = 4 ，定义的这个数组空间实际表示的是MB一共占用的内存大小&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return ((uint32_t)&amp;amp;CAN_0.RAMn[0].R + (8+payload_size)*mb);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* 如果要知道其他 block 下的 MB 地址，则需要根据 */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*******************************************************************************&lt;/DIV&gt;&lt;DIV&gt;Function Name : TransmitMsgFD&lt;/DIV&gt;&lt;DIV&gt;Engineer&amp;nbsp; &amp;nbsp; &amp;nbsp; : Petr Stancik&lt;/DIV&gt;&lt;DIV&gt;Date&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Jun-22-2021&lt;/DIV&gt;&lt;DIV&gt;Parameters&amp;nbsp; &amp;nbsp; : mb ... mb number used&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ext ... 0-standard ID, 1-extended ID&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ID ... ID to be sent&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; length ... number of bytes to be sent&lt;/DIV&gt;&lt;DIV&gt;Modifies&amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;Returns&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: NONE&lt;/DIV&gt;&lt;DIV&gt;Notes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Transmit message once using selected MB&lt;/DIV&gt;&lt;DIV&gt;Issues&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;*******************************************************************************/&lt;/DIV&gt;&lt;DIV&gt;void TransmitMsgFD(uint32_t mb, uint8_t ext, uint32_t ID, uint8_t length)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;/* Assumption:&amp;nbsp; Message buffer CODE is INACTIVE */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint8_t i,dlc,z=0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint32_t *pTxMB = GetMBAddr(mb);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint32_t txID = (ext==0) ? ID&amp;lt;&amp;lt;18 : ID;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; /*calculate dlc value from no. bytes*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; if(length &amp;lt; 0x09)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = length;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x0D){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0x9;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x11){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x15){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xB;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x19){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x21){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xD;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x31){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xF;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; *(pTxMB + 1) = txID; // write ID&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; for (i=0; i&amp;lt;length/4; i++,z+=4) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; *(pTxMB + 2 + i) =&amp;nbsp; z&amp;lt;&amp;lt;24 | (z+1)&amp;lt;&amp;lt;16 | (z+2)&amp;lt;&amp;lt; 8 | z+3;&amp;nbsp; &amp;nbsp; &amp;nbsp; /* Data to be transmitted */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; *pTxMB = (0 // Tx Buffer 0 T0 word&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;31 // extended Data Length&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;30 // bit rate switch&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 0xC&amp;lt;&amp;lt;24 // code = 0xC, TX once&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;22 // SRR = 1&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ext&amp;lt;&amp;lt;21 // IDE&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 0&amp;lt;&amp;lt;20 // RTR = 0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| dlc&amp;lt;&amp;lt;16);&amp;nbsp; // DLC&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; while (!(CAN_0.IFLAG1.R &amp;amp; 1&amp;lt;&amp;lt;mb)) {};&amp;nbsp; /* Wait for CAN 0 MB 0 flag */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; CAN_0.IFLAG1.R = 1&amp;lt;&amp;lt;mb; // clear MB flag&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;我个人理解的是，我将block0配置payload为64字节，因此只能使用0~6的MB，为了能使用block1，我将设置CAN_0.FDCTRL.R = 0x80180000; 是block1也为64字节有效载荷，除了更改这一部分还更改的部分有&lt;SPAN&gt;GetMBAddr中payload_size = 1UL &amp;lt;&amp;lt; (((CAN_0.FDCTRL.R &amp;amp; 0x180000U) &amp;gt;&amp;gt; 16U) + 3U);使其能获得MB7~13的地址，但是我这么修改我无法发送出数据，程序会一直卡在while (!(CAN_0.IFLAG1.R &amp;amp; 1&amp;lt;&amp;lt;mb)) {};不知道是什么原因，我认为问题是出在&lt;SPAN&gt;GetMBAddr函数获取MB地址这一部分，对于这一部分我理解的不是很透彻，不知道要如何进行修改才能获取block1下MB的地址，使block1也能发送canfd数据&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Sat, 29 Jun 2024 05:58:05 GMT</pubDate>
    <dc:creator>徐工2024</dc:creator>
    <dc:date>2024-06-29T05:58:05Z</dc:date>
    <item>
      <title>MPC 5748 CANFD</title>
      <link>https://community.nxp.com/t5/S32G/MPC-5748-CANFD/m-p/1896182#M7379</link>
      <description>&lt;P&gt;您好，我最近在测试MPC5748G的CANFD功能，能实现它的发送以及接收中断功能，但是目前遇到的问题是，我无法使用block块1/2来进行发送数据，只能使用block0才能发送数据，如下是我的代码：&lt;/P&gt;&lt;DIV&gt;void FlexCAN0_Init(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint32_t i = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* enable the FlexCAN module, reset and freeze */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.R = (0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_FRZ&amp;nbsp; /* enabled to enter Freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_HALT /* enter freeze mode if FRZ bit is set */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //| CAN_MCR_SOFTRST /* soft reset */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //| CAN_MCR_SRXDIS&amp;nbsp; /* self reception enabled */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_BCC&amp;nbsp; /* individual Rx masking and queue */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 0x0000001F);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* double check that we are actually in freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(0 == CAN_0.MCR.B.FRZACK) {};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(0 == CAN_0.MCR.B.NOTRDY) {};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.R = (0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_FRZ&amp;nbsp; /* enabled to enter Freeze mode */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_HALT /* enter freeze mode if FRZ bit is set */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*| CAN_MCR_SRXDIS */ /* self reception enabled */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_BCC&amp;nbsp; /* individual Rx masking and queue */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | CAN_MCR_AEN&amp;nbsp; /* Safe Tx abort enable */&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| CAN_MCR_FDEN /* CAN FD enabled */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | 0x0000001F); /* enable 32 MBs */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.CBT.R = 0x802D29AD; // Nominal bit time: 40 MHz clksrc, 500K bps with 40 tq&lt;/DIV&gt;&lt;DIV&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; // EPRESDIV = 1, EPROPSEG = 10, EPSEG1 = 13, EPREG2 = 13&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.CBT.R = 0x80272A67;&amp;nbsp; // bitrate=500kbps, CPI clk=40 MHz; Prescaler= 2, PROPSEG=11, PSEG1=20, PSEG2=8, RJW=8, smp=80%&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.FDCBT.R = 0x00111421;&amp;nbsp; // bitrateFD=2000kbps, CPI clk=40 MHz; fPrescaler= 2, fPROPSEG=5, fPSEG1=2, fPSEG2=2, fRJW=2, smp=80%&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.FDCBT.R = 0x00130862; // Data bit time: 40 MHz clksrc, 2Mbps with 10 tq&lt;/DIV&gt;&lt;DIV&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; // FPRESDIV = 1, FPROPSEG = 2, FPSEG1 = 3, FPREG2 = 4&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //CAN_0.FDCBT.R = 0x00330425;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.FDCTRL.R = 0x8030000;&amp;nbsp; // bit rate switching enable, 64byte payload for region 0&lt;/DIV&gt;&lt;DIV&gt;//&amp;nbsp; &amp;nbsp; CAN_0.FDCTRL.B.MBDSR1 = 3;&amp;nbsp; &amp;nbsp; // TCD disabled&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* clear MB are for first 32MBs */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;(32*4);i++)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.RAMn[i].R = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* set mask registers - all ID bits must match */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;32;i++)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CAN_0.RXIMR[i].R = 0x1FFFFFFF;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.CTRL2.R |= 0x1000; // set ISOCANFDEN bit 大端&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /*enable interrupt for MB3*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.IMASK1.R = 0x00000004; //小端&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Finally clear the HALT flag in MCR to enable the FlexCAN&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* to synchronize with the CAN bus and allow&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* participation in communication. */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; CAN_0.MCR.B.HALT = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* wait until FlexCAN ready */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(1 == CAN_0.MCR.B.FRZACK){};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; while(1 == CAN_0.MCR.B.NOTRDY){};&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*******************************************************************************&lt;/DIV&gt;&lt;DIV&gt;Function Name : GetMBAddr&lt;/DIV&gt;&lt;DIV&gt;Engineer&amp;nbsp; &amp;nbsp; &amp;nbsp; : Petr Stancik&lt;/DIV&gt;&lt;DIV&gt;Date&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Jun-22-2021&lt;/DIV&gt;&lt;DIV&gt;Parameters&amp;nbsp; &amp;nbsp; : mb ... mb number used&lt;/DIV&gt;&lt;DIV&gt;Modifies&amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;Returns&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: address of MB&lt;/DIV&gt;&lt;DIV&gt;Notes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: get address of selected MB depending on payload set for memory block&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; memory block 0 is only checked&lt;/DIV&gt;&lt;DIV&gt;Issues&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;*******************************************************************************/&lt;/DIV&gt;&lt;DIV&gt;uint32_t GetMBAddr(uint32_t mb)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//根据payload有效载荷大小来计算出每个MB的地址长度，因为这个版本的库没有封装MB寄存器&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//检查的MBDSR0位的有效载荷大小，这个位描述的是block 0 的有效载荷，如果要知道其他 block 的 MB就需要修改与的位，以及下方RAMn的积地址（修改RAMn是个人理解，还未实践过）&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t payload_size = 1UL &amp;lt;&amp;lt; (((CAN_0.FDCTRL.R &amp;amp; 0x30000U) &amp;gt;&amp;gt; 16U) + 3U); // R &amp;amp; 0x30000U get payload size for memory block 0&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//根据上面的小算法按照有效载荷大小来计算MB地址长度，根据地址长度在基地址上进行偏移得到想要的MB寄存器的地址&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//CAN_0.RAMn是每个元素占用4字节，384/96 = 4 ，定义的这个数组空间实际表示的是MB一共占用的内存大小&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return ((uint32_t)&amp;amp;CAN_0.RAMn[0].R + (8+payload_size)*mb);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* 如果要知道其他 block 下的 MB 地址，则需要根据 */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;/*******************************************************************************&lt;/DIV&gt;&lt;DIV&gt;Function Name : TransmitMsgFD&lt;/DIV&gt;&lt;DIV&gt;Engineer&amp;nbsp; &amp;nbsp; &amp;nbsp; : Petr Stancik&lt;/DIV&gt;&lt;DIV&gt;Date&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : Jun-22-2021&lt;/DIV&gt;&lt;DIV&gt;Parameters&amp;nbsp; &amp;nbsp; : mb ... mb number used&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ext ... 0-standard ID, 1-extended ID&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ID ... ID to be sent&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; length ... number of bytes to be sent&lt;/DIV&gt;&lt;DIV&gt;Modifies&amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;Returns&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: NONE&lt;/DIV&gt;&lt;DIV&gt;Notes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Transmit message once using selected MB&lt;/DIV&gt;&lt;DIV&gt;Issues&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : NONE&lt;/DIV&gt;&lt;DIV&gt;*******************************************************************************/&lt;/DIV&gt;&lt;DIV&gt;void TransmitMsgFD(uint32_t mb, uint8_t ext, uint32_t ID, uint8_t length)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;/* Assumption:&amp;nbsp; Message buffer CODE is INACTIVE */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint8_t i,dlc,z=0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint32_t *pTxMB = GetMBAddr(mb);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; uint32_t txID = (ext==0) ? ID&amp;lt;&amp;lt;18 : ID;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; /*calculate dlc value from no. bytes*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; if(length &amp;lt; 0x09)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = length;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x0D){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0x9;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x11){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x15){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xB;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x19){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x21){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xD;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else if(length &amp;lt; 0x31){&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }else{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dlc = 0xF;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; *(pTxMB + 1) = txID; // write ID&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; for (i=0; i&amp;lt;length/4; i++,z+=4) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; *(pTxMB + 2 + i) =&amp;nbsp; z&amp;lt;&amp;lt;24 | (z+1)&amp;lt;&amp;lt;16 | (z+2)&amp;lt;&amp;lt; 8 | z+3;&amp;nbsp; &amp;nbsp; &amp;nbsp; /* Data to be transmitted */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; *pTxMB = (0 // Tx Buffer 0 T0 word&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;31 // extended Data Length&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;30 // bit rate switch&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 0xC&amp;lt;&amp;lt;24 // code = 0xC, TX once&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 1&amp;lt;&amp;lt;22 // SRR = 1&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ext&amp;lt;&amp;lt;21 // IDE&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 0&amp;lt;&amp;lt;20 // RTR = 0&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| dlc&amp;lt;&amp;lt;16);&amp;nbsp; // DLC&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; while (!(CAN_0.IFLAG1.R &amp;amp; 1&amp;lt;&amp;lt;mb)) {};&amp;nbsp; /* Wait for CAN 0 MB 0 flag */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; CAN_0.IFLAG1.R = 1&amp;lt;&amp;lt;mb; // clear MB flag&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;我个人理解的是，我将block0配置payload为64字节，因此只能使用0~6的MB，为了能使用block1，我将设置CAN_0.FDCTRL.R = 0x80180000; 是block1也为64字节有效载荷，除了更改这一部分还更改的部分有&lt;SPAN&gt;GetMBAddr中payload_size = 1UL &amp;lt;&amp;lt; (((CAN_0.FDCTRL.R &amp;amp; 0x180000U) &amp;gt;&amp;gt; 16U) + 3U);使其能获得MB7~13的地址，但是我这么修改我无法发送出数据，程序会一直卡在while (!(CAN_0.IFLAG1.R &amp;amp; 1&amp;lt;&amp;lt;mb)) {};不知道是什么原因，我认为问题是出在&lt;SPAN&gt;GetMBAddr函数获取MB地址这一部分，对于这一部分我理解的不是很透彻，不知道要如何进行修改才能获取block1下MB的地址，使block1也能发送canfd数据&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 29 Jun 2024 05:58:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32G/MPC-5748-CANFD/m-p/1896182#M7379</guid>
      <dc:creator>徐工2024</dc:creator>
      <dc:date>2024-06-29T05:58:05Z</dc:date>
    </item>
  </channel>
</rss>

