完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 一只耳朵怪 于 2018-5-25 17:02 编辑
大家好, 在调can时初始化后通过while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX2))循环判断是否收到数据,然后在这个循环中把接收到的数据再发走,用的是不同的canMESSAGE_BOX收发。测试中通过测试工具发出数据,单片机能接收,且接收后又能发出来。但第二次开始用测试软件给单片机发数据就不行了,显示发送失败,这是什么原因呢?是需要清除什么标志位还是什么的? |
|
相关推荐
11个回答
|
|
第二次是指发送成功数据以后继续发一帧数据。后来再连续给单片机发数据都不行了
|
|
|
|
Ray, 可以这样,既然你有测试工具,你可以将它也挂在CAN总线上,监听一下总线上的信息,看看你第二次软件发出来的报文是怎么样的?报文ID和接收端的message BOX设置是否一样。 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-5-25 10:48 Ken, 感谢您的回复!报文ID和接收端设置的ID等是一样的。可能我表达的意思不清楚。我的意思就是我通过上位软件连续两次或者三次。。给单片机发同样数据,只有第一次发给单片机后,单片机相应了,发出了报文,上位软件也收到了它发的,第2次,3次。。后面的就收不到单片机反馈了,具体代码如下, while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX2)); [ canGetData(canREG1, canMESSAGE_BOX2, tx_data); canTransmit(canREG1, canMESSAGE_BOX1, tx_data); ]是不是需要做延时什么的还是要清具体哪个标志位? 谢谢 |
|
|
|
uwyywjdwe 发表于 2018-5-25 10:53 Ray, 我比较少用查询的方式去接收CAN总线的报文,一般都是用中断的方式来的快捷一些。 印象中没有需要清标志位的操作。你如果单步调试的时候,在第二次或第三次是,程序能跳到while(1)里面去吗?如果不能,。你可以设下断点,查看一下CAN寄存器里面对应的newdata寄存器里面有没有收到你发送的数据。 谢谢 BR, KEN |
|
|
|
Ken, 感谢!我先试着按照您的方法解决下问题再回复。 Ray11 |
|
|
|
Ray, 好的,用中断方式可以了吗 谢谢 BR, KEN |
|
|
|
Ken, 我试了一下中断接收。在使能一个中断的情况下,调用canMessageNotification函数里发送数据是可以的。然后又试了下使能2个接收中断。在一个canMessageNotification函数里写了canGetData(canREG1, canMESSAGE_BOX3, tx_data);canGetData(canREG1, canMESSAGE_BOX2, tx_data);最后再写一个发送函数。用上位机软件测试同时发送2帧ID数据,故意把mailbox3的ID数据放在前面,mainbox2的ID数据放在后面,然后同时发送。结果是mainbox3先收到数据,mainbox2后收到。这是什么原因?mainbox2应该优先的。难道是中断嵌套了? 谢谢 |
|
|
|
uwyywjdwe 发表于 2018-5-25 11:46 Ray, 首先TMS570默认是不支持终端嵌套的,这个放心。其次在CAN总线的协议里面,它是支持无损伤仲裁机制的,也就是说它的优先级是和报文的ID挂钩的。 你可以确定一下你的messagebox2和3对应的ID分别是多少。理论上说是ID越小,优先级越高 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-5-25 11:54 Ken, 谢谢你的解答。但我在手册上多次看到这个:The Message Object 1 has the highest priority, the last message object has the lowest priority,什么情况?断章取义了吗? 谢谢 |
|
|
|
uwyywjdwe 发表于 2018-5-25 12:13 Messagebox的优先级是CAN模块里面自己定义的,CAN ID 的优先级是CAN的协议定义的。这里面有差别。 建议你可以把messagebox值越小的对应设置成ID符最小的。这样就不会有什么问题了 谢谢 BR, KEN |
|
|
|
我想请教一下相关的问题 首先我先贴一下我的测试用例(实现板上can1 发 can2 收)
以下就是测试代码 我用u***can 只能收到can1 发过来的数据 ,我想测试一下 can2 是否收到来自can1的数据 我该怎么做 ,can2 也连了u***can设备 但是它没收到,期间我也做了一些改变,但都结果是 u***can只收到了can1的第一条数据和can2 收到的第一条数据,其他的数据传不过来,我通过中断调试发现 也是一直在while(!canIsRxMessageArrived(canREG2, canMESSAGE_BOX1))这个出不去,刚入坑,希望各位解答一下我的困惑! #include "sys_common.h" #include "system.h" #include "can.h" #include "esm.h" #include "sys_core.h" #define D_COUNT 8 uint32 cnt=0, error =0, tx_done =0; uint8 tx_data[D_COUNT][8] = {0}; uint8 rx_data[D_COUNT][8] = {0}; uint8 *tx_ptr = &tx_data[0][0]; uint8 *rx_ptr = &rx_data[0][0]; uint8 *dptr=0; void dumpSomeData(); void main(void) { _enable_interrupt_(); dumpSomeData(); canInit(); canEnableErrorNotification(canREG1); canEnableErrorNotification(canREG2); for(cnt=0;cnt canTransmit(canREG1, canMESSAGE_BOX1, tx_ptr); //canMessageNotification(canREG1,canMESSAGE_BOX1); //canMessageNotification(canREG2,canMESSAGE_BOX1);//这两句是我在测试过程加的 源程序虽然定义了这个函数但是没有调用 while(tx_done == 0){}; /* ... wait until transmit request is through */ tx_done=0; tx_ptr +=8; /* next chunk ...*/ } tx_ptr = &tx_data[0][0]; rx_ptr = &rx_data[0][0]; for(cnt=0;cnt<63;cnt++) { if(*tx_ptr++ != *rx_ptr++) { error++; /* data error */ } } while(1){}; /* wait forever after tx-rx complete. */ } void dumpSomeData() { uint32 tmp = 0x11; cnt = (D_COUNT*8)-1; dptr = &tx_data[0][0]; *dptr = tmp; while(cnt--) { tmp = *dptr++; *dptr = tmp + 0x11; } } /* can interrupt notification */ /* Note-You need to remove canMessageNotification from notification.c to avoid redefinition */ void canMessageNotification(canBASE_t *node, uint32 messageBox) { /* node 1 - transfer request */ if(node==canREG1) { tx_done=1; /* confirm transfer request */ } /* node 2 - receive complete */ if(node==canREG2) { while(!canIsRxMessageArrived(canREG2, canMESSAGE_BOX1)); canGetData(canREG2, canMESSAGE_BOX1, rx_ptr); /* copy to RAM */ rx_ptr +=8; } /* Note: since only message box 1 is used on both nodes we dont check it here.*/ } |
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
683 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
599 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1054 浏览 1 评论
739 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
524 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
161浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
125浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
126浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
122浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
168浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 20:26 , Processed in 1.008646 second(s), Total 67, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号