您好!
我已经创建了 MIBSPI 实现来为外部 CAN 控制器提供服务。 这种实现通常可以正常运行、不会出现任何问题。 但是、为来自 CAN 控制器的传入消息提供服务的传输组会在5-10分钟后进入意外状态、从而冻结整个 MIBSPI。 当 我 提高用于 MIBSPI 的 DMA 通道的优先级(需要几个小时才能达到此状态)时、这个问题的频率似乎会降低。
传输组的配置:
//接收传输组
//将其保持为禁用状态,将其作为 CAN 控制器配置的最后一步启用
SPI_BASE->TGCTRL[CURRENT_GROUP]=(uint32_T)((uint32_T) 0U << 31U)//启用
|(uint32_T)((uint32_T) 0U << 30U)//单触发
|(uint32_T)((uint32_T) 0U << 29U)//当前复位
|(uint32_T)((uint32_T) TRG_LOW << 20U)//触发事件,由来自 CAN 控制器 VIA 的 RXEMPTY 标志触发的组。 GIOA
|(uint32_T)((uint32_T) TRG_GIOA0 << 16U)//触发源
|(uint32_T)((uint32_T) 0U<<8U);//开始缓冲
// Tx DMA 组
//将其禁用
SPI_BASE->TGCTRL[CURRENT_GROUP]=(uint32_T)((uint32_T) 0U << 31U)//启用
|(uint32_T)((uint32_T) 1U << 30U)//单触发器
|(uint32_T)((uint32_T) 0U << 29U)//当前复位
|(uint32_T)((uint32_T) TRG_LOW<< 20U)// 由来自 CAN 控制器 VIA 的 TXFULL 标志触发的触发事件组。 GIOA
|(uint32_T)((uint32_T) TRG_GIOA1 << 16U)//触发源
|(uint32_T)((uint32_T) 8u<<8U);//开始缓冲
MIBSPI 进入以下异常状态。 如果 buffer=0、RXEMPTY 为0、这使得 MIBSPI 卡在 RX 传输组中(来自 LTGPEND 寄存器)。 这种状态似乎在5分钟以上后随机出现。 RX DMA 被设定为将 RX 数据从缓冲器0-7传输至 RAM。
| 传输组 | 缓冲区 ID | TX 说明 | RX 说明 | 数据长度(位) | RXEMPTY | 缓冲模式 | 锁定 | |
| RX 传输组 | 0 | 命令数据 | —— | 8 | 0 | 6 | 1 | |
| 1 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 2 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 3 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 4 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 5 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 6 | —— | CAN MSG | 16 | 1 | 6 | 1 | ||
| 7 | —— | CAN MSG | 16 | 1 | 6 | 0 | RX DMA 在此处触发 | |
| TX 传输组 | 8 | 命令数据 | —— | 8 | 0 | 5 | 1 | |
| 9 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 10 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 11 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 12 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 13 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 14 | CAN MSG | —— | 16 | 0 | 5 | 1 | ||
| 15 | CAN MSG | —— | 16 | 0 | 5 | 0 | TX DMA 在此处触发 |