ADI(59X DSP) CANFD 模块手册翻译(CANFD 处理过程)(2)

CANFD 处理过程

以下部分描述了如何使用邮箱系统发送和接收CAN和CAN FD帧。

发送过程

为了发送一个CAN帧,处理器必须执行以下步骤来准备一个消息缓冲区(Message Buffer, MB)进行传输:

  1. 检查相应的中断位是否已设置并将其清除。
  2. 如果MB处于活动状态(待传输),则向控制/状态(C/S)字的CODE字段写入ABORT代码(1001),以请求中止传输。通过轮询CANFD_IFLG1CANFD_IFLG2寄存器或如果已在CANFD_IMSK1CANFD_IMSK2寄存器的相应IMASK位中启用,则通过中断请求来等待相应的IFLAG位被置位。然后,读取CODE字段以检查传输是否已被中止或已发送(请参阅“传输中止机制”部分)。
  3. 写入ID字。
  4. 写入数据字节。
  5. 写入C/S字的DLC、Control和CODE字段以激活MB。当CANFD_CFG.FDEN被设置时,还需要写入EDL、BRS和ESI位。
    当MB被激活后,它将参与仲裁过程并根据其优先级最终进行传输。当为传输选择的MB中存储的DLC值大于相应的MB有效载荷大小时,CANFD将添加必要数量的字节(其值为固定的0xCC模式)以达到DLC的字节数。
    在成功传输结束时,CANFD_TMR寄存器的值将被写入时间戳字段,C/S字的CODE字段将被更新,CANFD_CRCCANFD_FD_CRC寄存器也将被更新,CANFD_IFLG1CANFD_IFLG2寄存器中将设置一个状态标志,并且如果相应的CANFD_IFLAGn位允许,则会产生一个中断。传输后新的CODE字段取决于用于激活MB的代码。请参阅“消息缓冲区代码 - Rx缓冲区”表。
    当中止功能被启用(CANFD_CFG.ABORTEN被置位)时,在为配置为发送缓冲区的消息缓冲区设置了中断标志后,该消息缓冲区将被阻塞。因此,处理器在中断标志被处理器禁用之前无法更新它。这意味着处理器在开始为此MB准备新的传输或接收之前,必须清除相应的CANFD_IFLAGn位。

仲裁过程

仲裁过程会扫描各个MB,以查找在下一个发送机会中持有待发送消息的发送(Tx)MB。这个MB被称为仲裁获胜者。扫描从编号最低的MB开始,依次向编号较高的MB进行。仲裁过程在以下情况下被触发:

  • 从CAN帧的CRC字段开始,起点取决于CANFD_CTL2.TXASDLY字段的值。
  • 在CAN帧的错误定界符字段期间。
  • 在CAN帧的过载定界符字段期间。
  • 当获胜MB被停用,且CAN总线尚未到达间歇字段的第一位时。
  • 当处理器向获胜MB的控制/状态(C/S)字写入,且CAN总线尚未到达间歇字段的第一位时。
  • 当CAN接口(CHI)处于空闲状态,且处理器向任何MB的控制/状态字写入时。
  • 当CANFD模块退出总线关闭状态时。
  • 当退出冻结模式或低功耗模式时。

如果仲裁过程在CAN总线到达间歇字段的第一位之前未能评估所有MB,则临时仲裁获胜者将被无效化,且CANFD模块在下一个发送机会中不会参与CAN总线的竞争。

仲裁过程在扫描结束时,根据CANFD_CTL1.LBUFCANFD_CFG.LPRIOEN位设置,从活动的Tx MB中选择获胜者。

最低编号邮箱优先

如果CANFD_CTL1.LBUF位被启用,则找到的第一个(编号最低)活动的Tx MB即为仲裁获胜者。此时,CANFD_CFG.LPRIOEN位不起作用。

最高优先级邮箱优先

如果CANFD_CTL1.LBUF位被禁用,则仲裁过程会搜索具有最高优先级的活动Tx MB。当多个外部节点同时竞争CAN总线时,这个具有最高优先级的MB有更高的概率赢得仲裁。

用于此仲裁的比特序列被称为MB的仲裁值。最高优先级的Tx MB是所有Tx MB中仲裁值最低的MB。如果两个或多个MB具有相同的仲裁值,则编号最低的MB是仲裁获胜者。

