杰发科技AC7840——CAN通信简介(2)

2024-01-08 06:52:31

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 */
        }
    }
}

置位之后,硬件开始发送。至此,发送缓冲大致走了一遍。

文章来源:https://blog.csdn.net/qq_35697978/article/details/135382561
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。