玩转X-CTR100 l CAN通信

Posted xtark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转X-CTR100 l CAN通信相关的知识,希望对你有一定的参考价值。

技术分享图片

更多塔克创新资讯欢迎登陆【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

 

X-CTR100控制器STM32F4处理器内置CAN控制器,实现CAN通信功能,需要外扩CAN接口模块,本例程使用NXP的JTA1050模块。

技术分享图片

原理

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应"减少线束的数量"、"通过多个LAN,进行大量数据的高速通信"的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。

CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。关于CAN协议详细介绍,请参考资料文件夹相关文档。

X-CTR100控制器STM32F4处理器内置CAN控制器,支持 CAN 协议 2.0A 和 2.0B,特性如下。

  • 支持 CAN 协议 2.0A 和 2.0B 主动模式
  • 波特率 最高达 1Mbps 1Mbps
  • 支持时间触发通信
  • 具有 3个发送邮箱 个发送邮箱
  • 具有 3级深度的 级深度的 2个接收 个接收 FIFO
  • 可变的过滤器组( 28 个)

STM42F4内部CAN框图。

技术分享图片

使用CAN功能,需要增加CAN通信接口芯片,本文使用TJA1050,该芯片兼容PCA82C250。

例程

使用CAN接口模块TJA1050进行CAN通信操作,实现了数据循环发送和数据接收显示功能,可通过2块X-CTR100控制器通信,或者使用1块X-CTR100和CAN分析仪通信,本例程以2套X-CTR100通信为例进行说明。

硬件说明

硬件资源:

  • 串口UART1
  • LED灯
  • CAN扩展接口(LH)
  • CAN接口模块TJA1050(需自备)

连接关系如图所示

技术分享图片

连接实物图

技术分享图片

软件说明

X-SOFT软件生态,X-API扩展文件如下。

ax_can.c—— CAN通信源文件

ax_can.h——CAN通信接口头文件

接口函数

void AX_CAN1_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,uint16_t brp,uint8_t mode); //CAN1初始化

uint8_t AX_CAN1_SendMsg(uint8_t* msg,uint8_t num); //CAN1发送数据

uint8_t AX_CAN1_ReceiveMsg(uint8_t *msg); //CAN1接收数据

特殊说明,1.8固件 PLL_N 默认为360,通信时频率错误,之前固件版本为336,改为336后,通信正常。

修改位置为,system_stm32f4xx.c,400行位置。

#if defined (STM32F40_41xxx)

#define PLL_N 336 //360

/* SYSCLK = PLL_VCO / PLL_P */

#define PLL_P 2

#endif /* STM32F40_41xxx */

例程代码主要包括两部分,主程序负责数据定时发送,CAN接收中断负责数据接收和显示。

CAN1接收中断程序代码如下。

//中断服务函数            

void CAN1_RX0_IRQHandler(void)

{

    CanRxMsg RxMessage;

    uint8_t i=0;

      

CAN_Receive(CAN1, 0, &RxMessage);

    

    printf("RX");    

    

    for(i=0;i<8;i++)

    printf("%d ",RxMessage.Data[i]);

    

    printf(" ");    

    

}

主程序代码如下。

int main(void)

{    

    u8 i=0;

    u8 canbuf[8];

    u8 res;

    

    //XRT1初始化

    AX_Init(115200);

    printf("***X-CTR100 CAN通信例程*** ");    

 

    //CAN初始化,正常模式,波特率500Kbps

    AX_CAN1_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);

    

    //设置CAN接收中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2    

    NVIC_Config();

    

    //初始化发送数据

    for(i=0;i<8;i++)

    {

        canbuf[i] = 0; //填充发送缓冲区

    }

    

    while (1)

    {

        canbuf[0]++;

        

        res=AX_CAN1_SendMsg(canbuf,8);//发送8个字节

        

        AX_Delayms(100);

        AX_LEDG_Toggle();

    }

}

为了显示每帧数据差异,发送的第一个字节进行加1操作。

实现效果

两个X0CTR100控制器互相发送接收,打开串口助手即可查看接收的数据。

技术分享图片

以上是关于玩转X-CTR100 l CAN通信的主要内容,如果未能解决你的问题,请参考以下文章

玩转X-CTR100 l ESP8266串口WIFI模块

玩转X-CTR100 | X-PrintfScope波形显示

玩转X-CTR100 | X-PrintfScope波形显示

玩转X-CTR100 | X-Assistant串口助手控制功能

玩转X-CTR100 l STM32F4 l 舵机控制

玩转X-CTR100 l OLED显示-SSD1306无字库