1.
2.
协议层
CAN的 帧/报文 种类
特点:
CAN总线是广播类型的总线
这意味着所有节点都可以侦听到所有传输的报文
无法将报文单独发送给指定节点
所有节点都将始终捕获所有报文
但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应
CAN使用短报文 – 最大实用负载是94位
可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定其地址
CAN总线上有5种不同的报文类型
数据帧,远程帧,错误帧,过载帧,帧间隔
3.代码加注释
int main(void)
{
usart1_init();
printf("尚硅谷 CAN 通讯实验: 静默回环 寄存器版\r\n");
CAN_Init();
printf("CAN 初始化配置完成...\r\n");
uint16_t stdId = 0x066;
uint8_t *tData = "abcdefg";
CAN_SendMsg(stdId, tData, strlen((char *)tData));
printf("发送完毕...\r\n");
tData = "123";
CAN_SendMsg(stdId, tData, strlen((char *)tData));
printf("发送完毕...\r\n");
stdId = 0x067;
tData = "xyz";
CAN_SendMsg(stdId, tData, strlen((char *)tData));
printf("发送完毕...\r\n");
/* 1. 接收数据 */
RxDataStruct rxDataStruct[8];
uint8_t rxMsgCount;
CAN_ReceiveMsg(rxDataStruct, &rxMsgCount);
printf("接收完毕 rxMsgCount = %d...\r\n", rxMsgCount);
/* 2. 输出消息 */
uint8_t i;
for (i = 0; i < rxMsgCount; i++)
{
RxDataStruct msg = rxDataStruct[i];
printf("stdId = %d, length = %d, msgData = %s\r\n", msg.stdId, msg.length, msg.data);
}
while (1)
{
}
}
转: