STM32F103C8T6 CAN 通讯

1.硬件原理图

2.CAN初始化

cpp 复制代码
void main_can(void)
{   
	//SystemInit(); //设置系统时钟为72M
	KeyInit();	  //按键管脚初始化
	//LED_GPIO_Config();//LED管脚初始化
	CAN_GPIO_Config();//CAN管脚初始化
	CAN_NVIC_Configuration(); //CAN中断初始化   
	CAN_INIT();//CA初始化N模块	
//  	while(1)
//     {
// 	 GetKey();	//检测是否有按键按下
// 	   
//   	}
}
cpp 复制代码
/*	CAN初始化 */
 void CAN_INIT(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;  

  /* CAN register init */
  CAN_DeInit(CAN1);	//将外设CAN的全部寄存器重设为缺省值
  CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式
  //CAN_InitStructure.CAN_ABOM=DISABLE;//没有使能自动离线管理
	CAN_InitStructure.CAN_ABOM=ENABLE;//没有使能自动离线管理
  CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式
  CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式
  CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式
  CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN设置为正常模式
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位
//  CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //时间段1为3个时间单位
//  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位
// // CAN_InitStructure.CAN_Prescaler=60*4;  //时间单位长度为60	
//	CAN_InitStructure.CAN_Prescaler=60*2;  //时间单位长度为60	//50k
	
	  CAN_InitStructure.CAN_BS1=11;//CAN_BS1_19tq; //时间段1为3个时间单位
    CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位
 // CAN_InitStructure.CAN_Prescaler=60*4;  //时间单位长度为60	
	  CAN_InitStructure.CAN_Prescaler=120;  //时间单位长度为60	//50k
	
  CAN_Init(CAN1,&CAN_InitStructure);
                                      //波特率为:72M/2/60(1+3+2)=0.1 即100K

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//	 过滤器标识符的低16位值
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//	过滤器屏蔽标识符的低16位值
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器
  CAN_FilterInit(&CAN_FilterInitStructure);//	按上面的参数初始化过滤器

  /* CAN FIFO0 message pending interrupt enable */ 
 CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断
 
 }

3.发送代码

cpp 复制代码
/* 发送两个字节的数据*/
void can_tx3(u8 Data1,u8 Data2,u8 Data3)
{ 
  CanTxMsg TxMessage;  

  TxMessage.StdId=0x00;	//标准标识符为0x00
  TxMessage.ExtId=0x0000; //扩展标识符0x0000
  TxMessage.IDE=CAN_ID_EXT;//使用标准标识符
  TxMessage.RTR=CAN_RTR_DATA;//为数据帧
	//!!!!!!!!!!
  TxMessage.DLC=8;	//	消息的数据长度为2个字节
	
	
	//!!!!!!!
	
	TxMessage.Data[0]=0xf2; //第一个字节数据
  TxMessage.Data[1]=0xf2; //第二个字节数据 
  TxMessage.Data[2]=Data1; //第一个字节数据
  TxMessage.Data[3]=Data2; //第二个字节数据 
	TxMessage.Data[4]=Data3; //第二个字节数据 
	TxMessage.Data[5]=0x00; //第二个字节数据 
	TxMessage.Data[6]=0x00; //第二个字节数据 
	TxMessage.Data[7]=0x00; //第二个字节数据 
  CAN_Transmit(CAN1,&TxMessage); //发送数据
  
}

4.测试

相关推荐
万物智能信息科技23 分钟前
LoRa串口透传驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·嵌入式硬件·华为·开源·harmonyos
zhangzhangkeji31 分钟前
stm32, HAL 库,定时器,三:通道 1 的输入配置举例,通道输入时的 CCR 值更新原理,输入通道的脉宽捕获测量原理,对通道输入脉冲的计数,
stm32
送外卖的工程师41 分钟前
STM32空气质量检测系统(机智云)
stm32·单片机·嵌入式硬件
Industio_触觉智能1 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-上
人工智能·嵌入式硬件·硬件架构·硬件工程·智能硬件·npu·rk3576
comyccccc1 小时前
STM32F103C8T6核心板电路深度解析学习笔记
单片机·嵌入式硬件
智购科技无人售货机厂家9 小时前
压缩机一启动设备就重启,排查发现是电源功率选小了~YH
单片机·嵌入式硬件
黑马水牛10 小时前
RK3588系列:01-系统烧录与开发环境搭建
arm开发·嵌入式硬件
铅笔小新z10 小时前
【stm32】IWDG(独立看门狗)
stm32·单片机·嵌入式硬件
无敌贵点大王12 小时前
从寄存器层面重学STM32(2)——RCC和时钟树
stm32·单片机·嵌入式硬件
玄芯散人12 小时前
【元婴·103】GPIO深度:复用、上下拉、翻转速度
单片机·嵌入式硬件