问题:使用stm32f103c8t6单片机做回环实验,在初始化can_init 的时候失败,程序一直卡在如下位置
while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
{
wait_ack++;
}
查看了stm32手册,是如下解释的:
_INRQ: 初始化请求 (Initialization request)
软件对该位清’0’可使CAN从初始化模式进入正常工作模式:当CAN在接收引脚检测到连续的11
个隐性位后,CAN就达到同步,并为接收和发送数据作好准备了。为此,硬件相应地对
CAN_MSR寄存器的INAK位清’0’。
软件对该位置1可使CAN从正常工作模式进入初始化模式:一旦当前的CAN活动(发送或接收)结
束,CAN就进入初始化模式。相应地,硬件对CAN_MSR寄存器的INAK位置’1’
现在是 硬件对CAN_MSR寄存器的INAK位怎么也不会 置’1’
电路连接如下:
网上差了好多资料,有的说是波特率有的说是引脚复用。
代码如下:
#include "stm32f10x.h" // Device header
#include "stdbool.h"
#include "can.h"
void CAN_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//CAN_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö,TX
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
//CAN_RX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉÏÀÊäÈë RX
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
//#define GPIO_Remap_CAN GPIO_Remap1_CAN1 ±¾ÊµÑéûÓÐÓõ½ÖØÓ³ÉäI/O
//GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
}
extern uint8_t can_init_status;
void CAN_Mode_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
//ÅäÖóÉ1M bps£¬²¨ÌØÂÊ=36M/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM = DISABLE;//ʱ¼ä´¥·¢Ä£Ê½
CAN_InitStructure.CAN_ABOM = DISABLE; //×Ô¶¯ÀëÏß¹ÜÀí
CAN_InitStructure.CAN_AWUM = DISABLE;//×Ô¶¯»½ÐÑģʽ
CAN_InitStructure.CAN_NART = DISABLE;//±¨ÎÄ×Ô¶¯ÖØ´« (0ΪÆôÓÃ)
CAN_InitStructure.CAN_RFLM = DISABLE;//FIFOÒç³öʱ±¨Îĸ²¸ÇÔÎļþ
CAN_InitStructure.CAN_TXFP = ENABLE;//±¨ÎÄ·¢ËÍÓÅÏȼ¶È¡¾öÓÚÓÊÏäÏȺó
//¹¤×÷ģʽ£º
CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
//ÉèÖÃCAN²¨ÌØÂÊ (1MHz)
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler = 6;
//³õʼ»¯CAN
can_init_status = CAN_Init(CAN1,&CAN_InitStructure);
while(can_init_status != CAN_InitStatus_Success);
}
void CAN_Filter_Config(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStruct;
CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;
CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStruct.CAN_FilterNumber = 0;
CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStruct.CAN_FilterIdHigh = ((PASS_ID<<3 | CAN_Id_Extended | CAN_RTR_Data)&0xFFFF0000)>>16;
CAN_FilterInitStruct.CAN_FilterIdLow = (PASS_ID<<3 | CAN_Id_Extended | CAN_RTR_Data)&0xFFFF;
CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0xFFFF;
CAN_FilterInit(&CAN_FilterInitStruct);
//½ÓÊܵ½Ò»Ìõ±¨Îļ´¿É²úÉúÖжÏ
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
}
void CAN_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//ÇÀÕ¼ÓÅÏȼ¶0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯NVIC¼Ä´æÆ÷
}
void CAN_Config(void)
{
CAN_GPIO_Config();
CAN_Filter_Config();
CAN_Mode_Config();
CAN_NVIC_Config();
}
extern uint8_t Flag;
extern CanRxMsg RX_Message;
void USB_LP_CAN1_RX0_IRQHandler()
{
CAN_Receive(CAN1,CAN_FIFO0,&RX_Message);
Flag = 1;
}