关于双CAN通信问题请教

stm32f105RB 的芯片进行双can通信调试的时候,CAN1数据发送OK但是CAN2的数据一直无法发送,想请教一下问题到底出那里。

代码如下

void Init_Can1(void)

{

uint16_t i=0;

CAN_InitTypeDef CAN_InitStructure;

GPIO_InitTypeDef 			 GPIO_InitStruct;

CAN_FilterInitTypeDef CAN_FilterInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);//使能PORTA时钟	  

// GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

// GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStruct);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);

CAN_DeInit(CAN1);

CAN_StructInit(&CAN_InitStructure);

CAN_InitStructure.CAN_TTCM = DISABLE; /* 时间触发禁止, 时间触发:CAN硬件的内部定时器被激活,并且被用于产生时间戳 */

CAN_InitStructure.CAN_ABOM = DISABLE; /* 自动离线禁止,自动离线:一旦硬件监控到128次11个隐性位,就自动退出离线状态。在这里要软件设定后才能退出 */

CAN_InitStructure.CAN_AWUM = DISABLE; /* 自动唤醒禁止,有报文来的时候自动退出休眠 */

CAN_InitStructure.CAN_NART = DISABLE;//ENABLE;// /* 报文重传, 如果错误一直传到成功止,否则只传一次 */

CAN_InitStructure.CAN_RFLM = DISABLE; /* 接收FIFO锁定, 1--锁定后接收到新的报文摘不要,0--接收到新的报文则覆盖前一报文 */

CAN_InitStructure.CAN_TXFP = ENABLE; /* 发送优先级 0---由标识符决定 1---由发送请求顺序决定 */

CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;// CAN_Mode_LoopBack;// ; /* 模式 */

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* 重新同步跳宽,只有can硬件处于初始化模式时才能访问这个寄存器 */

CAN_InitStructure.CAN_BS1 = CAN_BS1_1tq; /* 时间段1 */

CAN_InitStructure.CAN_BS2 = CAN_BS2_1tq; /* 时间段2 */

CAN_InitStructure.CAN_Prescaler = 31; /* 波特率预分频数 */ //45:100K 18:250k

while ((CAN_Init(CAN1,&CAN_InitStructure)!=CANTXOK)&&(i<1000)) { i++; }

CAN_FilterInitStructure.CAN_FilterNumber=0; /* 过滤器0 */

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; /* 屏敝模式 */

CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; /* 32位 */

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; /* 以下四个都为0, 表明不过滤任何id */

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; /* 能够通过该过滤器的报文存到fifo0中 */

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;

CAN_FilterInit(&CAN_FilterInitStructure);

CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); /* 挂号中断, 进入中断后读fifo的报文函数释放报文清中断标志 */

}

void Init_Can2(void)

{

uint16_t i=0;

CAN_InitTypeDef CAN_InitStructure;

GPIO_InitTypeDef 			 GPIO_InitStruct;

CAN_FilterInitTypeDef CAN_FilterInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);

// GPIO_PinRemapConfig(GPIO_Remap_CAN2,ENABLE);

/* CAN register init */

CAN_DeInit(CAN2);

CAN_StructInit(&CAN_InitStructure);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStruct);

CAN_InitStructure.CAN_TTCM = DISABLE; /* 时间触发禁止, 时间触发:CAN硬件的内部定时器被激活,并且被用于产生时间戳 */

CAN_InitStructure.CAN_ABOM = DISABLE; /* 自动离线禁止,自动离线:一旦硬件监控到128次11个隐性位,就自动退出离线状态。在这里要软件设定后才能退出 */

CAN_InitStructure.CAN_AWUM = DISABLE; /* 自动唤醒禁止,有报文来的时候自动退出休眠 */

CAN_InitStructure.CAN_NART = DISABLE;//ENABLE;// /* 报文重传, 如果错误一直传到成功止,否则只传一次 */

CAN_InitStructure.CAN_RFLM = DISABLE; /* 接收FIFO锁定, 1--锁定后接收到新的报文摘不要,0--接收到新的报文则覆盖前一报文 */

CAN_InitStructure.CAN_TXFP = ENABLE; /* 发送优先级 0---由标识符决定 1---由发送请求顺序决定 */

CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;// CAN_Mode_LoopBack;//; /* 模式 */

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;      /* 重新同步跳宽,只有can硬件处于初始化模式时才能访问这个寄存器 */

CAN_InitStructure.CAN_BS1 = CAN_BS1_1tq;      /* 时间段1 */

CAN_InitStructure.CAN_BS2 = CAN_BS2_1tq;      /* 时间段2 */

CAN_InitStructure.CAN_Prescaler =31;          /* 波特率预分频数 */    //45:100K  36 125K 18:250k  

while ((CAN_Init(CAN2,&CAN_InitStructure)!=CANTXOK)&&(i<1000)) { i++; }

CAN_FilterInitStructure.CAN_FilterNumber=14; /* 过滤器14 设置CAN2的开始滤波器编号为14 */

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; /* 屏敝模式 */

CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; /* 32位 */

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; /* 以下四个都为0, 表明不过滤任何id */

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; /* 能够通过该过滤器的报文存到fifo0中 */

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;

CAN_FilterInit(&CAN_FilterInitStructure);

CAN_ITConfig(CAN2,CAN_IT_FMP0, ENABLE); /* 挂号中断, 进入中断后读fifo的报文函数释放报文清中断标志 */

}

void Can1WriteData(void)

{

uint16_t i=0;

CAN1TxMessage.RTR = CAN_RTR_DATA;///CAN_RTR_REMOTE;//CAN_RTR_DATA; /* 设置为远程帧 */

CAN1TxMessage.IDE = CAN_ID_EXT; /* 使用扩展id */

CAN1TxMessage.DLC = 8; /* 数据长度, can报文规定最大的数据长度为8字节 */

mailBox=CAN_Transmit(CAN1,&CAN1TxMessage);  /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */

while((CAN_TransmitStatus(CAN1, mailBox)!=CANTXOK)&&(i<1000))

{

	i++;

} 	 

}

void Can2WriteData(void)

{

uint16_t i=0;

CAN2TxMessage.RTR = CAN_RTR_DATA; //CAN_RTR_REMOTE;//CAN_RTR_DATA; /* 设置为远程帧 */

CAN2TxMessage.IDE = CAN_ID_EXT; /* 使用扩展id */

CAN2TxMessage.DLC = 8; /* 数据长度, can报文规定最大的数据长度为8字节 */

mailBox=CAN_Transmit(CAN2,&CAN2TxMessage);  /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */

while((CAN_TransmitStatus(CAN2, mailBox)!=CANTXOK)&&(i<1000))

{

	i++;

} 	 

}

这边板子测试是没有问题,问题应该就出现在代码上了。两个波特率用的都是125kb.麻烦大佬指点一下。

c
143 views
Comments
登录后评论
Sign In
·

stm32?哎,我忘光了

·

这边怀疑是CAN2 的引脚没有启用,但检查后所有的配置都是没问题的。然后担心是RTE_Devicer文件的问题。文件里面PB12和PB13是隐掉的,但是改 1 之后还是没用。

·

解决了,是选择的库的原因,换了官方开发板自带的库就好了。