历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月30日 | STM32F4 CAN2配置

2019-09-30 来源:eefocus

通信协议

image.png?imageView2/2/w/550

基本知识


特别注意 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中可以存入要发送的数据

    }

  }

}

推荐阅读

史海拾趣

EUPEC [eupec GmbH]公司的发展小趣事

面对未来市场的机遇和挑战,EUPEC制定了明确的发展战略。公司将继续加大技术创新和研发投入力度,推动电力半导体技术的进步和应用拓展。同时,EUPEC还将加强与国际知名企业的合作与交流,不断提升自身的竞争力和影响力。在应对市场变化和挑战的过程中,EUPEC将始终坚持以客户为中心的理念,为客户提供更优质的产品和服务。

请注意,以上故事是基于EUPEC公司的发展历程和相关信息进行概括和编写的,并非完全基于事实的直接叙述。如需更详细和准确的信息,请参考相关官方资料或新闻报道。

科山芯创(COSINE)公司的发展小趣事

科山芯创(COSINE)公司成立于2017年,由一群对射频及模拟集成电路芯片充满热情的工程师创立。他们看到了中国电子行业中对于高性能、高品质芯片的巨大需求,于是决定成立一家公司,专注于这一领域的研发与设计。他们的初心是通过自主创新和核心技术,为国内外客户提供有竞争力的解决方案。

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

ALSC公司成立于XXXX年,初创期面临着激烈的市场竞争和技术壁垒。然而,创始人凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于开发高性能、低功耗的半导体产品。经过多次尝试和不断改进,公司成功推出了一款具有竞争力的产品,并逐渐在市场上获得了一席之地。

HELUKABEL公司的发展小趣事

ALSC公司成立于XXXX年,初创期面临着激烈的市场竞争和技术壁垒。然而,创始人凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于开发高性能、低功耗的半导体产品。经过多次尝试和不断改进,公司成功推出了一款具有竞争力的产品,并逐渐在市场上获得了一席之地。

Crouzet公司的发展小趣事

随着市场竞争的加剧,Crouzet开始注重提供定制化的解决方案,以满足客户不断变化的需求。公司凭借强大的研发能力和丰富的行业经验,能够根据客户的具体需求,提供量身定制的产品和服务。这种以客户需求为导向的经营理念,使得Crouzet在市场上赢得了更多的客户和合作伙伴。

Avery Dennison公司的发展小趣事

1935年,Stan Avery在洛杉矶市中心创立了Avery Adhesives,以发明的不干胶模切贴标机为起点,开启了不干胶标签产业的先河。这一创新不仅改变了标签行业的面貌,也为Avery Adhesives日后的成功奠定了坚实的基础。随着公司业务的拓展,Avery在1948年在加利福尼亚州蒙罗维亚建立了第一家自有工厂,标志着公司规模的不断扩大和生产能力的提升。

问答坊 | AI 解惑

推荐ATMEL9260+Zigbee开发套件完美版

产品名称:ATMEL9260ARM + JN5139Zigbee    售价:1188元 产品规格:14*9.2cm      10*6cm 产品型号:CA-9260-ZB-EK                     &nb ...…

查看全部问答>

有谁用过红色飓风二代FPGA开发板的么?求助~

我手里的CY1C12开发板上的芯片是FPGA的EP1C12Q240C8,今天我用一个小程序,试图点亮那四个七段数码管。用的动态显示。然而,当我配置管脚,下载到板上后,数码管能够顺序点亮,但是不是之前程序里面设计的数字,有些乱码的感觉。 我怀疑是管脚配置 ...…

查看全部问答>

XILINX FPGA 设计的点滴

XILINX FPGA 设计的点滴 1、为时钟信号选用全局时钟缓冲器BUFG 2、尽量只用一个时钟沿来寄存数据 3、除了用CLKDLL或DCM产生的时钟外不要在内部产生时钟 4、注意状态机编码的可靠性:状态机转移状态改变的位数越少,则功能越可靠。 5、逻辑 ...…

查看全部问答>

windows CE6.0 USB 键盘鼠标

大家好,我在订制系统的时候,想添加USB键盘鼠标的支持,请问一下 需要添加那些组建,Reg文件 和 BIB文件需要添加那些东西 ?…

查看全部问答>

急! 使用wininet API 实现Http下载

刚刚接触Wince 6.0 现在要实现一个使用url链接下载的功能 ,参考了网上一些程序编写如下代码 void CHttpGet::Download(CString url) {         try         { CStdioFile* pSFile=NULL; CInternetSession ...…

查看全部问答>

EVC4的使用问题

请问大虾们EVC4-TOOL-WINDOWS CE PLATFORM MANAGER CONFIGURATION选项有什么用处? 如何在该选项里添加一个项目(前面带+号的那个东西)? 我是新人,百度上搜了很久没有答案,请大家帮帮忙,谢谢了。…

查看全部问答>

keil3 编译问题

我将ADS1.2下一个工程移植到Keil3 IDE下时,在解决了一些编译错误问题后,也参考了一些说明,编译完成后没有错误,当然有一堆的警告,什么字符串无效,最后一行没空等,但是连接没有生成默认该生成的.axf文件,导致调试也找不到.axf文件,当然也生 ...…

查看全部问答>

evc中怎样编辑多国语言

evc中怎样编辑多国语言 比如说我要SetWindowText(_T(\"? ?? ??\")); 但在Evc中成了SetWindowText(_T(\"? ?? ??\")); …

查看全部问答>

io口扩展问题

我想做个控制板上16个继电器,再留出一个可控制的扩展板接口也是控制16个继电器的。 我目前想用16f877单片机进行控制,不知道io扩展芯片用什么好 有什么好的设计方案,请帮忙,谢谢!…

查看全部问答>

EE_FPGA V1.0 调试进展(2010.10.17更新)

正面:   反面: 目前进展: 1. 最小系统工作 2. LED工作 3. key工作 4. usb转串口驱动正常,串口工作正常   稍后上图,敬请关注     10.17更新 [ 本帖最后由 chenzhufly 于 2010-10-17 14:20 编辑 ]…

查看全部问答>