1、 CAN的硬件结构:常说的CAN总线的总线就是下图的CANH和CANL两根线组成的双绞线,两端通常会分别串联两个终端电阻(常见阻值为120Ω)。各个节点就通过CANH和CANL两条线并到总线上,各节点可以随时插拔而不影响其他节点。每个节点都可以往总线上发送信息,总线上其他节点都可以接收这条信息。而如果两个节点同一时间发送信息,就会进行仲裁,优先级高(即ID数值小的节点)的节点仲裁胜出继续发送信息,仲裁失败的节点立即转入接收状态。
2、 CAN数据帧格式:
CAN数据帧分为两种:标准帧(对应标准ID:11位)和扩展帧(对应扩展ID:29位)。
以标准帧为例,一帧完整的CAN数据就包括 下图所示部分:
3、 CAN的收发机制:
发送:
AT32的CAN有3个发送邮箱,用户只需要:
① 通过“发送邮箱空”标志位确认一个空邮箱;
② 然后把需要发送数据帧的数据,ID等信息写入发送邮箱;
③ 写对应邮箱的“发送请求位”。
接收:
AT32F403的CAN有14个接收过滤器。接收过滤器用于过滤ID,用户可配置接收过滤寄存器,来接收想要的ID的帧,而过滤丢弃掉不需要的ID的帧。
AT32的CAN有两个接收FIFO,每个FIFO有3级深度(即每个FIFO可以存储3帧数据)。
① CAN每接收到一帧通过过滤的数据帧,该帧会被存入接收FIFO。此时FIFO变为挂号状态(即接收FIFO非空);
② 用户可以在对应的FIFO挂号中断里面去读取接收邮箱的数据。
③ 用户读取完数据后,通过置位“释放FIFOx”位来释放刚刚读取过的邮箱。
4、基于AT32F403的基础配置:
1)时钟使能:
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_AFIO, ENABLE); //使能GPIOB,AFIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_CAN1, ENABLE); //使能CAN1时钟
2)配置CAN对应GPIO口:
GPIO_PinsRemapConfig(GPIO_Remap1_CAN1,ENABLE); //CAN1重映射到PB9-TX,PB8-RX
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP<