历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | STM32F4 CAN2配置

发布者:theta18 来源: eefocus关键字:STM32F4  CAN2配置 手机看文章 扫描二维码
随时随地手机看文章

通信协议

image.png

基本知识


特别注意 CAN2配置时,滤波器要从[14]开始配置。

代码块

#define CAN2_PORT        CAN2

#define CAN2_GPIO_PORT   GPIOB

#define CAN2_RX_PIN      GPIO_Pin_12

#define CAN2_TX_PIN      GPIO_Pin_13


#define CAN_ID_Chassis   130


struct CAN_Socket

{

  unsigned int    u32_StdId;

  unsigned int    u32_ExtId;

  unsigned char   u8_IDE;

  unsigned char   u8_RTR;

  unsigned char   u8_DLC;

  unsigned char   u8_FMI;

  unsigned char   u8_data[8];

};

typedef struct CAN_Socket CAN;


CAN Send_Socket;


CanRxMsg  RxMessage2;

CanTxMsg  TxMessage2;


void CAN_Data_Init(void)

{

  int i;

  Send_Socket.u32_StdId = CAN_ID_Chassis;

  Send_Socket.u8_IDE = CAN_ID_STD;

  Send_Socket.u8_RTR = CAN_RTR_DATA;

  Send_Socket.u8_DLC = DLC_MAX;


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

  {

    Send_Socket.u8_data[i] = 0;

  }

}


void CAN2_Setup()

{

  GPIO_InitTypeDef GPIO_InitStructure;

  CAN_InitTypeDef CAN_InitStructure;

  CAN_FilterInitTypeDef CAN_FilterInitStructure;

  NVIC_InitTypeDef  NVIC_InitStructure;


  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);


  GPIO_InitStructure.GPIO_Pin = CAN2_RX_PIN|CAN2_TX_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_Init(CAN2_GPIO_PORT, &GPIO_InitStructure);


  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2); //CAN_RX = PB12

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2); //CAN_TX = PB13


  CAN_DeInit(CAN2);

  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */

  CAN_InitStructure.CAN_TTCM = DISABLE;

  CAN_InitStructure.CAN_ABOM = DISABLE;

  CAN_InitStructure.CAN_AWUM = DISABLE;

  CAN_InitStructure.CAN_NART = ENABLE;

  CAN_InitStructure.CAN_RFLM = DISABLE;

  CAN_InitStructure.CAN_TXFP = DISABLE;

  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;//同步跳转时间段

  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;//时间段1

  CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;//时间段2

  CAN_InitStructure.CAN_Prescaler = 6;//波特率分频器

  /* CAN 波特率配置 = 42MHz/[(1+3+3)*6] = 1MHz (APB1的时钟频率一般为42MHz)*/


  if(CAN_Init(CAN2, &CAN_InitStructure) == CANINITFAILED)

  {

    do {}

    while(1);

  }

  /* CAN filter init */

  CAN_FilterInitStructure.CAN_FilterNumber = 14;//CAN2的滤波器从14开始

  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;

  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;

  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;

  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;

  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

  //  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;

  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;

  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

  CAN_FilterInit(&CAN_FilterInitStructure);


  CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);


  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);  

}


void CAN2_RX0_IRQHandler(void)

{

  int i;

  RxMessage2.StdId = 0x00;

  RxMessage2.ExtId = 0x00;


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

  {

    RxMessage2.Data[i] = 0;

  }

  CAN_Receive(CAN2, CAN_FIFO0, &RxMessage2);


  switch(RxMessage2.StdId)

  {

  case 1:

    break;


  case 2:

    break;


  default:

    break;

  }

}


void CAN_TxSocket_CAN2(CAN *can_Socket)

