香版:你好!我在调试STM32的时候出现后面两个字节数据错误但是接收端没有报错,下面是的我的初始化程序。
接收在中断里面 void CAN_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */ CAN_DeInit(); CAN_StructInit(&CAN_InitStructure);
/* CAN 初始化 */ /*用来使能或者失能时间触发通讯模式,可以设置这个参数的值为ENABLE或者DISABLE。*/ CAN_InitStructure.CAN_TTCM=ENABLE;
/*用来使能或者失能自动离线管理,可以设置这个参数的值为ENABLE或者DISABLE*/ CAN_InitStructure.CAN_ABOM=ENABLE; /*用来使能或者失能自动唤醒模式,可以设置这个参数的值为ENABLE或者DISABLE*/ CAN_InitStructure.CAN_AWUM=ENABLE; /*用来使能或者失能非自动重传输模式,可以设置这个参数的值为ENABLE或者DISABLE*/ CAN_InitStructure.CAN_NART=DISABLE; /*用来使能或者失能接收FIFO锁定模式,可以设置这个参数的值为ENABLE或者DISABLE*/ CAN_InitStructure.CAN_RFLM=DISABLE; /*用来使能或者失能发送FIFO优先级,可以设置这个参数的值为ENABLE或者DISABLE*/ CAN_InitStructure.CAN_TXFP=ENABLE; /*硬件工作在环回模式*/ CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_Normal;//CAN_Mode_LoopBack;//CAN_Mode_Silent_LoopBack;//硬件工作在静默环回模式 /*波特率计算公式 can时钟是RCC_APB1PeriphClock,你要注意CAN时钟频率 CAN波特率 = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler);*/ /*重新同步跳跃宽度1个时间单位*/ CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; /*定义采样点的位置*/ CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; /*时间段1为8个时间单位*/ /*定义发送点的位置*/ CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; /*设定了一个时间单位的长度*/ CAN_InitStructure.CAN_Prescaler=9; CAN_Init(&CAN_InitStructure);
/* CAN filter init */ /*指定了待初始化的过滤器,它的范围是1到13*/ CAN_FilterInitStructure.CAN_FilterNumber=0; /*标识符屏蔽位模式*/ CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; /*1个32位过滤器*/ 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; /*设定了指向过滤器的FIFO(0或1)*/ CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; /*使能或者失能过滤器。该参数可取的值为ENABLE或者DISABLE*/ CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* FIFO0消息挂号中断屏蔽 */ CAN_ITConfig(CAN_IT_FMP0, ENABLE); } /*************************************************************************************** ** 函数名称: CanTxd; ** 功能描述: 发送数据 ** 参 数: id 标识符 DLC数据长度 Fdata数据内容 ** 返 回 值: None ** 作 者: ** 日 期: 2009年2月03日 **-------------------------------------------------------------------------------------- ** 修 改 人: ** 日 期: **-------------------------------------------------------------------------------------- ****************************************************************************************/ void CanTxd(u16 Id,u8 DLC, u8 *Fdata) { CanTxMsg TxMessage; u8 TransmitMailbox,i; Fdata=Fdata; /*StdId用来设定标准标识符。它的取值范围为0到0x7FF*/ TxMessage.StdId=Id; RxMessage.ExtId=0x00; /*数据帧*/ TxMessage.RTR=CAN_RTR_DATA; /*使用标准标识符*/ TxMessage.IDE=CAN_ID_STD; /*传送数据长度DLC个字节*/ TxMessage.DLC=DLC; /*包含了待传输数据,它的取值范围为0到*/ for(i=0;i<DLC;i++) { TxMessage.Data=*Fdata++; } /* 开始一个消息的传输 */ TransmitMailbox=CAN_Transmit(&TxMessage); i=0; /*检查是否在传送数据*/ while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)&&(i!=0xFF))i++; i=0; /*返回挂号的信息数量*/ while((CAN_MessagePending(CAN_FIFO0)<1)&&(i!=0xFF)) i++; OSTimeDly (1); /*延时1*/ } |