完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用的是基于芯片AT32F403ACCT7创建的RTT项目,用的can_sample例程,发现在控制台发送can_sample后控制台就会卡住 Debug发现是卡在了_can_sendmsg中的发送判断里 然后发现循环中i的值很奇怪 应该是从0开始计数到ffff就会结束,但这里它的初值直接就是超过ffff的,导致程序一直卡在这里,是被哪里改掉的呢,整个项目只使能了can,修改了外部时钟,加入了can_sample例程,其余未有改动 |
|
相关推荐
5个回答
|
|
CAN通信是基于硬件连接的,如果没有接CAN设备,那发送时是会卡死在这里的。
|
|
|
|
但是i计数到0xffff就会跳出这个循环吧,我看到i直接变成了一个大于0xffff的值,注意是第一次执行到这个循环的时候就是了,并不是从0开始计数的
|
|
|
|
static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
{ struct CAN_Handler *hcan; hcan = &((struct at32_can *) can->parent.user_data)->CanConfig; struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; CanTxMsg TxMessage; rt_uint32_t i; /* Check the parameters */ RT_ASSERT(IS_CAN_DLC(pmsg->len)); /*check select mailbox is empty */ switch (1 << box_num) { case CAN_TX_MAILBOX0: if ((hcan->Instance->TSTS & CAN_TSTS_TSME0) != CAN_TSTS_TSME0) { /* Return function status */ return -RT_ERROR; } break; case CAN_TX_MAILBOX1: if ((hcan->Instance->TSTS & CAN_TSTS_TSME1) != CAN_TSTS_TSME1) { /* Return function status */ return -RT_ERROR; } break; case CAN_TX_MAILBOX2: if ((hcan->Instance->TSTS & CAN_TSTS_TSME2) != CAN_TSTS_TSME2) { /* Return function status */ return -RT_ERROR; } break; default: RT_ASSERT(0); break; } if (RT_CAN_STDID == pmsg->ide) { TxMessage.IDT = CAN_ID_STD; RT_ASSERT(IS_CAN_STDID(pmsg->id)); TxMessage.StdId = pmsg->id; } else { TxMessage.IDT = CAN_ID_EXT; RT_ASSERT(IS_CAN_EXTID(pmsg->id)); TxMessage.ExtId = pmsg->id; } if (RT_CAN_DTR == pmsg->rtr) { TxMessage.RTR = CAN_RTR_DATA; } else { TxMessage.RTR = CAN_RTR_REMOTE; } /* Set up the DLC */ TxMessage.DLC = pmsg->len & 0x0FU; /* Set up the data field */ TxMessage.Data[0] = (uint32_t)pmsg->data[0]; TxMessage.Data[1] = (uint32_t)pmsg->data[1]; TxMessage.Data[2] = (uint32_t)pmsg->data[2]; TxMessage.Data[3] = (uint32_t)pmsg->data[3]; TxMessage.Data[4] = (uint32_t)pmsg->data[4]; TxMessage.Data[5] = (uint32_t)pmsg->data[5]; TxMessage.Data[6] = (uint32_t)pmsg->data[6]; TxMessage.Data[7] = (uint32_t)pmsg->data[7]; CAN_Transmit(hcan->Instance, &TxMessage); while((CAN_TransmitStatus(hcan->Instance, box_num) != CANTXOK) && (i != 0xFFFF)) { i++; } return RT_EOK; } |
|
|
|
i 需要赋初值 0 吧
|
|
|
|
是的,不赋初值,出现了随机数。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
565 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2147 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1211 浏览 0 评论
1741 浏览 0 评论
1454 浏览 0 评论
74786 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:28 , Processed in 0.941800 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号