一、概要
前面已经测试了发送功能。最后笔者再测试一下接收功能。按说做一个功能相对完整的接收程序需要做好中断服务函数、回环队列和调用接口函数。但是我这里只是为了了解CAN总线的接收功能,就不去费事搞了。只要能在DEBUG里看到接收到的数据就可以了。
二、目标
- 实现CAN总线通讯
- 在DEBUG窗口中看到接收到的数据
三、实现
3.1 硬件连接
连接方式和以前一样,如下图所示。但是示波器不知道怎么回事坏掉了。所以不能看到波形了。
有关的程序和上一版类似。都是每个板子都做一个发送函数。因为CAN有总线仲裁,所以不用担心会出现收发的冲突。
这样就做1个测试用例线程,定时发送一个数据帧。把这个程序下载给两块板子。我们接上调试器看一块板子的寄存器就可以了。测试用例的代码如下所示。
#include "cmsis_os2.h" // CMSIS RTOS header file
#include "CAN1_Drv.h"
#include "stdint.h"
#include "CAN1_Send_Testcase.h"
/*----------------------------------------------------------------------------
* Thread 1 'Thread_Name': Sample thread
*---------------------------------------------------------------------------*/
static osThreadId_t tid_CAN1_Send_Testcase; // thread id
static void CAN1_Send_Testcase (void *argument); // thread function
int Init_CAN1_Send_Testcase (void) {
tid_CAN1_Send_Testcase = osThreadNew(CAN1_Send_Testcase, NULL, NULL);
if (tid_CAN1_Send_Testcase == NULL) {
return(-1);
}
return(0);
}
__attribute__((noreturn)) void CAN1_Send_Testcase (void *argument) {
static uint8_t data[] = "Andy";
while (1) {
can1.send(data, sizeof(data)/sizeof(uint8_t));
osDelay(1000);
}
}
给两块板子下载完成以后,DEBUG进入一块板子的DEBUG界面,如下所示。
由于KEIL的寄存器窗口不能看到ASCII码,所以笔者把RDL0R的地址用memory标签也打开了。用memory窗口看ASCII码。
可以看到。虽然两个板子都在发送,但是还是可以接收到其他的板子发送的数据。
四、结论
综上所述,也包括前面写到的两篇文章,可以确定:CAN总线接口在下面的初始化流程之后,就可以方便的收发数据了。
- 从SLEEP状态唤醒,进入INITIALISATION状态
- 设置波特率和模式
- 从INITIALISATION状态进入NORMAL状态
- 设置过滤器(CAN_FMR_FINIT必须为1)
- 复位CAN_FMR_FINIT
- CAN_TIxR_TXRQ发送帧
这样就可以时间数据的发送了。