can通讯首先用的是差分信号 理论上比ttl 232这些抗干扰强。
I2C协议中是存在主机与从机的,可以挂载多个从机,但是在CAN协议中,我们可以挂载多个 节点 ,通过总线来实现节点通讯,与其他协议不同的是,不对节点的地址进行编码,而是对节点的数据内容进行编码。理论上节点个数不受限制。
其次can用的特别广泛 比如我接触的liunx交互版与单片机系统版之间的通讯。还有各种设备间互相通讯都广泛用can。
对于MCU can作为外设可以进行对应的配置。硬件上则需要转换芯片进行电平转换 见到过的有tja1050 tja1051 然后这边之间用的是一个zlg的小黑模组写的ctm1051 ctm8251.(推测内部也是类似于tja1050的芯片)。然后要在两个差分信号线之间并联匹配电阻 一般是120欧姆 至于那个2k的超长距离通讯仅在介绍里见过。
详细介绍可参考 CAN详解(小白教程)_can通信_瓶邪!·的博客-CSDN博客 这位写的的很细致
FIFO什么它就是一个先进先出的数据缓存器,CAN发送邮箱中的数据经过筛选器会转到这里来。
can的通讯速率最大为1M 但我见到的多用500k进行通讯。具体速率配置函数相关有机会补充
使用can通信和串口类似 都可以放在while(1)里轮训或者触发中断 个人比较建议或者说习惯放到中断里 见到的资料放大中断里的也比较多。
在测试can的时候可以用回环模式(lookback)也就是自发自收。但是我一点也不喜欢这样
测完还要改回去接着测双机通讯 不是自找不快吗 当然设备有限的时候没办法。
对于发送的数据 可以直接一个32位的数 一个32位的数可以拆分为4个8位数 然后接受作为不同指令, 当然也可以发送一串数据或者数组 目前见到的好像有发送8个16进制数的。对于能发几个数当然还是对于不同指令功能更重要。
硬件电路参考野火 原子 或者淘宝那些模块这点也没法去验证了 今天刚查的是公司这边用的ctm8251贵据说稳定好用 反正产品里用着是够稳定的 。
往后将补充代码和操作具体内容。希望自己会进行补充
对于stm32使用cubemx配置详细在以下贴子很详细
STM32开发(五)STM32F103 通信 —— CAN通信编程详解_stm32can总线例程_Bazinga bingo的博客-CSDN博客
位时序顾名思义就是传输一个位的时序(如0或1)。位时序结构:同步段(SYNC_ SEG)、时间段1(BS1)、时间段2(BS2)
(1)将系统时间36M进行4分频,则36M/4=9M
(2)位时序中同步段(SYNC_SEG)固定1Tq;STM32时间段1(BS1)包含两部分:传播时间段和相位缓冲时间段1,可以分配11Tq;时间段2(BS2)包含相位缓冲时间段2,可以分配6Tq。
这样1位由18个Tq构成,则9M/18=500K
按照以上的配置可以实现CAN500K通信。
代码可运行的课参考野火 野火的比较详细 gd at等国产的也有参考历程 嵌入式工程师证给的历程也有中断接受长度为1的接法历程 。
中断配置 源设置
static void MX_NVIC_Init(void)
{
/* RTC_Alarm_IRQn interrupt configuration */
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
/* USB_LP_CAN1_RX0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); // can接收总中断使能
}
中断处理函数例子 gd32 高级嵌入式证那个历程写的不错有判断 头尾识别的字码和数据接受然后传递flag信号表达接受成功与否给主函数
/*!
\brief this function handles CAN0 exception
\param[in] none
\param[out] none
\retval none
*/
void CAN0_RX1_IRQHandler(void)
{
/* check the receive message */
can_message_receive(CAN0, CAN_FIFO1, &receive_message);
if((0x321 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff) && (1 == receive_message.rx_dlen)){
can_receive_ok = SET;
}
}
先到此 往后代码具体配置继续补习。