完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛扫一扫,分享给好友
|
本帖最后由 一只耳朵怪 于 2018-5-25 17:30 编辑
RM48L952 可以用CAN中断的方式接收数据, 我想用DMA的方式接收CAN数据. 有没有好的方法和例程.. |
|
相关推荐
44个回答
|
|
lining870815844 发表于 2018-5-25 10:29 Hi Ken, 谢谢你的回复,看了例程后,有两个疑问具体如下: 1. DMA中断接收数据, 为什么在这里要用CAN中断, 难道为了中断接收每个Message ID, 采用CAN 中断? 能否在DMA的中断处理函数里去处理将IF3中更新的数据搬运到RAM里面? 2. 此函数功能 dmaConfigCtrlRxPacket((uint32)(&(canREG1->IF3DATx[0])), (uint32)(&RX_DATA1),1); 应该是RX_DATA1 这个buffer 这与IF3 建立地址关系, 怎么也能与RX_DATA2, RX_DATA3 建立地址访问关系? 估计我对CAN DMA理解有点问题。。请回复。谢谢。。 |
|
|
|
|
60user25 发表于 2018-5-25 11:01 sam, 首先这个只是个例程,实现的功能是发送不同的ID的CAN报文信息,然后通过DMA去接收。这里有可能和你期望的功能有点出入,不过没关系。你可以按你自己的想法来。具体的回答你参考下面的信息: 1. DMA中断接收数据, 为什么在这里要用CAN中断, 难道为了中断接收每个Message ID, 采用CAN 中断? 能否在DMA的中断处理函数里去处理将IF3中更新的数据搬运到RAM里面? 我这里采用CAN中断主要是为了更新DMA的中断地址,这样方便讲不同的报文信息放到不同的RAM区间。如果你不要这样操作的话,大可把这个中断禁用掉。只用给一个源地址和一个终端地址。将IF3的数据搬到RAM里面,DMA自己会去操作,不用在DMA中断里面去做这个动作。你也可以把DMA中断禁用.DMA 的工作就是自己搬用数据,不需要MCU的干预。 2. 此函数功能 dmaConfigCtrlRxPacket((uint32)(&(canREG1->IF3DATx[0])), (uint32)(&RX_DATA1),1); 应该是RX_DATA1 这个buffer 这与IF3 建立地址关系, 怎么也能与RX_DATA2, RX_DATA3 建立地址访问关系? 确实每个DMA操作只能对应一个源地址和一个终端地址。我这里的操作时要实现不同的源地址对应不同的终端地址,所以才会在CAN中断程序里面更改终端地址,这样方便讲不同的CAN 报文分开存放。就像上面描述的一样,你的程序完全可以用一个源,一个终端。 不知道这样解释,你能不能接受。如果还有疑惑的,欢迎提出。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 11:15 Hi Ken, 谢谢你的回复及例程, 经过测试程序OK,今天不知道怎么回事,在办公室不能发帖(就是回帖时,帖子内容下写不了字)。 还有问题就是: 1.在测试过程中发现这个函数为软触发 dmaSetChEnable(DMA_CH0, DMA_SW) 如果要接收一次DMA数据,必须进行一次软触发,有了这次软触发后,DMA也能进入中断. 没有软触发的话, DMA是进入不了中断处理函数的,现在就有个实际问题: a)如果一台主设备与多台从设备进行CAN通讯时, 主设备就发一条消息找从设备要数据, 这是从设备全部要回多条数据给主设备,如果只用DMA来接收数据,(不采用CAN中断模式), 用软触发方式来接收数据的话就比较麻烦(在不知道从设备有多少台的情况下, 需要连续软触发多少次?). 之前一次认为DMA有新数据后,会触发DMA中断,但是没有这种情况(不知道对这个理解是否有误,这是测试得来的结论)。 b).什么情况下需要用到dmaSetChEnable(DMA_CH0, DMA_HW) 硬件触发? c) 关于a的问题有没有更好的处理办法? 请回复 谢谢! |
|
|
|
|
60user25 发表于 2018-5-25 11:29 sam, 如果你用软件触发DMA的话,确实需要每次触发,才能进DMA中断。这个就是软件触发的一个特点。它是的DMA运行的时间可控,但是带来的不便就是需要每次去触发它。 a)如果一台主设备与多台从设备进行CAN通讯时, 主设备就发一条消息找从设备要数据, 这是从设备全部要回多条数据给主设备,如果只用DMA来接收数据,(不采用CAN中断模式), 用软触发方式来接收数据的话就比较麻烦(在不知道从设备有多少台的情况下, 需要连续软触发多少次?). 之前一次认为DMA有新数据后,会触发DMA中断,但是没有这种情况(不知道对这个理解是否有误,这是测试得来的结论)。 如果不采用CAN中断模式更改终端地址的话,你的程序里面有没有设置相关的区分各个从设备发过来的数据呢。因为你是主设备类似发一个广播报文,然后每个从设备都回复,除非你事先都设好他们的ID,也就是说设定他们的报文优先级。不然你在主设备端很难区分收到了那个从设备的数据。或者还有一种办法就是在报文数据的第一个字节设定一个类似ID的数据,这样比较好区分。缺点就是牺牲了总线报文的有效数据长度。 b).什么情况下需要用到dmaSetChEnable(DMA_CH0, DMA_HW) 硬件触发? 用硬件触发,完全能解决你不想每次启动DMA的操作需求。硬件的DMA是在CAN总线的IF3收到数据后,会自动的触发DMA的转换,不需要CPU再去干预,使能DMA的操作。如果要使用dmaSetChEnable(DMA_CH0, DMA_HW)的话,你需要设置好DMA和CAN模块之间的相应设置。比如,DMAchannel, request line之类的。 c) 关于a的问题有没有更好的处理办法? 参考上面的回复。 所以说你现在需要做的是,试试DMA硬件触发的功能。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 11:39 sam, 刚做了一个CAN模块硬件触发DMA的实例,经过测试能正常工作。 这个应该能满足你所有的需求了。你参考一下试试看: 谢谢 BR, KEN |
|
|
|
|
|
Hi Ken, 谢谢你的回复及例程, 测试OK,DMA硬件触发可以运行.. 还有问题: 1. CAN总线有数据进来, DMA自动会硬件触发, 将接收到数据转移的RAM空间..这里想问, DMA在收到数据后有没有一个回复机制(如DMA其他寄存器有标志位),从而能保证CAN总线数据更有效的接收? 如下第2个问题. 2.如将DMA 32个通道全部开启来接收CANBUS发过来的数据..假如32个从设备同时各发一条 8byte数据. 让主设备的32个DMA通道一一对应来接收(一个通到负责一条消息)..此时DMA肯定有优先级来依次接收每一条数据. 现在想问硬件是否有种机制来保证32条DMA 都有收到消息..不会出现漏消息或空消息的情况...如果出现漏消息, 硬件是否有种回复机制(如反映到寄存器上的标识位?) 3.以上两个问题其实可以合并成一个问题. 不知道我的意思有没有表达清楚. 请回复... |
|
|
|
|
|
sam, 2.如将DMA 32个通道全部开启来接收CANBUS发过来的数据..假如32个从设备同时各发一条 8byte数据. 让主设备的32个DMA通道一一对应来接收(一个通到负责一条消息)..此时DMA肯定有优先级来依次接收每一条数据. 现在想问硬件是否有种机制来保证32条DMA 都有收到消息..不会出现漏消息或空消息的情况...如果出现漏消息, 硬件是否有种回复机制(如反映到寄存器上的标识位?) 首先CAN总线发送报文不是一起发送的,每次总线上面只有一个优先级最高的报文发送,这样的话,接收端也是一个个报文接收的。这样就比较难出现你描述的32个从设备一起发送报文的情况。另外在CAN里面有报文状态寄存器可以查报文是发送成功刚还是pending状态。同时在DMA模块中也有类似的状态寄存器可以查询,看DMA是否传输完成,还是说是在等待传输。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 12:17 Ken, 能否直接 告诉我DMA哪个寄存器可以查询,DMA是否传输完成,还是在等待.. 今天主设备RM48L952 CAN与从设备进行通讯. 主设备会发一个8 Byte数据(如: TX_DATA1[8] = [0xF1, 0xF2, 0xF3, 0xF4 ,0xF5 ,0xF6 ,0xF7, 0xF8]), 从设备会回3byte 数据(假如从设备会回0x55, 0x00, 0x00).. 主设备通过DMA中断来接收从设备的数据(主设备接收buffer定义 RX_DATA1[8] = [0] ), 但是发现一个问题: 主设备接收到的数据为: RX_DATA1 = [0xF1, 0xF2, 0xF3, 0xF4 ,0xF5 ,0xF6 ,0xF7, 0xF8], 发现发过去的数据与接收的数据一样,但是从设备回的数据呢?。。求解.. 请回复,谢谢。。 |
|
|
|
|
60user25 发表于 2018-5-25 12:31 Sam, 寄存器就是我们DMA的channel channel register。在我们的DMA.c里面也有关于判断DMA发送或接受的状态的函数,你可以仔细看一下。 另外你描述的DMA接收到发送出去的数据,我觉得很有可能是因为你设置IF3更新的时候,设置更新的messagbox有问题,有可能设成了接收数据的messagebox了。 如果没有设错的话,你可以单步调试程序,或设置断点来查看接收端的buffer,看是否接收到数据。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 12:49 Ken, 今天的测试例程均是依照上两次你发给我的例程.. 关于主设备CAN1, messagebox1 配置的是发送, messagebox2设置的接收.. 对于“设置IF3更新的时候,设置更新的messagbox有问题,有可能设成了接收数据的messagebox了。”我不是很明白..请详细说明。。 我用过单步调试,设置断点的方法调试过。仍然主设备CAN1接收不到从设备发过来的数据.反而自己接收了自己发送的数据。。。 |
|
|
|
|
60user25 发表于 2018-5-25 13:03 Ken, 还有个奇怪的问题就是, 如果主设备CAN1不采用发数据到从设备,从设备回数据的,主设备再接收从设备回的数据这种模式。。 而采用主设备CAN1不发送任何数据仅通过DMA中断方式直接收从设备不断发过来的数据. 这样的模式. 主设备是可以准确接收从设备数据。。 对于“设置IF3更新的时候,设置更新的messagbox有问题,有可能设成了接收数据的messagebox了。“这两次测试对于IF3的messagebox 没有做任何改变和处理。。 |
|
|
|
|
60user25 发表于 2018-5-25 13:03 sam, 关于“设置IF3更新的时候,设置更新的messagbox有问题,有可能设成了接收数据的messagebox了”的意思是说: 因为你这里采用的是IF3来触发DMA的操作,IF3是在CAN总线通信的过程中将IF1或IF2发送和接收的数据,同步更新到它的数据区域里面来。这里面可以通过设置IF3UEy寄存器来选择你需要同步更新的messagebox。你需要注意的是,你这个寄存器设置成了更新哪几个messagebox,这些messagebox对应的是你发送还是接受的操作。只有这样才能准确的实现硬件触发DMA的发送操作还是DMA的接收操作。 鉴于你收到了你发送出去的数据,我觉得你应该是这个问题上面出了差错。你可以检查一下。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 13:24 sam, 还有一个测试的方法,就是用IF1或是IF2来触发DMA的操作。一般在我们的DCAN模块里面,IF1和IF2会交替使用,一个发送一个接收,类似于乒乓操作。你可以单独选择IF1或IF2,或者是用IF1触发DMA的自动发送,用IF2触发DMA的自动接收。这些都是可以编程实现的。当然,用IF1或是IF2,关于ID符的提取,就会比较难操作了。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 13:41 Ken Wang, 如你所说IF3UEy 对应接收的messagebox 设置有问题, 更改正确的messagebox后, 从设备可以接受到正确数据.. 还有些问题: 1. 能否 通过DMA发送CAN 数据? 2.怎样使用DMA 32 通道去接收数据? CAN DMA接收数据基本上会对应一个IF3DATx 的源地址? 难道一个源地址对应32个通道, 使用32通道接收数据,需要不对切换通道?? 是否我的理解有问题? 3.DMA接收从设备数据能否直接通过DMA register 知道从设备ID, 难道非要通过CAN中断的方式接收ID ?? |
|
|
|
|
60user25 发表于 2018-5-25 13:49 sam, 1. 能否 通过DMA发送CAN 数据? 可以,就像我前面说的,你可以通过IF3更新发送端的messagebox来触发DMA,或使用IF1来触发DMA。 2.怎样使用DMA 32 通道去接收数据? CAN DMA接收数据基本上会对应一个IF3DATx 的源地址? 难道一个源地址对应32个通道, 使用32通道接收数据,需要不对切换通道?? 是否我的理解有问题? 首先你用32个通道都去接收数据的话,每个通道都有自己的ID,有自己的优先级,每次总线上只有一个报文的传输。对应于IF3来说,你需要将它设置成更新所有的接收通道。当通道里有数据来了,它就会自动更新数据到他的buffer里面,同时也会触发DMA进行操作。关键的地方是,你需要确定DMA传输的时间和你的每个通道发送报文之间的间隔时间是否匹配,不然会出现DMA pending或是DCAN pending的状况。 3.DMA接收从设备数据能否直接通过DMA register 知道从设备ID, 难道非要通过CAN中断的方式接收ID ?? DMA没有那个功能知道CAN的ID,因为CAN控制器在接收数据的时候,已经进行了解包操作,把相应的ID和数据分离出来了,IF3更新的数据到buffer里面,然后出发DMA。对于DMA来说,它操作的只是数据,没有任何识别ID的功能。 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 13:56 sam, 好奇的问一下,你们公司是在哪个城市啊?你用我们的芯片,有相应的工程师支持你们不。 理论上不论是我们的代理商还是我们的FAE,都会有人帮你解决问题的啊。嘿嘿! 谢谢 谢谢 BR, KEN |
|
|
|
|
lining870815844 发表于 2018-5-25 14:08 Ken, 我们是公司在澳门, 现在选用你们的芯片, 目前没有你们的技术支持。。 这样很好啊。。 |
|
|
|
|
lining870815844 发表于 2018-5-25 13:56 Ken Wang, DMA每个通道发送报文速度太快, 就是间隔时间不匹配,出现了DMA pendding 后, DCAN 会不死掉,如果死掉, DCAN 有没有软件RESET 机制? |
|
|
|
|
|
sam, 原来是澳门的公司,好吧。 我们的论坛还是挺不错的,能帮到很多客户解决问题。 谢谢 BR, KEN |
|
|
|
|
60user25 发表于 2018-5-25 14:33 sam, DMA的速度很快,如果时间间隔不匹配,应该是出现DCAN报文信息的pending。不过,这个情况还好,因为你是每个不同的messagebox对应一个从设备,不容易造成CAN报文信息的覆盖或丢失。 CAN总线pending,不会down掉,这个不用太担心。 谢谢 BR, KEN |
|
|
|
|
只有小组成员才能发言,加入小组>>
550 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1514 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1338 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1757浏览 29评论
2783浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1724浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 17:37 , Processed in 0.942059 second(s), Total 80, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2937