STM32F407的CAN通信实验

 

软件: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]=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[i]=msg[i];  

  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

 

STM32F407的CAN通信实验_第1张图片
 

你可能感兴趣的:(新浪博客迁移)