5401|1

375

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LM3S CAN FIFO模式下的数据收发 [复制链接]

        自己的一点见解 希望得到坛友们指点 

      CAN 在FIFO模式进行报文收发时,需对FIFO结构中除了优先级最低的所有报文对象设置标志 MSG_OBJ_FIFO(MsgObjectRx.ulFlags |= MSG_OBJ_FIFO;),以表明这在调用的报文对象在FIFO结构中且不是最后一个。

         程序中需考虑在运行时,接收和发送操作的时间先后顺序,发送FIFO须在接收FIFO接收完毕之后启动报文发送,两次发送之间。

         在单个或多个报文对象的报文收发时,每一次报文收、发过程都是由单个报文对象完成。而FIFO模式每次的报文收、发过程是由结构中所有报文对象参与。

 

//************发送FIFO**********************


// 为CAN控制器配置的FIFO的大小
#define CAN_FIFO_SIZE         64

 

// 发送字节数
unsigned long  BytesTransmit;

   

tCANMsgObject MsgObjectTx;

 

//定义缓冲区
unsigned char pucBufferTx[CAN_FIFO_SIZE];

 

 

 

// 该函数配置了发送FIFO并将数据拷贝到FIFO中
int   CANTransmitFIFO(unsigned char *pucData, unsigned long ulSize)
{
    int i;

 //配置发送报文对象
    MsgObjectTx.ulMsgID = 8;
    MsgObjectTx.ulMsgIDMask = 0;
    MsgObjectTx.ulFlags = MSG_OBJ_TX_INT_ENABLE;

 

    // 将8个报文对象构成一个发送FIFO
    for(i = 0; i < 8; i++)
    {

        //如果还有多于8字节的数据待发送,则用满报文形式发送8字节
        if(ulSize > 8)
        {

            MsgObjectTx.ulMsgLen = 8;
            MsgObjectTx.pucMsgData = &pucData[iIdx * 8];

 

                   // 设置标志 MSG_OBJ_FIFO 来表明这个报文对象为FIFO结构中的一部分,且不是FIFO的最后一个报文对象
                   MsgObjectTx.ulFlags |= MSG_OBJ_FIFO; 

 

                    ulSize -= 8; 


                    CANMessageSet(CAN0_BASE, i + 1, &MsgObjectTx, MSG_OBJ_TYPE_TX);
        }

        // 如果还是有少于8字节待发送数据,则发送剩余数据, 
        // 且清除标志 MSG_OBJ_FIFO 以表明这是最后一个在FIFO中的报文对象
        else
        {
            MsgObjectTx.ulMsgLen = ulSize;
            MsgObjectTx.pucMsgData = &pucData[iIdx * 8];

            CANMessageSet(CAN0_BASE, i + 1, &MsgObjectTx, MSG_OBJ_TYPE_TX);
        }
    }
    return(0);
}

 

 

// 主程序
int  main(void)
{

 

     ······  

 

 

    //初始化数据缓冲区
    for(j= 0; j< CAN_FIFO_SIZE; j++)
    {
        pucBufferTx[j] = j + 0x1;
    }

 

    //为已发送字节数变量赋初值
    BytesTransmit = 0;

 

    //配置发送FIFO,并启动发送
    CANTransmitFIFO(pucBufferTx, CAN_FIFO_SIZE);

    //
    // Loop forever.
    //
    while(1)
    {
   
   //等待所有的数据发送完毕                              
   if(BytesTransmit == CAN_FIFO_SIZE)
   {
       
    //复位该变量    
    BytesTransmit = 0;
    
    //LED指示    延时长以确保接收fifo接收完毕
    ······     

             
    //更改缓冲区中的数据
      ······ 

 

    //配置发送FIFO,并启动发送
    CANTransmitFIFO(pucBufferTx, CAN_FIFO_SIZE);
    }            
    }
}

 

 

//******************接收FIFO***************

 

//分配给CAN控制器的FIFO的大小
#define CAN_FIFO_SIZE           64

 

tCANMsgObject MsgObjectRx;

 

//定义一接收缓冲区
unsigned char Buffer[CAN_FIFO_SIZE];

 

//定义接收字节数变量
unsigned long BytesRemain;

 

 

// 该函数配置接收FIFO, 且该函数只会被调用一次
int   CANReceiveFIFO(unsigned char *pucData, unsigned long ulSize)
{
    int j;


    // 配置接收报文FIFO,标识符 8,报文滤波 无,使能接收中断
    MsgObjectRx.ulMsgID = 8;
    MsgObjectRx.ulMsgIDMask = 0;
    MsgObjectRx.ulFlags = MSG_OBJ_RX_INT_ENABLE;
    MsgObjectRx.pucMsgData = pucData;

 

    // 将1~8号报文对象构成一个接受FIFO
    for(j=0; j < (CAN_FIFO_SIZE / 8); j++)
    {
  
           //若待接收字节数超过8,则将一次接收字节数设置为8
           if(ulSize > 8)
           {
   
                         MsgObjectRx.ulMsgLen = 8;

             
                         ulSize -=8;


                          //设置标志 MSG_OBJ_FIFO 来表明这个报文对象为FIFO结构中的一部分,且不是FIFO的最后一个报文对象
                          MsgObjectRx.ulFlags |= MSG_OBJ_FIFO; 

   
                          CANMessageSet(CAN0_BASE, j + 1, &MsgObjectRx, MSG_OBJ_TYPE_RX);

           }
           else
           {
            MsgObjectRx.ulMsgLen = ulSize;

            // 这里不设置标志 MSG_OBJ_FIFO,表明这是最后一个在FIFO中的报文对象
            CANMessageSet(CAN0_BASE, j + 1, &MsgObjectRx, MSG_OBJ_TYPE_RX);
            }
    }
    return(0);
}

 

 

// 主程序
int main(void)
{

  

      ······


    //复位缓冲区指针
    MsgObjectRx.pucMsgData = Buffer;

 

    //将待接收的数据字节总数赋给该变量
    BytesRemain = CAN_FIFO_SIZE;

 

    //配置接收FIFO,并启动报文接收
    CANReceiveFIFO(Buffer, CAN_FIFO_SIZE);

    //
    // Loop forever.
    //
    while(1)
    {
              
               //等待所用的数据接收完毕
                if(BytesRemain == 0)
                {

                      // 复位缓冲区指针
                      MsgObjectRx.pucMsgData = Buffer;

 

                      //复位该变量
                      BytesRemain = CAN_FIFO_SIZE;

 

                      //LED指示  延时短以确保在发送FIFO发送前接收完毕

                      ······

                 }         
    }
}

 

 

基于LM3S8962  FIFO模式下报文收发例程                                  

[ 本帖最后由 熊猫 于 2011-3-5 16:23 编辑 ]

CAN_FIFO收发例程.rar

743.73 KB, 下载次数: 443

最新回复

好贴 ,顶!  详情 回复 发表于 2011-3-6 21:11
 
点赞 关注

回复
举报

918

帖子

0

TA的资源

纯净的硅(中级)

沙发
 

回复 楼主 熊猫 的帖子

好贴 ,顶!
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表