关于LM3S2B93 的CAN 使用问题



我在做LM3S2B93的CAN通讯的时候,出现如下两个错误:

用最新的库:driverlib.a

Error[Li005]: no definition for "CANRegRead" [referenced from E:\CAN\Debug\Obj\my_can.o]

Error[Li005]: no definition for "CANRegWrite" [referenced from E:\CAN\Debug\Obj\my_can.o]

这种情况下:CANRegRead,CANRegWrite不能正常调用 GPIOPinConfigure能正常调用。

但用老的库函数:driverlib3223.a

Error[Li005]: no definition for "GPIOPinConfigure" [referenced from E:\CAN\Debug\Obj\my_can.o]

这种情况下: GPIOPinConfigure不能正常调用。CANRegRead,CANRegWrite能正常调用

奇了怪了。。。

我用的是 IAR6.21 的编译器。

请帮忙协助解决下哪。

  • 建议采用最新的库。

    请参考驱动库User's Guide的CAN API

    www.ti.com/.../spmu019k

  • 请检查一下IAR编译环境中或者代码中头文件是否都已经正确包括。

    另外头文件的顺序是否正确。

    GPIOPinConfigure出错你看一下是否包括头文件gpio.h。

    我觉得这个和驱动库的关系不大,不论老的驱动库还是新的驱动库肯定都是兼容的。

    如果方便的话你可以把相关代码和截图发上来,这样更容易分析问题。

    另外作为调试,个人建议不要使用库,直接调用库函数,这样你可以单步跟踪调试,进一步了解代码执行的情况。

  • Jessica,

       在最新的驱动库中搜不到CANRegRead,CANRegWrite这两个函数,我查看驱动库can.c中关于这两个函数的源代码发现是如下定义的:

    static void

    CANRegWrite(unsigned long ulRegAddress, unsigned long ulRegValue)

    {

       volatile int iDelay;

       //

       // Trigger the initial write to the CAN controller.  The value will not make

       // it out to the CAN controller for CAN_RW_DELAY cycles.

       //

       HWREG(ulRegAddress) = ulRegValue;

       //

       // Delay to allow the CAN controller to receive the new data.

       //

       for(iDelay = 0; iDelay < CAN_RW_DELAY; iDelay++)

       {

       }

    }

    这两个函数是内部的,所以使用驱动库调用这两个函数是会出错的。

    看看你的程序中能不能用其他函数替代,实在不行就将这两个函数加到你自己的源文件中

  • 确实如鸵鸟蝈蝈所言,CANRegRead和CANRegWrite声明为static,只能在can.c中引用。比较老的驱动库我手头上也没有,从这两个函数注释中可以看到原有的CANReadReg和CANWriteReg API已经被这两个新的API替换掉了。

    不知道你调用这两个函数做什么用,是想向CAN总线上读写数据吗?那可以使用已经封装的API CANMessageSet和CANMessageGet,这两个API中分别调用了CANRegWrite和CANRegRead。

    另外还是建议在调试过程中不要使用驱动库,只是直接调用API,这样你可以更清晰的了解到底层代码执行的过程。如果你用驱动库,在IAR中是不能STEP INTO到驱动API中的。

  • Hi Jessica,

    driverlib.a是TI StellarisWare的驱动库,针对每个版本的库都会有相应的说明手册,列出了所有的API接口,如

    SW-DRL-UG-4423.pdf

    SW-DRL-UG-7611.pdf

    SW-DRL-UG-8034.pdf

     

     

    在设计程序的时候,可以用的函数都在这些说明手册里面列出来了,调用以外的函数都不在driverlib这个库里面,如果没在别处定义的话,编译当然会出错的。所以请尽量以手册为准。

    附件中是最新版本的手册,建议你也把StellarisWare升级到最新版。

    SW-DRL-UG-8034.pdf