查看: 4002|回复: 9

[求助] KEA128CAN发送缓冲区已满问题

[复制链接]

该用户从未签到

2

主题

8

帖子

0

新手上路

Rank: 1

积分
28
最后登录
2017-9-21
发表于 2017-9-7 17:21:22 | 显示全部楼层 |阅读模式
最近在用KEA128写CAN程序时,总遇到发送缓冲区已满问题,代码如下:
        if(PIT_10ms)
        {                       
                                for(bID_Switch=0;bID_Switch<CANIF_INIT_NUMBER_OF_STATIC_CANTXPDUIDS;bID_Switch++)
                                {
                                        if (com_TxPduTbl[bID_Switch].Timer > COM_TX_CYCLE_TIME)
                                        {
                                                com_TxPduTbl[bID_Switch].Timer -= COM_TX_CYCLE_TIME;
                                        }         
                                        else
                                        {
                                                com_TxPduTbl[bID_Switch].Timer = com_TxConfig_C[bID_Switch];
                                                for(i=0;i<16;i++)               
                                                {
                                                        adc[i] = adc_value[i];
                                                }                                               
               
                                                switch(bID_Switch)
                                                {
                                                        case CANIF_TX_VLT0_STATIC_MSG:
                                                        {
                                                                sCANTxItemInfo.ID_Type.ID = CanIf_StaticPduTxCfg_C[CANIF_TX_VLT0_STATIC_MSG];   
                                                                sCANTxItemInfo.u32DataLength = 8;     
                                                                sCANTxItemInfo.u8DataBuff[0] = adc[0];   
                                                                sCANTxItemInfo.u8DataBuff[1] = adc[0]>>8;  
                                                                sCANTxItemInfo.u8DataBuff[2] = adc[1];   
                                                                sCANTxItemInfo.u8DataBuff[3] = adc[1]>>8;  
                                                                sCANTxItemInfo.u8DataBuff[4] = adc[2];   
                                                                sCANTxItemInfo.u8DataBuff[5] = adc[2]>>8;  
                                                                sCANTxItemInfo.u8DataBuff[6] = adc[3];   
                                                                sCANTxItemInfo.u8DataBuff[7] = adc[3]>>8;

                                               
                                                                sCANTxItemInfo.u8BPR = 0x80;            
                                                                CAN_SendItemToBuffer(MSCAN,&sCANTxItemInfo,&sCAN_TxBuff);  
                                                                CAN_CheckSendBufferFrame(MSCAN,&sCAN_TxBuff);  
                                                        }

                                                        default:
                                                                bID_Switch = 0;
                                                        break;
                                                }
                                        }        //if
                                }                //for                        
                                PIT_10ms = 0;
                        }


                               for(i=0;i<16;i++)
                                {
                                        if((i!=2)&&(i!=3))
                                        {
                                                adc_value[i]=ADC_Read(i);                                         
                                        }                                                                                       
                                }       
在将adc_value的值赋值给 sCANTxItemInfo.u8DataBuff[0]后,在发送过程中,总是出现发送缓冲区已满的问题;
而如果不将adc_value的值赋给 sCANTxItemInfo.u8DataBuff[0],而是将数值常量赋值给 sCANTxItemInfo.u8DataBuff[0],则不会有此问题。
不知道大家有没有遇到过这种问题?又是怎么解决的?
我知道答案 目前已有9人回答
回复

使用道具 举报

该用户从未签到

2

主题

8

帖子

0

新手上路

Rank: 1

积分
28
最后登录
2017-9-21
 楼主| 发表于 2017-9-8 08:31:08 | 显示全部楼层
没人回答啊,是不是我讲的不清楚?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2018-11-15 16:18
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    16

    主题

    259

    帖子

    3

    高级会员

    Rank: 4

    积分
    993
    最后登录
    2023-1-6
    发表于 2017-9-8 08:37:48 | 显示全部楼层
    话说你在发送前有没有检查有没有空的发送缓冲器?也许那3个发送缓冲器被数据填满了,但在总线上堵塞着一直卡在缓冲器里,你自然也无法再添加新的数据进发送缓冲器的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2017-9-21
     楼主| 发表于 2017-9-8 08:51:56 | 显示全部楼层
    是的,就是你说的这种情况。
    但是现在还在调试阶段,我发报文的频率也不高,也没有接收报文,不应该出现堵塞的情况,并且每次堵塞都赌很久。
    更重要的是,我直接将数值常量赋值给sCANTxItemInfo.u8DataBuff的时候,不会发生这种状况。
    但是把adc_value的数值赋值给sCANTxItemInfo.u8DataBuff的时候,会以很高的频率出现堵塞。
    我实在是想不通原因
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2017-9-21
     楼主| 发表于 2017-9-8 08:52:45 | 显示全部楼层
    CAN_SendItemToBuffer(MSCAN,&sCANTxItemInfo,&sCAN_TxBuff);  
    CAN_CheckSendBufferFrame(MSCAN,&sCAN_TxBuff);  

    这两个程序都是用的原厂demo里的程序
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25442
    最后登录
    2025-9-4
    发表于 2017-9-8 09:55:30 | 显示全部楼层
    太极鱼 发表于 2017-9-8 08:51
    是的,就是你说的这种情况。
    但是现在还在调试阶段,我发报文的频率也不高,也没有接收报文,不应该出现堵 ...

    楼主你好!
    你这样,你先发一条,和接收一条试试。
    最起码要保证你单条发送没有问题。然后再调试多条发送的。
    在多条发送的时候,你要保证,你间隔时间内发送的时间,要大于你一桢数据发送的时间。
    另外,我建议你看看我们官方的KE06 CAN驱动,里面可以一直发送和接收的。
    你可以参考下如下两篇文章:
    1. 手把手学会官方例程第三十篇:KE06 MSCAN_node1_demo例 ...

    2. 使用KE驱动库中KE06 CAN Demo的遇到几个问题和说明
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-12-23 09:57
  • 签到天数: 1587 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    5

    主题

    3048

    帖子

    23

    金牌会员

    Rank: 6Rank: 6

    积分
    8419
    最后登录
    2025-9-1
    发表于 2017-9-8 10:01:55 | 显示全部楼层
    记得好像寄存器例程是有bug的,如果不用CAN driver package的话。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2017-9-21
     楼主| 发表于 2017-9-8 10:03:06 | 显示全部楼层
    我的程序就是在您提供的demo程序基础上做出来的。
    发送的时间没有问题,周期为500ms,共发送四帧报文,每帧报文的间隔为10ms,没有接收数据。
    若是像demo程序里一样,直接将数值常量赋值给sCANTxItemInfo.u8DataBuff,不会有问题,但稍微修改一下,将adc_value中的数值赋值给sCANTxItemInfo.u8DataBuff,就会出现堵塞的问题。
    这个问题已经困扰我好几天了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2017-9-21
     楼主| 发表于 2017-9-8 10:06:35 | 显示全部楼层
    例程是有bug的,我调试的时候就发现了,并且也修改过来了。
    我用的是扩展帧,若是只发送,上面提到的bug都没有影响
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2017-9-21
     楼主| 发表于 2017-9-8 10:08:29 | 显示全部楼层
    kea128的mscan模块跟飞思卡尔的S12X系列是兼容的,我将之前S12X系列很成熟的can程序移植上去,有发送缓冲区堵塞的问题,这才尝试着用官方的demo例程,结果例程也有这个问题
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 05:35 , Processed in 0.108092 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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