STM32
直播中

niu!kf

12年用户 601经验值
私信 关注
[问答]

STM32F407的CAN通信过程是怎样的

STM32F407的CAN通信目的是什么?
STM32F407的CAN通信过程是怎样的?

回帖(1)

李浩

2021-10-20 11:03:58
  软件:keil5、EmbededDebug v2.0
  目的:按下按键芯片能发送给电脑。当电脑发送时,触发中断,而后芯片把收到的数据返回给电脑
  以下必须有,放入主函数:
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  delay_init(168); //初始化延时函数
  LED_Init(); //初始化LED
  KEY_Init(); //按键初始化
  CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//500K
  while(1)
  {
  key=KEY_Scan(0);//按键扫描
  if(key==KEY0_PRES)//KEY0按下,发送一次数据
  {
  for(i=0;i《8;i++)
  {
  canbuf=i;//填充发送缓冲区
  }
  CAN1_KeySend_Msg(canbuf,8);
  }
  }
  使用扩展帧,不用标准帧:
  u8 CAN1_KeySend_Msg(u8* msg,u8 len)
  {
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  //TxMessage.StdId=0x18; // This parameter can be a value between 0 to 0x7FF. 标准的不用了
  TxMessage.ExtId=0x181056f4; // This parameter can be a value between 0 to 0x1FFFFFFF 使用扩展
  //TxMessage.IDE=0;
  TxMessage.IDE=1; //使用扩展置1
  TxMessage.RTR=0;// 消息类型为数据帧
  TxMessage.DLC=len;
  for(i=0;i
  TxMessage.Data=msg;
  mbox= CAN_Transmit(CAN1, &TxMessage);
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i《0XFFF))i++;//等待发送结束
  if(i》=0XFFF)return 1;
  return 0;
  }
  最重要的就是:CAN_Transmit()
  在stm32f4xx_can.c文件中
  如果用例程,使用扩展帧的时候一直都失败
  所以需要修改的地方如下:
  assert_param(IS_CAN_EXTID(TxMessage-》ExtId));
  CANx-》sTxMailBox[transmit_mailbox].TIR |= ((TxMessage-》ExtId 《《 3) |
  TxMessage-》IDE《《2 |
  TxMessage-》RTR《《1);
  现在自己写一个结构体用来存放自己想发送的数据
  typedef struct CAN_Tx{
  u16 DA; //指定发送的数据
  u16 DB;
  u16 DC;
  u16 DD;
  u16 Ide;
  u16 Rtr;
  u16 Len; //指定字节数
  u32 RevMBXnID ; //指定发送的ID号,
  }TCAN_Msg;
  TCAN_Msg CANTxMsg[]={{0,0,0,0, 0,0,0,0x00}};
  再搞一个指针TCAN_Msg *PtrCanTx = &CANTxMsg[0];//指向结构体地址
  就可以这样了:PtrCanTx-》 Len = 8;
  再写一个和上面u8 CAN1_KeySend_Msg(u8* msg,u8 len)差不多的函数
  就叫:u8 CAN1_Send_Msg(TCAN_Msg *CANTx)
  对于中断服务函数:
  在初始化的时候(用例程就行)已开启中断,所以电脑发送数据就会触发中断(FIFO0消息挂号中断允许。)
  void CAN1_RX0_IRQHandler(void)
  在中断中可以写一些,接收到某消息后的某动作啥的
  ================================================================
  按键按下发送:0x01 0x02 0x03 0x04 0x05 0x06 0x07
  在程序里写想发送的数据:0x01 0x00 0x00 0x00 0x00 0x00
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分