首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]9S12的CAN通信问题

[求助]9S12的CAN通信问题

我的CAN发送程序如下:

UINT8 u8CAN_SendFrame(UINT32 u32ID, UINT8 u8Prio, UINT8 u8Length, UINT8 *u8TxData)
{
/* Transmission buffer */
UINT8 u8TxBuffer = {0};

/* Index to data within the transmission buffer */
UINT8 u8Index;

if (!CAN0TFLG) /* Retrun if Transmit Buffer is full */
return ERR_BUFFER_FULL;

CAN0TBSEL = CAN0TFLG; /* Select lowest empty buffer */
u8TxBuffer = CAN0TBSEL; /* Backup selected buffer */


*((UINT32 *) ((UINT32)(&CAN0TXIDR0)))= u32ID; /* Load Id to IDR Registers */

/* Load data to Data Segment Registers */
for (u8Index=0;u8Index<u8Length;u8Index++) {
*(&CAN0TXDSR0 + u8Index) = u8TxData[u8Index];
}

CAN0TXDLR = u8Length; /* Set Data Length Code */
CAN0TXTBPR = u8Prio; /* Set Priority */

CAN0TFLG = u8TxBuffer; /* Start transmission */

while ( (CAN0TFLG & u8TxBuffer) != u8TxBuffer);/* Wait for Transmission completion */

return NO_ERR;
}
问题:1。当发送不成功时,也就是CAN0TFLG相应的位没有被置位,程序就会在while ( (CAN0TFLG & u8TxBuffer) != u8TxBuffer);

处进入死循环,那么此时CAN控制器是会将报文重新发送呢,还是一直在等待对方的ACK回应呢?

2。还有,我检查了控制器中的CAN同步寄存器位,发现它为未同步状态,可之前初始化时是同步成功的啊,为何会出错呢?

谢谢指点,急求解答

和头像眼睛一样大:)

没有人能帮帮忙吗 ,自己顶一下

和头像眼睛一样大:)
你是不是就空发,没有接接收器?
我以前用示波器量过,这种情况下会一直在发送好像。没有仔细看CAN的标准,我记得是这样的。
返回列表