和ST、NXP的邮箱类似,AutoChips用了缓冲区的概念。
屏蔽掉demo程序的发送,只看接收情况
在回调中接收数据
先判断是不是进了接收中断
接收数据的处理函数
所有buff数据放到Info
buff的内容
BUFF的地址
标准帧buff寄存器定义
扩展帧buff寄存器定义
这里的80个字节和上面的到75似乎对不上
再看下寄存器定义,发现应该是还有保留字节。
至此,CAN接受已经大致清楚了,知道他是怎么分布的。
调用接口
组帧
发送帧数据结构定义
排除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 */
}
}
}
置位之后,硬件开始发送。至此,发送缓冲大致走了一遍。