本文主要是介绍杰发科技AC7840——CAN通信简介(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 */}}
}
置位之后,硬件开始发送。至此,发送缓冲大致走了一遍。
这篇关于杰发科技AC7840——CAN通信简介(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!