你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F107 CAN收发问题(求助!)

[复制链接]
sparkwxl 提问时间:2012-7-20 10:49 /
最近在用107的板子在调试CAN,参考了网上的代码,用CAN1通讯,板子上对应的IO为PD0,PD1,已经remap,中断接收,轮循发送,自发自收没有问题,NORMAL模式下就无法收到CAN盒的数据帧,CAN盒也收不到板子发送的数据帧(追踪到发送状态一直是CAN_TxStatus_Pending),用示波器量过,发送和接收时总线上都是有差分信号出来的,检查了代码,发现好像也没啥问题,求指正!


void  can_configuration(void)
{
CAN_InitTypeDef         CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* GPIOB Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |   RCC_APB2Periph_GPIOD ,  ENABLE);
/* Enable CAN1 clock  */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);

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


/* Configure CAN1  pin(PB5): RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);  
/* Configure  CAN1 pin(PB6): TX */
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
GPIO_Init(GPIOD,  &GPIO_InitStructure);

/* Enable the USART2 Pins Software  Remapping */
GPIO_PinRemapConfig(GPIO_Remap2_CAN1,  ENABLE);


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

/* CAN cell init */
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;
CAN_InitStructure.CAN_TXFP = ENABLE;  
CAN_InitStructure.CAN_Mode =  CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;      
CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;      
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;   
CAN_InitStructure.CAN_Prescaler = 9;     //500kHz

CAN_Init(CAN1,&CAN_InitStructure);               

CAN_FilterInitStructure.CAN_FilterNumber=0;  
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=0;  
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}

发送:
void  CanWriteData(void)
{
CanTxMsg TxMessage;

/* transmit  */
TxMessage.StdId = 0x55;  
TxMessage.RTR = CAN_RTR_DATA;  
TxMessage.IDE = CAN_ID_STD;   
TxMessage.DLC = 8;            
TxMessage.Data[0] = 0x55;   
TxMessage.Data[1] = 0x55;     
TxMessage.Data[2] = 0x55;   
TxMessage.Data[3] = 0x55;     
TxMessage.Data[4] = 0x55;   
TxMessage.Data[5] = 0x55;      
TxMessage.Data[6] = 0x55;   
TxMessage.Data[7] = 0x55;      
CAN_Transmit(CAN1,&TxMessage);  
}

接收:
void  CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;

CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);  
recv_frame.id =  RxMessage.StdId;
recv_frame.data_buff[0] = RxMessage.Data[0];
recv_frame.data_buff[1] = RxMessage.Data[1];
recv_frame.data_buff[2] = RxMessage.Data[2];
recv_frame.data_buff[3] = RxMessage.Data[3];
recv_frame.data_buff[4] = RxMessage.Data[4];
recv_frame.data_buff[5] = RxMessage.Data[5];
recv_frame.data_buff[6] = RxMessage.Data[6];
recv_frame.data_buff[7] = RxMessage.Data[7];
can_recv_flag =  ENABLE;
}
收藏 评论12 发布时间:2012-7-20 10:49

举报

12个回答
sparkwxl 回答时间:2012-7-20 11:26:01

RE:STM32F107 CAN收发问题(求助!)

都没人回复啊。。。。
cedar-358594 回答时间:2012-7-20 11:44:30

RE:STM32F107 CAN收发问题(求助!)

RxMessage.DLC 接收的数据长度是不是需要设置啊!
cedar-358594 回答时间:2012-7-20 11:46:20

RE:STM32F107 CAN收发问题(求助!)

你调试CAN 是不是需要从设备啊,没有接收设备吗,还有你的波特率好像也没有设置啊
sparkwxl 回答时间:2012-7-20 11:57:26

RE:STM32F107 CAN收发问题(求助!)

接收数据长度是按标准帧来的,应该不用设置吧,现在是接收中断都没有进。。。
我是107的板子和周立功的USBCAN-II作通讯
波特率在这几句中设置了的
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 9; //500kHz
/* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)  此处计算为  CANbps=36000000/(9*(4+3+1))=500kHz */
cedar-358594 回答时间:2012-7-20 15:10:18

回复:STM32F107 CAN收发问题(求助!)

回复第 5 楼 于2012-07-20 11:57:26发表:
接收数据长度是按标准帧来的,应该不用设置吧,现在是接收中断都没有进。。。
我是107的板子和周立功的USBCAN-II作通讯
波特率在这几句中设置了的
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 9; //500kHz
/* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1) 此处计算为 CANbps=36000000/(9*(4+3+1))=500kHz */ 

你现在就是中断不能进去吗,那就是中断设置的问题,你看看看中断都使能了,中断入口正确吗
 
sparkwxl 回答时间:2012-7-20 15:40:20

回复:STM32F107 CAN收发问题(求助!)

中断有使能了的,如果中断没使能的话,自闭环下,自发自收时,中断就收不到了
sparkwxl 回答时间:2012-7-20 15:56:05

RE:STM32F107 CAN收发问题(求助!)

进一步追踪接收的问题,当CAN盒发送出数据帧时,107这边中断没触发,查询CAN_FLAG_LEC,发现返回0x01,位填充错误。。。
请教位填充错误是哪里设置错误?如何解决?
sparkwxl 回答时间:2012-7-20 16:30:55

RE:STM32F107 CAN收发问题(求助!)

问题补充:现在出现位填充错误,不知道是不是跟我107板子上,CAN_H和CAN_L之间没有接120欧的终端电阻造成的?但我接上这个终端电阻,在传送数据帧时,总线上就没波形了。。。。求解!
sparkwxl 回答时间:2012-7-20 16:39:26

RE:STM32F107 CAN收发问题(求助!)

问题补充:上面说错了,刚才又测了一下,接上终端电阻,总线及107的CAN控制器管脚都是有波形的,但检测到的还是位填充错误。。。。郁闷哪
ttytyty 回答时间:2017-2-23 08:30:52
sparkwxl 发表于 2012-7-20 16:39
问题补充:上面说错了,刚才又测了一下,接上终端电阻,总线及107的CAN控制器管脚都是有波形的,但检测到的 ...

有解决吗,我也碰到同样的问题
xmshao 回答时间:2017-2-23 16:58:09
本帖最后由 xmshao 于 2017-2-23 17:00 编辑
ttytyty 发表于 2017-2-23 08:30
有解决吗,我也碰到同样的问题

先LOOP BACK模式验证下基本软件配置,包括中断配置;

NORMAL模式下注意两边波特率、匹配电阻、硬件连接等。还以ST都有官方参考代码,多参考下,事半功倍。
STM1024 回答时间:2018-2-27 10:37:52
我用F103也碰到了同样的问题,回环模式下一直是Pending,进不了中断。软件调试显示报文已经发送出去了,但是一直没有进入中断,也没有报文接受。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版