OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7160|回复: 24

关于用can中断来发送和接收数据的问题

[复制链接]

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
发表于 2016-1-22 15:57:15 | 显示全部楼层 |阅读模式
6金钱
本帖最后由 Autoer 于 2016-1-22 16:10 编辑

我用的是stm32f103rct6的芯片,打算用can发送和中断函数来处理数据传输。我还需要原子例程那的Can_Send_Msg函数吗?还是在USB_HP_CAN1_TX_IRQHandler(void)里面写上mbox= CAN_Transmit(CAN1, &TxMessage);    i=0;   while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFF))i++;  ?
一下是一点程序配置:
   CAN_InitStructure.CAN_NART=DISABLE;
    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
    CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);


void USB_LP_CAN1_RX0_IRQHandler(void)
{
    CanRxMsg rx_message;

    if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)
        {
        CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
        CAN_Receive(CAN1, CAN_FIFO0, &rx_message);
    }
}

void USB_HP_CAN1_TX_IRQHandler(void)
{
    if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
        {
           CAN_ClearITPendingBit(CAN1,CAN_IT_TME);

    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-22 16:54:02 | 显示全部楼层
我用上面第二种方法,并且将        t++;  if(t==3000)  { LED0=!LED0;  t=0; }    写入void USB_HP_CAN1_TX_IRQHandler(void)这个函数,led灯不会闪烁,表示它根本没进入这个TX中断函数。这是怎么回事呢?
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-22 17:12:23 | 显示全部楼层
感觉发送中断没啥意思啊
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-22 18:24:30 | 显示全部楼层
蓝风3101 发表于 2016-1-22 17:12
感觉发送中断没啥意思啊

奴家想用这个嘛,你帮帮妹子好不。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 09:12:09 | 显示全部楼层
Autoer 发表于 2016-1-22 18:24
奴家想用这个嘛,你帮帮妹子好不。

不吃这一套,那你怎么去触发中断了,用按键么?没有进入中断是没给中断条件
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 11:31:02 | 显示全部楼层
蓝风3101 发表于 2016-1-23 09:12
不吃这一套,那你怎么去触发中断了,用按键么?没有进入中断是没给中断条件

void USB_HP_CAN1_TX_IRQHandler(void)    这个函数的触发条件是CAN_TSR寄存器的RQCP0位被置’1’对吧?
数据发送成功时,发送邮箱0会自动将这一位置1,然后就进入哪个中断?

那么是不是我一开始就将发送邮箱清零之后就会进入中断,然后在中断里我写入发送数据,它就会不停地进入中断了?
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 11:49:46 | 显示全部楼层
Autoer 发表于 2016-1-23 11:31
void USB_HP_CAN1_TX_IRQHandler(void)    这个函数的触发条件是CAN_TSR寄存器的RQCP0位被置’1’对吧?
...

你试试啊,中断发生要有条件,比如外部触发,可以看一下按键中断例程
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 11:50:47 | 显示全部楼层
Autoer 发表于 2016-1-23 11:31
void USB_HP_CAN1_TX_IRQHandler(void)    这个函数的触发条件是CAN_TSR寄存器的RQCP0位被置’1’对吧?
...

我这两天也正在搞CAN通信,有的我也不太清楚
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 11:54:06 | 显示全部楼层
Autoer 发表于 2016-1-23 11:31
void USB_HP_CAN1_TX_IRQHandler(void)    这个函数的触发条件是CAN_TSR寄存器的RQCP0位被置’1’对吧?
...

一步一步调,先把程序调通,然后加接收中断,加发送中断
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 12:01:25 | 显示全部楼层
蓝风3101 发表于 2016-1-23 11:54
一步一步调,先把程序调通,然后加接收中断,加发送中断

   摁呢....数据手册好蛋疼。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 12:04:11 | 显示全部楼层
Autoer 发表于 2016-1-23 12:01
摁呢....数据手册好蛋疼。

那你揉揉蛋,你玩CAN,定协议没,让我参考一下
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 13:34:48 | 显示全部楼层
蓝风3101 发表于 2016-1-23 12:04
那你揉揉蛋,你玩CAN,定协议没,让我参考一下

就是原子例程的发送函数差不多,CAN_NART改成ENABLE,中断接收。
我还试过发送中断,不过要我人为发送一次他才开始不断进入中断(在中断函数里写了发送语句)。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 14:00:32 | 显示全部楼层
Autoer 发表于 2016-1-23 13:34
就是原子例程的发送函数差不多,CAN_NART改成ENABLE,中断接收。
我还试过发送中断,不过要我人为发送一 ...

本来就需要你人为控制才可以进入中断,有触发条件才能进入中断,估计你是想自己发送自动进入中断,那就要写软中断触发条件
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 14:03:30 | 显示全部楼层
Autoer 发表于 2016-1-23 13:34
就是原子例程的发送函数差不多,CAN_NART改成ENABLE,中断接收。
我还试过发送中断,不过要我人为发送一 ...

而且我也纳闷你为啥非要用发送中断,直接发送,接收有中断就行了,发送时候要去触发才能进中断。
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 15:31:07 | 显示全部楼层
蓝风3101 发表于 2016-1-23 14:03
而且我也纳闷你为啥非要用发送中断,直接发送,接收有中断就行了,发送时候要去触发才能进中断。

呵呵,写软中断触发条件该怎么写好?有没有哪个库函数是可以触发他的。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-23 16:09:36 | 显示全部楼层
那个自己写去,先去看手册上的中断怎么用的
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 16:37:30 | 显示全部楼层
蓝风3101 发表于 2016-1-23 16:09
那个自己写去,先去看手册上的中断怎么用的

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-23 18:41:18 | 显示全部楼层
发的时候,调用Can_Send_Msg发送。接收的时候,可以设置为中断接收。
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-23 18:53:27 | 显示全部楼层
正点原子 发表于 2016-1-23 18:41
发的时候,调用Can_Send_Msg发送。接收的时候,可以设置为中断接收。

原子哥可想你了,只要CAN_InitStructure.CAN_NART=DISABLE;        设置报文自动发送还需要写CAN_Transmit(CAN1, &TxMessage);  不?
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-1-19
在线时间
6 小时
发表于 2016-1-25 21:22:15 | 显示全部楼层
我也遇到这个问题了,修改了中断响应函数,使能中断,其他中断设置如例程,但是回环模式无法进入中断...如有解决,告知一下呗
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-25 22:26:20 | 显示全部楼层
ziqianCN 发表于 2016-1-25 21:22
我也遇到这个问题了,修改了中断响应函数,使能中断,其他中断设置如例程,但是回环模式无法进入中断...如 ...

发送中断是发送成功后执行的。建议发送的话用例程那种方法。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-1-19
在线时间
6 小时
发表于 2016-1-29 12:59:37 | 显示全部楼层
Autoer 发表于 2016-1-25 22:26
发送中断是发送成功后执行的。建议发送的话用例程那种方法。

发送试用的是例程的方法,另外一块板子能够接收到,表示发送成功,但是本板子的接收中断无法进入,不知什么情况
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-11-23
在线时间
24 小时
 楼主| 发表于 2016-1-29 23:29:10 | 显示全部楼层
ziqianCN 发表于 2016-1-29 12:59
发送试用的是例程的方法,另外一块板子能够接收到,表示发送成功,但是本板子的接收中断无法进入,不知什 ...

正点原子例程里有写接收中断的代码,小心点看看开发指南和原子哥的can代码配置吧,可以哒。
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-1-25
在线时间
16 小时
发表于 2016-1-30 00:11:22 | 显示全部楼层
这个比较简单了,建议楼主看下例程
诚交各路大侠
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-31 16:12:56 | 显示全部楼层
Autoer 发表于 2016-1-23 18:53
原子哥可想你了,只要CAN_InitStructure.CAN_NART=DISABLE;        设置报文自动发送还需要写CAN_Transmit(CAN1, ...

要啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 06:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表