12# woshishiyanshj
我是用的STM32F 103做的,用的默认的IO口,设置差不多,只是PCLK1=8M,
难道是 PCLK1设置有问题吗。我先去试试。
void CAN_Configuration(void) //CAN配置函数
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(CAN1,&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的 CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
CAN_InitStructure.CAN_NART=ENABLE;//DISABLE; CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM=DISABLE;//在接收溢出时FIFO未被锁定,当接收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_13tq;//时间段1为8个时间单位
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//时间段2为7个时间单位
CAN_InitStructure.CAN_Prescaler = 5; //(pclk1/((1+8+7)*5)) = 8Mhz/16/5 = 100Kbits设定了一个时间单位的长度9
CAN_Init(CAN1,&CAN_InitStructure);
/* CAN filter init 过滤器初始化*/
CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//给出了过滤器位宽1个32位过滤器
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器
CAN_FilterInit(CAN1,&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//使能指定的CAN中断
}
-------------------------------------------------------------------------
TestStatus CAN_TxData(char data)
{
CanTxMsg TxMessage;
u32 i = 0;
u8 TransmitMailbox = 0;
TxMessage.StdId=0x00;// 设定标准标识符
TxMessage.IDE=CAN_ID_STD;// 设定消息标识符的类型
TxMessage.RTR=CAN_RTR_DATA;// 设定待传输消息的帧类型
TxMessage.DLC= 1; //设定待传输消息的帧长度
TxMessage.Data[0] = data;// 包含了待传输数据
TransmitMailbox = CAN_Transmit(&TxMessage);//开始一个消息的传输
i = 0;
while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK && (i !=0xFF))
{
i++;
}
return (TestStatus)ret;
}
}
|