STm32的can通信问题

莫名其妙的虫子 2016-06-14 06:38:37
我用两块一样的板子进行CAN通信,但是一直接收不到,从keil的寄存器中观察发现发送时会出现填充错误stuff error,如果不发送的话会出现格式错误form error。请问该如何排查这些问题,怎么解决。
我尝试用回环模式的话,是可以正常收发的。
这是代码。求大神指教。
#include "CanTran.h"

CanTxMsg TxMessage;
CanRxMsg RxMessage;
u8 CAN_Recieve_Flag;
u8 count1 = 0;


/**
* @brief Configures the CAN, transmit and receive using interrupt.
* @param None
* @retval : PASSED if the reception is well done, FAILED in other case
*/
void MyCAN_Init(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , ENABLE);


/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=ENABLE; //
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
//CAN Speed = 200KHz
// CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
// CAN_InitStructure.CAN_BS1=CAN_BS1_14tq;
// CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
// CAN_InitStructure.CAN_Prescaler=10;
// CAN_Init(CAN1, &CAN_InitStructure);
//500k
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;
CAN_InitStructure.CAN_Prescaler=4; //10;
CAN_Init(CAN1, &CAN_InitStructure);






/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=1;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
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(&CAN_FilterInitStructure);

/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}


void CAN_TransmitData(u32 StdId, uint8_t DLC_Num,uint8_t *Data)
{
/* transmit 1 message */
uint8_t i;
TxMessage.StdId=StdId;
TxMessage.ExtId = 0x0000;
TxMessage.IDE=CAN_ID_STD;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC=DLC_Num;
for(i=0;i<DLC_Num;i++)
TxMessage.Data[i]=Data[i];
CAN_Transmit(CAN1, &TxMessage);
}

/**
* @brief This function handles USB Low Priority or CAN RX0 interrupts
* requests.
* @param None
* @retval : None
*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
CAN_Recieve_Flag = 1;
}


void CanTran_task(void)
{
if(CAN_Recieve_Flag==1)
{
CAN_Recieve_Flag = 0;
switch(RxMessage.StdId)
{
// case 0x101:
// PowerSwitchState = RxMessage.Data[3];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[2];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[1];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[0];
// UpKeyLed();
case 0x101:
// SetLedStatue(RxMessage.Data[0],RxMessage.Data[1]);
count1++;
CAN_TransmitData(0x101,8,"master1");
break;
case 2:
if(RxMessage.Data[0]==1)
{
// SetJDQ_AC(RxMessage.Data[1]);
}
else if(RxMessage.Data[0]==2)
{
// SetJDQ_Bat(RxMessage.Data[1]);
}
break;
case 3: // Èí¿ª¹Ø
// SoftOff = RxMessage.Data[0];
break;
}

}


}
...全文
2020 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
guichuan8709 2017-08-11
  • 打赏
  • 举报
回复
中断里面没有判断
csdk401k 2016-12-29
  • 打赏
  • 举报
回复
复杂的问题最好用示波器或者逻辑分析仪跑一下
pcalling 2016-12-22
  • 打赏
  • 举报
回复
以前玩过,大概需要注意几点: 1.是不是所有功能都开了 2.过滤有没有问题 3.我们用过一个can转usb不灵,换can转网络,调试通过 4.程序可以试试环回模式,如果自发自收没问题,程序大部分都是好的
coder_xsy 2016-12-08
  • 打赏
  • 举报
回复
你的过滤器是没起作用吧!完全没有屏蔽位去比较啊!
will热爱 2016-07-12
  • 打赏
  • 举报
回复
自己百度.....
AI嵌入式 2016-07-11
  • 打赏
  • 举报
回复
你把一些东西禁止乐,尝试吧所有功能打开 试试环回模式!环回模式 自己发送 自己接收
BubbleZhu 2016-07-08
  • 打赏
  • 举报
回复
遇到类似问题,楼主解决了么?
phanix2016 2016-07-08
  • 打赏
  • 举报
回复
你得确认下的的数据线没问题
zhujinqiang 2016-06-18
  • 打赏
  • 举报
回复
总线两端分别接一个120欧的终端电阻了吧?板子上面有的吧。
  • 打赏
  • 举报
回复
引用 2 楼 zhujinqiang 的回复:
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。 楼主用的什么速率测试的?
我是在500khz下进行的测试。现在还没有拿到CAN转USB数据线,没法在电脑上调试。。。问题仍待解决。。。
zhujinqiang 2016-06-16
  • 打赏
  • 举报
回复
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。 楼主用的什么速率测试的?
xqhrs232 2016-06-15
  • 打赏
  • 举报
回复
没玩过CAN通信!

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