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.测试