仲裁值的构成取决于CANFD_CFG.LPRIOEN位。

仲裁完成

在仲裁获胜者确定后,其内容会被复制到一个称为发送串行消息缓冲区(Tx SMB)的隐藏辅助邮箱(MB)中。该缓冲区具有与普通邮箱相同的结构,但用户无法访问。此操作称为移出操作,完成此操作后,将阻止对相应邮箱的命令/状态(C/S)字的写访问(如果CANFD_CFG.ABORTEN被置位)。在以下情况下会恢复写访问:
• 在邮箱消息发送后,且相应的中断标志(IFLAG)位被处理器清除。
• CANFD模块进入冻结模式或总线关闭状态。
• CANFD模块失去总线仲裁或在传输过程中发生错误。
在CAN总线上的第一个机会窗口,根据CAN协议规则,将发送Tx SMB中的消息。

仲裁开始与停止条件

仲裁过程在以下情况下被触发:

• 在接收(Rx)和发送(Tx)帧期间,从CAN CRC字段到帧末尾。可以通过更改CANFD_CTL2.TXASDLY值来优化仲裁起点。
• 在CAN总线关闭状态下,从TX_ERR_CNT=124到128。同样,可以通过更改CANFD_CTL2.TXASDLY值来优化仲裁起点。
• 在总线空闲模式下,处理器对命令/状态(C/S)进行写操作时。第一次C/S写操作启动仲裁过程,如果在同一次仲裁期间进行第二次C/S写操作,则会重新启动该过程。如果执行其他C/S写操作,则发送(Tx)仲裁过程处于挂起状态。如果仲裁过程结束后没有获胜者,则发送(Tx)仲裁机制将开始新的仲裁过程。如果有挂起的仲裁且总线进入空闲状态,则会触发仲裁过程。在这种情况下,在总线空闲状态下进行的第一次和第二次C/S写操作不会重新启动仲裁过程。可能在等待总线空闲状态期间没有足够的时间完成仲裁,而下一个状态是空闲。在这种情况下,扫描不会被中断,并且会在总线空闲状态下完成。在此仲裁期间,C/S写操作不会导致仲裁重新启动。
• 在有效仲裁窗口期间,仲裁获胜者被停用。
• 在退出冻结模式时(即等待总线空闲状态的第一位)。如果在等待总线空闲状态期间发生重新同步,则仲裁过程会重新启动。

仲裁过程在以下情况下停止:

• 所有邮箱均已被扫描。
• 当启用最低缓冲区功能时,找到一个正在发送的邮箱。
• 在任何仲裁过程中,仲裁获胜者被停用或中止。
• 没有足够的时间完成发送(Tx)仲裁过程(例如,在帧结束附近进行了停用操作)。在这种情况下,仲裁过程处于挂起状态。
• 总线上存在错误或过载标志。
• 在空闲状态下有低功耗或冻结模式请求。

仲裁挂起的情况如下所述:

• 无法及时完成仲裁过程。
• 如果在仲裁期间对编号低于发送(Tx)仲裁指针的邮箱进行C/S写操作。
• 如果没有正在进行的发送(Tx)仲裁过程,则进行任何C/S写操作。
• 接收(Rx)匹配刚刚将Rx代码更新为Tx代码。
• 进入总线关闭状态。

仲裁期间的C/S写操作具有以下效果:

• 如果在仲裁获胜者上进行C/S写操作,则会立即重新启动一个新过程。
• 如果在编号高于发送(Tx)仲裁指针的邮箱上进行C/S写操作,则正在进行的仲裁过程将像往常一样扫描该邮箱。

接收过程

为了将CAN帧接收进邮箱,处理器必须通过执行以下步骤来准备邮箱以接收:

  1. 如果邮箱处于活动状态(无论是发送还是接收),请使邮箱非活动化(参见邮箱非活动化),最好使用安全非活动化(参见传输中止机制)。
  2. 写入ID字。
  3. 将空(EMPTY)代码(0b0100)写入C/S字的CODE字段以激活邮箱。不需要为EDL、BRS和ESI位进行设置;它们将被接收到的消息中相应的位字段覆盖。

在邮箱被激活后,它将能够接收与编程过滤器匹配的帧。在成功接收结束时,邮箱通过move-in过程(参见

你可能感兴趣的:(dsp开发)