CAN 初始化函数
void CAN1_Config(uint8_t mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
/* 初始化 IO 口 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输
出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11
GPIO_Init(GPIOA, &GPIO_InitStructure);
/****************************************************************/
/****************** CAN 设置和初始化 ****************************/
/****************************************************************/
/* 打开时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* 初始化 CAN 的参数 */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN 参数初始化 */
CAN_InitStructure.CAN_TTCM = DISABLE; //失能时间触发模式
CAN_InitStructure.CAN_ABOM = DISABLE; //失能自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //失能睡眠模式通过软
件唤醒
CAN_InitStructure.CAN_NART = DISABLE; //失能非自动重传输模
式(也就是会自动重传输)
CAN_InitStructure.CAN_RFLM = DISABLE; //失能接收 FIFO 锁定模
式,新数据会覆盖旧数据
CAN_InitStructure.CAN_TXFP = DISABLE; //优先级由报文标识符决
定
CAN_InitStructure.CAN_Mode = mode; //有普通模式和拓展模式
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度 1
个时间单位
/* 波特率设置, 当 APB1 的时钟频率是 36MHZ 的时候。 波特率的公式
为: */
/* 波 特 率 (Kpbs) = 36M / ((CAN_BS1 + CAN_BS2 + 1) *
CAN_Prescaler) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段 1 为 8 个时间
单位
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //时间段 2 为 7 个时间
单位
CAN_InitStructure.CAN_Prescaler = 5;
CAN_Init(CAN1, &CAN_InitStructure);
#ifdef CAN_RX0_INT_ENABLE
CAN1_NVIC_Config();
#endif
}
|