{

  char i = 0;

  TxMessage2.StdId=can_Socket->u32_StdId;

  TxMessage2.ExtId=can_Socket->u32_ExtId;

  TxMessage2.IDE=can_Socket->u8_IDE;

  TxMessage2.RTR= can_Socket->u8_RTR;

  TxMessage2.DLC=can_Socket->u8_DLC;


  for(i =0; i  {

    TxMessage2.Data[i] = can_Socket->u8_data[i];

  }

  i = CAN_Transmit(CAN2, &TxMessage2);

}


int main(void)

{

  CAN2_Setup();

  CAN_Data_Init();


  while(1)

  {

    if(Send_Flag == 1)//这个flag可用一个定时器来计时,这里不做特别说明

    {

      Send_Flag = 0;

      CAN_TxSocket_CAN2(&Send_Socket);//Send_Socket中可以存入要发送的数据

    }

  }

}

关键字:STM32F4  CAN2配置 引用地址:STM32F4 CAN2配置

上一篇:利用CAN中断进行简单的数据接收
下一篇:STM32F4 CubeMX HAL CAN 使用步骤

推荐阅读

今天我们的机器已经能够帮助人类做很多事情,比如在工厂与人类一起工作,进行3D打印,让医生和病人实现远程连接等等。未来,有了AI的助力,机器人能为人们做更多的事,让人们的工作和生活更加智能和便利。让AI注入机器人AI技术能够在两个维度促进机器人技术的进展,推动实现未来生活的愿景。一方面是静态的,用AI提升机器的智能,比如认知能力;另一方面是...
直奔主题,我是在原子哥F407例程的基础上想实现双机CAN通讯我用的核心板为STM32-F407ZGT6,原理图上看到PA11、PA12引脚可以复用为CAN1_RX和CAN1_TX,在与CAN收发器接线时不要接错,PA11与收发器TXD相连,PA12与收发器RXD相连。收发器建议用HVP230,可以用板子3.3V供电;TJA1050也可以,不过需要5V供电,这点需要注意。CAN的初始化:u8 CAN1_Mode_Init(u8...
据国外媒体报道,诺基亚公司周二表示,已经与英国电信公司签署了一份合同,将成为后者的最大 5G 网络设备供应商。 英国电信旗下由诺基亚支持的网络(目前包括大伦敦、Midlands 以及农村地区)将得到扩展,从而也覆盖英国各地的其他多个城镇和城市。  诺基亚新闻稿未披露合同具体规模,但外媒表示,诺基亚赢得了英国电信约 63% 的...
芯片短缺迫使苹果在今年 iPhone 13 系列的某些组件上做出妥协,预估 2022 年推出的 iPhone 14 也会遭遇相同的命运。根据一份新报告,苹果正在与 QLC NAND 闪存供应商合作,在明年的机型中使用 QLC。而 QLC 技术最大的问题就是寿命会比较短。相比较 TLC(三层单元)、MLC(多层单元) NAND,QLC(四层单元)可以存储每个单元四位,可以在同...

史海拾趣

问答坊 | AI 解惑

基于SRAM的可重配置电路

基于SRAM的可重配置PLD(可编程逻辑器件)的出现,为系统设计者动态改变运行电路中PLD的逻辑功能创造了条件。PLD使用SRAM单元来保存字的配置数据决定了PLD内部互连和功能,改变这些数据,也就改变了器件的逻辑功能。由于SRAM的数据是易失的,因此这 ...…

查看全部问答∨

火灾探测器图纸

火灾探测器图纸…

查看全部问答∨

pcb 检查列表规范

希望能对大家有用…

查看全部问答∨

德州仪器高性能模拟器件在大学生电子设计中的应用与快速选型指南

本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 德州仪器高性能模拟器件在大学生电子设计中的应用与快速选型指南 两部分需要一起下载才能解压 [ 本帖最后由 open82977352 于 2009-7-27 18:07 编辑 ]  …

查看全部问答∨

开关电源

我做了个开关电源,变压器吱吱的响,是怎么回事啊?希望和大家探讨一下…

查看全部问答∨

IAR5.4生成可执行文件

小弟看了很多人用IAR生成可执行.bin格式的文件,为什么我用他们的方法我生成的.bin文件居然有700M,很是郁闷,不知道是怎么一回事啊。在Category理得output converter里面我选择输出格式是binary。按理说也就2M左右吧,居然这么大,大家有遇到这种问 ...…

查看全部问答∨

wince LCD驱动的问题

我用的是市场买的2440开发板,配夏普LQ121S1LG45液晶自己开发驱动。 夏普LQ121S1LG45的pdf资料网上找不到,我只找到了LQ121S1LG41和LQ121S1LG61的,它们参数都一样,目前我计算的是下面的一组参数,可以很清晰的显示静态开机画面了,但显示画面几 ...…

查看全部问答∨

动态加载键盘过滤驱动的问题

在DDK中我学winio源码一样创建一个dll来动态加载键盘过滤驱动kbfiltr.sys,可是总是在StartService时出错,错误号为ERROR_SERVICE_DISABLED,可换成winio.sys就行了。我似乎看到过键盘驱动好像是不能动态加载的,可又不确定。 所以总结一下,我想 ...…

查看全部问答∨

如何在WINCE里快速访问SQLSERVER的数据库

在WINCE开发时,要连接到SQLSERVER的数据库执行一个查询,采用的SqlServerConnection,发现速度比较慢,从1万条数据里取30条数据需要2秒左右,而同样的程序如果在WINDOWS上执行,大楷10毫秒。 两者区别,一个在WINCE平台,利用USB和XP连接, ...…

查看全部问答∨

变频器中的IGBT是如何选择正确的参数?

假设额定功率100KW,三相380V * 1.414 大约按500V计算,2个IGBT组成半桥,单IGBT占空比0.4,则计算出实际电流大约为:100K/500/0.4/2=250A,一般加倍选则,所以应该选500A/1200V的IGBT模块 因为IGBT导通时会有浪涌电流,有时候会很大甚至超过管子的 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved