KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记8 - STM32的CAN学习与测试3

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记8 - STM32的CAN学习与测试3

一、概要

前面已经测试了发送功能。最后笔者再测试一下接收功能。按说做一个功能相对完整的接收程序需要做好中断服务函数、回环队列和调用接口函数。但是我这里只是为了了解CAN总线的接收功能,就不去费事搞了。只要能在DEBUG里看到接收到的数据就可以了。

二、目标

  1. 实现CAN总线通讯
  2. 在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总线接口在下面的初始化流程之后,就可以方便的收发数据了。

  1. 从SLEEP状态唤醒,进入INITIALISATION状态
  2. 设置波特率和模式
  3. 从INITIALISATION状态进入NORMAL状态
  4. 设置过滤器(CAN_FMR_FINIT必须为1)
  5. 复位CAN_FMR_FINIT
  6. CAN_TIxR_TXRQ发送帧

这样就可以时间数据的发送了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值