1.时钟频率
2.位时间
3.采样点
4.消息缓冲区
和ST、NXP的邮箱类似,AutoChips用了缓冲区的概念。

5.接收缓冲区

屏蔽掉demo程序的发送,只看接收情况

在回调中接收数据

先判断是不是进了接收中断


接收数据的处理函数

所有buff数据放到Info

buff的内容

BUFF的地址

标准帧buff寄存器定义

扩展帧buff寄存器定义

这里的80个字节和上面的到75似乎对不上

再看下寄存器定义,发现应该是还有保留字节。

至此,CAN接受已经大致清楚了,知道他是怎么分布的。
6.发送缓冲区
调用接口

组帧

发送帧数据结构定义

排除ERROR和BUSY状态后开始填充数据到BUFF
 前面填充信息位
前面填充信息位
 后面填充数据位
后面填充数据位
void CAN_WriteTbufData(CAN_Type *base, const uint8_t *txData, uint8_t length)
{DEVICE_ASSERT(txData != NULL);uint8_t i;uint32_t *data = (uint32_t *)&base->TBUF.DATA[0];for (i = 0U; i < length; i += 4U){*data++ = *(uint32_t *)(&txData[i]);}
}static inline void CAN_SelectNextTsbuf(CAN_Type *base)
{base->CTRL0 |= CAN_CTRL0_TSNEXT_Msk;
}数据填充完毕开始发送

State列表
/* CAN state struct */
typedef struct
{uint32_t                  interruptFlag;            /* CAN interrupt flag */bool                      initState;                /* CAN initialization state */bool                      interruptEn;              /* CAN interrupt enable */bool                      timeStampEn;              /* Time stamp enable */bool                      dmaRecvEn;                /* DMA receive enable */bool                      memEccEn;                 /* CAN memory ECC enable */semaphore_t               txCompleted;              /* Transmit completed */semaphore_t               rxCompleted;              /* Receive completed */can_transmit_sec_amount_t tsAmount;                 /* Transmit secondary all frames or one frame */can_callback_t            callback;                 /* CAN callback function pointer */can_callback_t            wakeupCallback;           /* CAN wakeup callback function pointer */
} can_state_t;can_transmit_sec_amount_t列表
typedef enum
{CAN_TRANSMIT_SEC_ALL = 0U,                      /*!< Transmit secondary all messages */CAN_TRANSMIT_SEC_ONE                            /*!< Transmit secondary one message */
} can_transmit_sec_amount_t;置位
void CAN_StartTransmit(CAN_Type *base, can_transmit_buff_t type, can_transmit_sec_amount_t amount)
{if (CAN_TRANSMIT_PRIMARY == type){base->CTRL0 |= CAN_CTRL0_TPE_Msk;}else{if (CAN_TRANSMIT_SEC_ALL == amount){base->CTRL0 |= CAN_CTRL0_TSALL_Msk;    /* Send all messages */}else{base->CTRL0 |= CAN_CTRL0_TSONE_Msk;    /* Send one message only */}}
}
置位之后,硬件开始发送。至此,发送缓冲大致走了一遍。