论坛» 综合技术» 基础知识

CAN通讯的一个简单例子

专家
2024-01-17 15:59 1楼

前面我学习了CAN通讯的一些简单知识,这次,准备直接上实际测试,增加感性认识。为了保证出成功,使用已集成了CAN通讯的一块开发板。

图片1.png

板子上已经集成了两个CAN通讯外设,方便我们简单的测试。CAN收发的控制芯片为TJA1050。主控芯片STM32F107VCT6本身是带CAN外设控制器,

图片2.png

通过外接CAN的收发器TJA1050,就可以构成CAN的收发线路了。

图片3.png

图片6.png

为了方便测试,我们可以把CAN1和CAN2接起来,由CAN1发送数据,由CAN2接收数据。因为本次测试仅仅是为了感性认识CAN的收发处理,因此对程序不过多解读。

主处理中,在初始化阶段默认发送一次数据,由CAN1发出去。因为和CAN2直连,所以CAN2会收到数据。接受的数据通过串口打印出来。之后循环检索4个按钮,哪个按钮按下,就发送和按钮编号匹配的数据。CAN2接收到后依旧从串口打印出来。


int main(void) { int i = 0; /* Setup STM32 system (clocks, GPIO, NVIC) */ SystemInit(); System_Setup(); NVIC_Configuration(); USART_Configuration(); GPIO_Configuration_Can(); CAN_Configuration(); NVIC_Configuration_Can(); LED_Configuration();//LED配置 Key_Configuration(); RS232_Send_Data("Start test ...\r\n",20); RS232_Send_Data("Can1 send test : 0 \r\n",20); CAN1_DATA[7] = '0'; CAN1_Write_Data(CAN1_ID); while (1) { //if(can1_rec_flag == 1) { //can1_rec_flag = 0; //CAN1_Write_Data(CAN1_ID); //} One_LED_ON(Key_Value());//有按键按下则点亮相应的LED if(can2_rec_flag == 1) { RS232_Send_Data("Can2 reciev, data = : ",50); RS232_Send_Data(CAN2_DATA, 8); RS232_Send_Data("\r\n", 8); can2_rec_flag = 0; CAN2_Write_Data(CAN2_ID); } } }

主程序以外的代码,我就不贴出来了,我会把整个工程的压缩包在帖子后面附上。

这个程序演示了在拥有CAN外设的单片机上,如何实现建立CAN总线的数据收发,由于大部分机能都已经被封装以及被底层处理完成,需要我们处理的事情就很少了,你可以像使用串口那样简单地发送、接收数据即可。而且使用了专用的CAN收发器,外围电路实际上也很简单。

最后,贴上实际整个装置的图片以及测试过程中串口的输出信息。

图片5.jpg

后面打算使用其它单片机,搭建CAN收发模块,实现CAN收发电路。另外时间合适的话,会用示波器捕捉本次实验的通讯波形,并对照CAN通讯协议,深入学习、理解CAN有关的知识。

工程:can.zip

院士
2024-01-16 22:50 2楼

版主厉害了!

CAN通讯是不是很复杂啊?

P.S. 版主你的截图怎么这么不清晰啊!图片像是被压缩了

院士
2024-01-17 06:13 3楼

谢谢楼主的分享~!

专家
2024-01-17 08:15 4楼

不错,学习了

高工
2024-01-17 09:06 5楼

谢谢分享

专家
2024-01-17 09:42 6楼

咦,串口通讯的截图是来自电脑窗体的硬拷贝啊,怎么会这么不清晰,还有雪花点?看来下次发帖自己得多检查检查。

专家
2024-01-17 10:09 7楼

谢谢分享

院士
2024-01-17 12:58 8楼

版主 继续啊!

今天晚上还有新帖子放出来吗?

专家
2024-01-17 15:51 9楼

哪有那么快啊,哈哈哈。我每一次调试成功了才敢发帖子的。现在在准备下一次试验用的材料。

专家
2024-01-19 01:03 10楼

谢谢楼主的分享

共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]