CAN 通讯学习(未完成版)

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;
    }
}
 

先到此 往后代码具体配置继续补习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值