This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8301-69M-KIT:CANbus/串行通信

Guru**** 2347070 points
Other Parts Discussed in Thread: CONTROLSUITE, MOTORWARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/587358/drv8301-69m-kit-canbus-serial-communication

器件型号:DRV8301-69M-KIT
主题中讨论的其他器件:controlSUITEMOTORWARE

您好!

我想通过 CANbus 或任何其他串行通信设置速度和 Iq 值。

此外、接收总线电压、电流和电机转速等信息。  

我该怎么做? 我应该从哪里开始?

非常感谢。 此致

高贵。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在使用 CAN 通信提供速度参考方面做了一些工作。  实际上在与您完全相同的硬件上- DRV 8301和 F28069M。 TI 有一个 can.h 文件、但没有可用的.c 文件、我编写了自己的文件。 此外、如果您希望 CAN 与硬件抽象层连接、则还需要修改更多的文件(这会影响其他项目的编译方式)。

    首先、无论实施如何、在 hal.c (HAL_setupGpios)中的 GPIO 初始化中、需要更改/添加以下代码:

    // CAN
    GPIO_setMode (obj->gpioHandle、GPIO_Number_30、GPIO_30_Mode_CANRXA);

    GPIO_setMode (obj->gpioHandle、GPIO_Number_31、GPIO_31_Mode_CANTXA);

    请注意、由于此配置、LED 2 (我认为)将不再亮起。

    其次、无论具体实施情况如何、都需要启用 CAN 外设的时钟(正常的 halal 函数会禁用它):

    在 HAL_setupPeripheralClks 中:

     CLK_disableEscanaClock (obj->clkHandle);更改为 CLK_enableEscanaClock (obj->clkHandle);

    最后、假设您要使用 code composer 进行编译、则需要将创建的 ca.c 文件添加到.project 文件中作为链接。

    如果您想像我一样将其与 HAL 连接、则需要执行以下操作。 其中一些代码可能会被修改为更简化/更高效;我很快地将它们放在一起。

    您需要更改的一些内容包括添加 HAL 函数以接收特定消息(我有一个用于接收 RPM 命令;您可能需要两个用于接收速度/IQ)。 如果您正确设置消息 ID 和数据长度并使用正确的邮箱、您应该能够使用此处的传输功能轻松发送总线电压、电流和电机转速。 您还需要更改位时序配置、以及要用于数据接收/发送的邮箱(此代码使用前16个用于发送、后16个用于接收)。 我没有对本地接受屏蔽或时间戳寄存器执行任何操作;但是代码有对它们的句柄、因此您可以编写 CAN 函数/ hal 函数、以便在需要时使用它们。

    CAN.c:

    您将需要进行的更改:将 CANBTC 寄存器更改为波特率的正确值。

    /*
    
    CAN.c
    
    *
    
    *创建日期:2017年3月21日
    
    * 作者:Adam Manders
    
    */
    
    #include "sw/drivers/ca/src/32b/F28x/f2806x/ca.h"
    #define NELEMS (x)(sizeof (x)/sizeof ((x)[0]))//
    ! \brief 定义允许对受保护的寄存器进行写入(传统)
    //!
    #define EALLOW asm (" EALLOW ")
    
    //! \brief define 允许写入受保护的寄存器
    //!
    #define ENABLE_PROTECTED 寄存器_WRITE_MODE asm (" EALLOW")
    
    //! \brief 定义以禁用受保护的寄存器写入(传统)
    //!
    #define EDIS asm (" EDIS")
    
    //! \brief 定义以禁用受保护的寄存器写入
    //!
    #define disable_protected_register_write_mode asm (" EDIS")
    
    
    //static 变量强制编译器访问正确的数据
    //(用于传输/接收和设置邮箱)
    static int dls[32];
    static int ids[32];
    static uint32_t datal;
    static uint32_t datah;
    static uint32_t-
    static static int-n- static static int-/static static int-/static
    static int-/dape-
    
    
    
    
    
    //初始化函数
    ///---------------
    //设置指针以更正存储器地址
    
    ECAN_REG_Handle CAN_InitECanReg (void *pMemory、const size_t numBytes)//Init ECAN regs
    {
    
    ECAN_REG_Handle canHandle;
    
    //检查以确保大小正确
    (numBytes < sizeof (ECAN_REGS)))
    return ((ECAN_REG_Handle) NULL);
    
    canHandle =(ECAN_REG_Handle) pMemory;
    
    return canHandle;
    }
    
    ECAN_MBOOX_Handle CAN_InitECanMbox (void *pMemory、const size_t numBytes)
    {
    ECAN_MBOOX_Handle canHandle;
    
    //如果
    (numBytes < sizeof (ECAN_MBOXES)))、请检查以确保大小正确
    return ((ECAN_MBOX_Handle) NULL);
    
    canHandle =(ECAN_MBOX_Handle) pMemory;
    
    返回 canHandle;
    }
    
    ECAN_LAM_Handle CAN_InitECANLAM (void *pMemory、const size_t numBytes)
    {
    ECAN_LAM_Handle canHandle;
    
    //检查以确保大小正确
    (如果(numBytes < sizeof (LAM_regs))))
    return ((ECAN_LAM_Handle) NULL);
    
    canHandle =(ECAN_LAM_Handle) pMemory;
    
    return canHandle;
    }
    
    ECAN_MOTO_Handle CAN_InitECANMOTO (void *pMemory、const size_t numBytes)
    {
    ECAN_MOTO_Handle canHandle;
    
    //如果
    (numBytes < sizeof (MOTO_regs)))、请检查以确保大小正确
    return ((ECAN_MOTO_Handle) NULL);
    
    canHandle =(ECAN_MOTO_Handle) pMemory;
    
    return canHandle;
    }
    
    
    ECAN_MOTS_Handle CAN_InitECANMOTS (void *pMemory、const size_t numBytes)
    {
    ECAN_MOTS_Handle canHandle;
    
    //检查以确保大小正确
    (如果(numBytes < sizeof (mots_regs)))))
    return ((ECAN_MOTS_Handle) NULL);
    
    canHandle =(ECAN_MOTS_Handle) pMemory;
    
    return canHandle;
    }
    
    //Setup ID 数组
    //假设 ID 和 DL 的长度为32!
    void CAN_SetIDS (int *id、int *dl)
    {
    int i = 0;
    for (i = 0;i < 32;i++)
    {
    dls[i]= dl[i];
    IDs[i]= id[i];
    }
    //--------------------
    
    
    
    //CAN 总线设置(波特率等)
    //---------------
    
    
    void CAN_initCTRL (volatile ECAN_REG_Handle handle)
    {
    
    volatile ECAN_REGS * regs =(ECAN_REGS *) handle;
    
    
    //仅允许32位写入 eCAN 控制/状态;使用影子来更改单个位
    ,然后将影子复制到*/
    
    ECAN_REGS 影子=(ECAN_REGS)*寄存器;
    
    //禁用邮箱直到邮箱设置
    shadow.CANME.all = 0;
    
    
    //允许使用全部32个邮箱
    shadow.CANMC.bit.SCB = 1;
    //设置数据字节顺序
    shadow.CANMC.bit.DBO = 0;
    
    //这些位应初始化为零;
    //通过将1作为预防措施写入来清除
    shadow.CANTA。all = 0xFFFFFFFF;//发送确认
    shadow.CANRMP.all = 0xFFFF; //接收的消息挂起
    shadow.CANGIF0.all = 0xFFFFFFFF;//中断标志寄存
    器 shadow.CANGIF1.all = 0xFFFFFFFF;
    
    
    //允许受保护的寄存器写入
    ENABLE_PROTECTED 寄存器_WRITE_MODE;
    
    //在
    RIOC 和 TIOC 寄存器
    寄存器 regs->CANRIOC.all = 0x8;
    regs->CANTIOC.all = 0x8;
    //将 CANMC、CANME 寄存
    器 regs->CANRME.all;regs->CANTIOC.All = 0x8;//将 CANMC、CANETO.ALL = CANGME 寄存器 regs->CANIGME.all
    ;CANIGMP.0
    ;CANIGME CANGIF1寄存器
    regs->CANCANCANCANG.all = SHADD.CANGA.ALL;
    regs->CANRMP.ALL = SHADD.CANRMP.ALL;
    regs->CANGIF0.ALL = SHADD.CANGIF0.ALL;
    regs->CANGIF1.all = SHADC.CANGIF1.ALL;
    
    //设置影子字段;CANGIF1.ALL; 当前设置与 Digiflow
    // SAMP 后的4 TQ 相同,SAMP 前5 TQ,2 TQ RJS,波特率= 1 MBaud
    //9 TQ 每位
    
    //初始清除
    影子.CANBTC.ALL = 0;
    //波特率预分频
    器影子.CANBTC.bit.BRPREG = 2;//TQ = 2
    
    位/SYSCLKOUT.USTRUG.ALE = 1;CANBRSTUT/SYNC.CANBRSTUG.Y+寄存器宽度 //SJW = SJWREG + 1
    //TSEG 1
    SHADD.CANBTC.bit.TSEG1REG = 7;//PROP SEG + PHASE SEG 1 = TSEG1REG + 1
    //TSEG 2
    SHADD.CANBTC.bit.TSEG2REG = 5;//PHASE SEG 2 = TSEG1REG +
    
    1 SHADD.CANTSAMP 1 + SHADT.CANBTC.BIT = 1;CANBTC.TSEG2REG = 1
    
    //请求配置写入
    shadow.CANMC.bit.CCR = 1;
    regs->CANMC.ALL = shad.CANMC.ALL;
    
    //等待许可
    执行{
    shadow.canes.all = regs->canes.all;
    }while (shadow.canes.bit.CCE!= 1);
    
    enable_protected_register_write_mode;
    
    //写入 CANBTC
    do{
    regs->CANBTC.all = shadow.CANBTC.all;
    }while (tc.CANBTC.all!= regs->CANBTC.shadow.all);shadow
    
    //删除更改配置
    shadow.CANMC.bit.CCR 的权限= 0;
    ((ECAN_REGS)*注册).CANMC.ALL = shadow.CANMC.ALL;
    
    //等待删除权限
    执行{
    shadow.canes.all =((ECAN_REGS)*寄存器).canes.all;
    }while (shadow.canes.bit.CCE!= 0);
    
    
    //禁用受保护的寄存器写入
    disable_protected_register_write_mode;
    
    }
    
    //-----------
    //邮箱设置(发送、接收、IDS)
    //---------------
    
    //数组的大小应全部为32
    // ID 包含 msg ID;dls 包含数据长度
    
    void CAN_setupMail (volatile ECAN_REG_Handle 重放、volatile ECAN_MBOX_Handle boxhandle)
    {
    ECAN_regs * regs =(ECAN_regs *) reghandle;
    ECAN_MBOXES * mbox =
    
    
    
    0x00000000 MBOOMBL = 0x0000.MBO = 0xMBOOMBO = 0xM0>MBOOMBO = 0xM0>所有的邮箱;MBOOMBO = 0xM0M0M0M0M0M0M0M0M0M0M0M0M0MMBO = 0xMMBO = 0xMBOOMBO = 0xM0M0M0M0M0M0M0M0M0M0MBOO
    
    
    mbox->MBOX4.MDL.all = 0x00000000;
    mbox->MBOX5.MDL.all = 0x00000000;
    mbox->MBOX6.MDL.all = 0x00000000;
    mbox->MBOX7.MDL.all = 0x00000000;
    mbox->MBOX8.MDL.all = 0x00000000;
    mbox->MBOX9.MDL.all = 0x00000000;
    mbox->MBOX10.MDL.all = 0x00000000;
    mbox->MBOX11.MDL.all = 0x00000000;
    mbox->MBOX12.MDL.all = 0x00000000;
    mbox->MBOX13.MDL.all = 0x00000000;
    mbox->MBOX14.MDL.all = 0x00000000;
    mbox->MBOX15.MDL.all = 0x00000000;
    mbox->MBOX16.MDL.all = 0x00000000;
    mbox->MBOX17.MDL.all = 0x00000000;
    mbox->MBOX18.MDL.all = 0x00000000;
    mbox->MBOX19.MDL.ALL = 0x00000000;
    mbox->MBOX20.MDL.all = 0x00000000;
    mbox->MBOX21.MDL.all = 0x00000000;
    mbox->MBOX22.MDL.all = 0x00000000;
    mbox->MBOX23.MDL.all = 0x00000000;
    mbox->MBOX24.MDL.all = 0x00000000;
    mbox->MBOX25.MDL.all = 0x00000000;
    mbox->MBOX26.MDL.all = 0x00000000;
    mbox->MBOX27.MDL.all = 0x00000000;
    mbox->MBOX28.MDL.all = 0x00000000;
    mbox->MBOX29.MDL.all = 0x00000000;
    mbox->MBOX30.MDL.all = 0x00000000;
    mbox->MBOX31.MDL.all = 0x00000000;
    mbox->MBOX0.MDH.all = 0x00000000;
    mbox->MBOX1.MDH.all = 0x00000000;
    mbox->MBOX2.MDH.all = 0x00000000;
    mbox -> MBOX3.MDH.ALL = 0x00000000;
    mbox -> MBOX4.MDH.ALL = 0x00000000;
    mbox -> MBOX5.MDH.ALL = 0x00000000;
    mbox -> MBOX6.MDH.ALL = 0x00000000;
    mbox -> MBOX7.MDH.ALL = 0x00000000;
    mbox->MBOX8.mDH.all = 0x00000000;
    mbox->MBOX9.mDH.all = 0x00000000;
    mbox->MBOX10.mDH.all = 0x00000000;
    mbox->MBOX11.mDH.all = 0x00000000;
    mbox->MBOX12.mDH.all = 0x00000000;
    mbox->MBOX13.MDH.all = 0x00000000;
    mbox->MBOX14.MDH.all = 0x00000000;
    mbox->MBOX15.MDH.all = 0x00000000;
    mbox->MBOX16.MDH.all = 0x00000000;mbox->MBOX17.MDH.all
    = 0x00000000;
    mbox->MBOX18.mDH.all = 0x00000000;
    mbox->MBOX19.mDH.all = 0x00000000;
    mbox->MBOX20.mDH.all = 0x00000000;
    mbox->MBOX21.mDH.all = 0x00000000;mbox->MBOX22.mDH.all
    = 0x00000000;
    mbox->MBOX23.MDH.all = 0x00000000;
    mbox->MBOX24.MDH.all = 0x00000000;
    mbox->MBOX25.MDH.all = 0x00000000;
    mbox->MBOX26.MDH.all = 0x00000000;
    mbox->MBOX27.MDH.all = 0x00000000;
    mbox->MBOX28.MDH.all = 0x00000000;
    mbox->MBOX29.MDH.all = 0x00000000;
    mbox->MBOX30.MDH.all = 0x00000000;
    mbox->MBOX31.MDH.ALL = 0x00000000;
    
    
    //将 MSG CTRL 寄存器初始化为0 mbox->MBOX0000.MBOOX0000.MTX=0x0000.MSOTL.MBOL=0x0000.MBOX0000.MBOL=0xM0000.MBOL=0xM0000.MBOL=0x0000.MBOX0000.M0000.MX0=0xMBOX0000.MBOL=0xMX0000.M0000.MX0=0x0000.MBOL=0x0000.MBOL=0x0000.MBOL=0x0000.MBOL=0x0000.M
    
    
    
    
    
    mbox->MBOX5.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX6.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX7.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX8.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX9.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX10.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX11.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX12.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX13.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX14.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX15.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX16.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX17.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX18.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX19.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX20.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX21.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX22.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX23.MSGCTRL.ALL = 0x00000000;mbox->MBOX24.MSGCTRL.ALL
    = 0x00000000;
    mbox->MBOX25.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX26.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX27.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX28.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX29.0000 = 0x0000CTRL.ALL;
    mbox->MBOX30.MSGCTRL.ALL = 0x00000000;
    mbox->MBOX31.MSGCTRL.ALL = 0x00000000;
    
    //为中间缓冲区设置 IDS
    
    //首先清除所有
    mbox->MBOX0.MSGID.ALL = 0x00000000;
    mbox->MBOX1.MSX4.ALL = 0x0000GID.ALL = 0x00000000
    
    
    ;MBOOX2.0000GID=0x0000.MBOOX2.0000.MBOOX2.0000.MBOOGID=0x0000.M0000.M0000.MBOOX2.00000000 = 0x0000.MBOOGID=0x0000.M0000.MBOOGID=0x0000.M0000.M0000.M0000.
    mbox->MBOX5.MSGID.all = 0x00000000;
    mbox->MBOX6.MSGID.all = 0x00000000;
    mbox->MBOX7.MSGID.all = 0x00000000;
    mbox->MBOX8.MSGID.all = 0x00000000;
    mbox->MBOX9.MSGID.all = 0x00000000;
    mbox->MBOX10.MSGID.all = 0x00000000;
    mbox->MBOX11.MSGID.all = 0x00000000;
    mbox->MBOX12.MSGID.all = 0x00000000;
    mbox->MBOX13.MSGID.all = 0x00000000;
    mbox->MBOX14.MSGID.all = 0x00000000;
    mbox->MBOX15.MSGID.all = 0x00000000;
    mbox->MBOX16.MSGID.all = 0x00000000;
    mbox->MBOX17.MSGID.all = 0x00000000;
    mbox->MBOX18.MSGID.all = 0x00000000;
    mbox->MBOX19.MSGID.all = 0x00000000;
    mbox->MBOX20.MSGID.all = 0x00000000;
    mbox->MBOX21.MSGID.all = 0x00000000;
    mbox->MBOX22.MSGID.all = 0x00000000;
    mbox->MBOX23.MSGID.all = 0x00000000;
    mbox->MBOX24.MSGID.all = 0x00000000;
    mbox->MBOX25.MSGID.all = 0x00000000;
    mbox->MBOX26.MSGID.all = 0x00000000;
    mbox->MBOX27.MSGID.all = 0x00000000;
    mbox->MBOX28.MSGID.all = 0x00000000;
    mbox->MBOX29.MSGID.all = 0x00000000;
    mbox->MBOX30.MSGID.all = 0x00000000;
    mbox->MBOX31.MSGID.all = 0x00000000;
    
    //设置标准 IDS
    mbox->MBOX0.MSGID.bit.STDMSGIDs[0]= IDs[0];
    mbox->MBOX1.MSX3.bit.STDGIDs=mSDIDs=mCMSDIDs=mbox =mPMB.4mPMIDs=mCMSDIDs=mCMSDIDs=mCMP=mCMP=mBOOSDID.PM4.mbox =mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=mCMP=
    
    
    
    mbox->MBOX5.MSGID.bit.STDMSGID = IDS[5];
    mbox->MBOX6.MSGID.bit.STDMSGID = IDS[6];
    mbox->MBOX7.MSGID.bit.STDMSIDS=IDS[7];mbox->MBOX8.MSGID.MSOGID=[MSSID.bit]=MBOOX9.MMSGID.STMMSGIDs=M9].MBOOMSGID.STM9[STMQ=.STDMIDS9].MMSGID.MQ=.MSOIDS=.
    
    
    mbox->MBOX10.MSGID.bit.STDMSGID = IDs[10];
    mbox->MBOX11.MSGID.bit.STDMSGID = IDs[11];
    mbox->MBOX12.MSGID.bit.STDMSGID = IDs[12];mbox->MBOX13.MSGID.MSGID=SMBID.MOBIGID.14]=MBOOX14.[STMSGID.MOBIGID.ST14.]=MMSIDs=mbox.MMSGID.MOBIGID.MOBIGID.MOBIGID.MOBIGID.ST
    
    
    mbox->MBOX15.MSGID.bit.STDMSGID = IDs[15];
    mbox->MBOX16.MSGID.bit.STDMSGID = IDs[16];
    mbox->MBOX17.MSGID.bit.STDMSIDs=IDs[17];
    mbox->MBOX18.MSGID.MSGIDs=mbox=SMGID.MSGID.MSGIDs=m19].MBOOX18.STGID.M19;MMSGIDs=MMSGID.M19
    
    mbox->MBOX20.MSGID.bit.STDMSGID = IDs[20];
    mbox->MBOX21.MSGID.bit.STDMSGID = IDs[21];
    mbox->MBOX22.MSGID.bit.STDMSIDs=IDs[22];
    mbox->MBOX23.MSGID.MSGIDs=mbox[24];mMSGID.mMSGIDs=SMBID.bit.24]
    
    mbox->MBOX25.MSGID.bit.STDMSGID = IDs[25];
    mbox->MBOX26.MSGID.bit.STDMSGID = IDs[26];
    mbox->MBOX27.MSGID.bit.STDMSIDs=IDs[27];
    mbox->MBOX28.MSGID.MSGIDs=mMSGIDs[29];mMSGIDs[STMMSGID.bit.MSGIDs=mbox.M29].MMSGID.MMSGIDs=mbox.MMSGID.MMSGIDs=m
    
    mbox->MBOX30.MSGID.bit.STDMSGID = IDS[30];
    mbox->MBOX31.MSGID.bit.STDMSGID = IDS[31];
    
    //Standard ID -> IDE = 0
    mbox->MBOX0.MSGID.bit.IDE = 0;
    mbox->MBOGID.MBOX2.MOBIGID.mbox
    
    = 0>MBOX2.mMBOGID.MBOX2.mbox = 0.mIDE.MBOMBOID.MBOID.MBOX2.mbox = 0;MBOGID.MBOX2.mbox = MBOGID.MBOID.MBOID.MBOID.MBOID.MBO0=mID.
    
    mbox->MBOX5.MSGID.bit.IDE = 0;
    mbox->MBOX6.MSGID.bit.IDE = 0;
    mbox->MBOX7.MSGID.bit.IDE = 0;
    mbox->MBOX8.MSGID.bit.IDE = 0;
    mbox->MBOX9.MSGID.bit = 0;IDE = 0;
    mbox->MBOX10.MSGID.bit.IDE = 0;
    mbox->MBOX11.MSGID.bit.IDE = 0;
    mbox->MBOX12.MSGID.bit.IDE = 0;
    mbox->MBOX13.MSGID.bit.IDE = 0;
    mbox->MBOX14.MSGID.ID.bit = 0;
    mbox->MBOX15.MSGID.bit.IDE = 0;
    mbox->MBOX16.MSGID.bit.IDE = 0;
    mbox->MBOX17.MSGID.bit.IDE = 0;
    mbox->MBOX18.MSGID.bit.IDE = 0;
    mbox->MBOX19.MSGID.ID.ID.IDE = 0;bit.IDE = 0;
    mbox->MBOX20.MSGID.bit.IDE = 0;
    mbox->MBOX21.MSGID.bit.IDE = 0;
    mbox->MBOX22.MSGID.bit.IDE = 0;
    mbox->MBOX23.MSGID.bit.IDE = 0;
    mbox->MBOX24.MSGID.ID.bit = 0;位 IDE.IDE = 0;
    mbox->MBOX25.MSGID.bit.IDE = 0;
    mbox->MBOX26.MSGID.bit.IDE = 0;
    mbox->MBOX27.MSGID.bit.IDE = 0;
    mbox->MBOX28.MSGID.bit.IDE = 0;
    mbox->MBOX29.MSGID.bit = 0;位 ID.IDE = 0;位
    mbox->MBOX30.MSGID.bit.IDE = 0;
    mbox->MBOX31.MSGID.bit.IDE = 0;
    
    //设置数据字节长度
    mbox->MBOX0.MSGCTRL.bit.DLC = dls[0];mbox->MBOX1.MSGCL.bit.DX3=MBOGCL.MSGCTRL.1[MBOGCL.bit.DMSOC=dLC.1]=DMSOCL.DMSOCL.DMB=dLC.1[MBOS=DMSOCL.DMB=DMB=dLC.1[MBOS=DMB=dLC.1]=DMSOCL.DMB=DMSOCL.DMB=DMB=DMB=DMB=DMOS=DMB=DMOS=dLC.1MBOL.1[MBOS=
    
    
    
    
    mbox->MBOX5.MSGCTRL.bit.DLC = dls[5];
    mbox->MBOX6.MSGCTRL.bit.DLC = dls[6];
    mbox->MBOX7.MSGCL.bit.DLC = dls[7];mbox->MBOX8.MSGCL.bit.DLC=dtls.mbox=dtl.9=dMBOVLC.9[b.bit.dlc=dtl.dlc=dtl.dlc=dtl.dlc=dmm.dlc=dtl.dlc=dtl.dlc=dtl.dlc=dtl.dlc=dtl.dlc
    
    
    mbox->MBOX10.MSGCTRL.bit.DLC = dls[10];
    mbox->MBOX11.MSGCL.bit.DLC = dls[11];
    mbox->MBOX12.MSGCL.bit.DLC = dls[12];mbox->MBOX13.MSGCL.bit.DLC=dtls=d14[MBOX13.MSGCL.bit.dlc=d14]
    
    ;mbox=dMBOCTRL=dtl.dlc=d14[MBO1.bit.dlc=dtl.dlc=dtl.dlc=d14]=dtl.dlc=dtl.dlc=d
    mbox->MBOX15.MSGCTRL.bit.DLC = dls[15];
    mbox->MBOX16.MSGCTRL.bit.DLC = dls[16];
    mbox->MBOX17.MSGCTRL.bit.DLC = dls[17];
    mbox->MBOX18.MSGCL.bit.DLC=dtl.19;mbox=dMSGCL.19;mtl.dlc=dMSGC=dtl.bit.dlc=dmm.dlc=dmm.dlc=d19]=dtl.dlc=dtl.dlc=dmm.dlc=dmm.dlc=dmm.
    
    mbox->MBOX20.MSGCTRL.bit.DLC = dls[20];
    mbox->MBOX21.MSGCTRL.bit.DLC = dls[21];
    mbox->MBOX22.MSGCTRL.bit.DLC = dls[22];
    mbox->MBOX23.MSGCL.bit=dtl.dlc=d24[24];mbox=mtl.dlc=dtl.dlc=d24[m.dlc=d24]
    
    mbox->MBOX25.MSGCTRL.bit.DLC = dls[25];
    mbox->MBOX26.MSGCTRL.bit.DLC = dls[26];
    mbox->MBOX27.MSGCTRL.bit.DLC = dls[27];mbox->MBOX28.MSGCL.bit.DLC=dLC.29]
    ;mbox=mMSGCL.dMSGCL.dMS=dLC.dLC.dLC.dLC.dLC.dLC.dLC.dLC.dLC.mbox=dLC.dLC.dLC.dLC.dLC.dLC.dLC.d
    
    mbox->MBOX30.MSGCTRL.bit.DLC = dls[30];
    mbox->MBOX31.MSGCTRL.bit.DLC = dls[31];
    
    ENABLE_PROTECTED 寄存器_WRITE_MODE;
    
    //不使用全局接受屏蔽
    寄存器->CANGAM.ALL = 0;
    
    //前16个发送寄存器,后16个接收
    寄存器->CANMD.ALL = 0xFFFFFF0000;
    
    //启用邮箱
    寄存器->CANME.ALL = 0xFFFFFFFF;
    
    disable_PROTECTED register_WRITE_MODE;
    
    }-->---
    
    
    //接收函数
    /../../---------------
    //如果接收到任何尚未读取的消息
    ,则返回 true bool CAN_checkMail (volatile ECAN_REG_Handle handle)
    {
    ECAN_REGS *regs =(ECAN_REGS *) handle;
    if (regs->CANRMP.all =0)返回 false;
    否则返回 true;
    }
    //如果邮箱 n 中有消息,则返回 true,如果
    没有消息
    ,则返回 false //如果没有消息 bool CAN_getMail (volatile ECAN_REG_Handle reghandle,volatile ECAN_MBOX_Handle boxhandle,volatile int j,volatile UINT32_t *data1,volatile UINT32_t *data2)
    {//
    get 易失性 ECAN_MBOx_Handle boxhandle
    * volatile *
    (volatile ECAN_MBAN_MBAN *)* remotle *(volatile ECAN_MBAN_MBAN **)* rgorle *= volatile ECANG_
    
    
    //set statics
    n = j;
    datalocl = data1;
    dataloch = data2;
    loops = 0;
    dsize = dls[n];
    //如果
    
    ((((uint32_t)((uint32_t)(0b1)<< n)& regs->CANRMP.all)>> n)= 0)
    {
    return false;
    }、则检查以确保邮箱 n 有一条消息接收//返回 false
    否则
    {
    //循环只要此邮箱有 msg
    while (((((uint32_t)(uint32_t)(0b1)<< n)& regs->CANRMP.all)>> n)= 1)
    {
    //向邮箱 n 的 RMP 写入1以清除位 regs->CANRMP.t
    (uint32)
    ;/uint32 (uint1) 如果循环> 1、则出现错误
    //Loops > 1表示读取数据时 RMP 被设置回1
    //AKA、读取第一个消息
    循环++时收到第二条消息;
    
    //读取 Mbox 数据
    开关(n)
    {
    案例16:
    dataal = mbox->MBOX16.MDL.all;
    dataah = mbox->MBOXM17>MBO.MDL.all
    
    ;data=MBOOM17>MBOOM17>MBOLL
    ;
    datah = mbox->MBOX17.mdh.all;
    break;
    case 18:
    dataal = mbox->MBOX18.mdl.all;
    dataah = mbox->MBOX18.mdh.all;
    break;
    case 19:
    dataal = mbox->MBOX19.mdl.all;
    datah = mbox-mMBOMBOx22.mbox
    
    
    
    
    
    
    
    
    
    
    = mbox2>mbo.mbla.
    
    
    情况23:
    dataal = mbox->MBOX23.mdl.all;
    datah = mbox->MBOX24.mDH.all;
    break;
    
    
    
    
    case 25:dataal = mbox->MBOX24.mdl.all;dataah = mbox->mMBOX24.mbl.mbox =
    
    
    mDMOS=mbl.mbl.mx26;mxmblum.mbox
    
    
    
    
    
    
    
    
    
    = mDMOS=mbl.mDMOS=m.mbl.m.m.mbl.m.mbla. m.m.m.mbla. m.m.mbla.
    datah = mbox->MBOX28.mDH.all;
    break;
    case 29:
    dataal = mbox->MBOX29.mdl.all;
    dataah = mbox->MBOX29.mDH.all;
    break;
    case 30:
    dataal = mbox->MBOX30.mdl.all;
    datah = mbox-mMBO31- mdmbl.mb
    
    
    
    
    
    
    
    
    
    = mblu;dmb = mblu = mblu;dmb = m.mblu = m.mb = m.m.mb = mb = mblu;m.mb = mb = m.mb = mb = m.31–mb = mb 大小;mb = mb = mb = mb = mb = mb = mb = mb = mb = mb = mb =
    
    dataal = dataal &(0xFFFFFFFFFF >>(32-dsize*8);
    }
    否则
    {
    dataah = dataah &(0xFFFFFFFFFF >>(32-(dsize-4)*8);
    }
    
    *datalocl = datal;
    *dataloch = dataah;
    //错误程序
    if (loops>1) retriese-/true--- returns---
    
    
    
    
    --/true--成功返回
    
    
    //transmit functions
    //---------------
    int CAN_sendMSG (volatile ECAN_REG_Handle reghandle、volatile ECAN_MBOOX_Handle boxhandle、volatile int j、volatile UINT32_t data1、volatile UINT32_t data2)
    {
    //get Register structures from handle
    volatile ECAN_regs * regs =(ECAN_REGS *) reghandle = volatile ECAN_t
    
    
    
    
    data1;*= volatile data2
    ;*= volatile data1 =(ECAN_r =) r * data2;*) r = volatile data1 = volatile data2;* 1 = volatile data1
    
    
    //set MDL and MDH of correct mailbox
    switch (n)
    {
    case 0:
    mbox->MBOX0.MDL.all = datal;
    mbox->MBOX0.mDH.all = datah;
    break;
    case 1:
    mbox->MBOX1.mdl.all = datal;mbox->MBOX1.mDH.mdx2.mbox
    
    
    
    
    = dma.all;mbox=mMBOx2.mand=mbo=mbl.mbox =mand.mah.mdah.mbox
    
    =
    
    mbla.
    
    
    mbox->MBOX4.MDL.all = datal;
    mbox->MBOX4.MDH.all = datah;
    break;
    case 5:
    mbox->MBOX5.MDL.all = datal;
    mbox->MBOX5.MDH.all = datah.MMBH;
    
    case 6:
    mbo.MMBH = dathal.MDL.MDL.all
    
    
    
    
    
    
    
    
    
    
    ;mbox
    = data.
    mbox->MBOX9.mDH.all = datah;
    break;
    case 10:
    mbox->MBOX10.mdl.all = datal;
    mbox->MBOX10.mDH.all = dataah;
    break;
    case 11:
    mbox->MBOX11.mdl.all = datal;
    mbox->mbl.mMBOMBH
    
    
    = dhm.h
    
    
    
    
    
    
    
    = mblum.mbl.mbl.mbl.mbl.m.mbl.m.m.mbla.
    
    
    案例15:
    mbox->MBOX15.MDL.all = dataal;
    mbox->MBOX15.MDH.all = datah;
    break;
    }
    //设置正确的发送请求寄存
    器 regs->CANTRS.all = 0b1 << n;
    
    //等待发送确认
    while (!(regs->CANT.all)->
    
    
    n
    
    )
    
    
    
    
    ;//等待发送确认全部(n> 0b1);//完成 n);//等待发送确认全部(n<</n)
    

    对 CAN.h 的修改:

    在顶部、为 ECANA 基址定义:

    //定义 eCAN 基址
    #define ECANA_REG_BASE_ADDR (0x6000)
    #define ECANA_LAM_BASE_ADDR (0x6040)
    #define ECANA_MOTS_BASE_ADDR (0x6080)
    #define ECANA_MOTO_BASE_ADDR (0x60C0)
    #define ECANA_MBOX_BASE_ADDR (0x6100) 

    在底部、声明所有结构后:

    tytid f volatile struct _ECAN_REGs_* ECAN_REG_Handle;
    typedef volatile struct _ECAN_MBOXES_* ECAN_MBOX_Handle;
    typedef volatile struct _LAM_regs_* ECAN_MOOX_Handle;
    
    
    
    
    
    * volatile Memory_EMAN_RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON + RMAN_ON (void)
    extern ECAN_MOTO_Handle CAN_InitECANMOTO (void *pMemory、const size_t numBytes);
    extern ECAN_MOTS_InitECANMOTS (void *pMemory、const size_t numBytes);
    extern void CAN_Setdl (int、setup*id) CAN_InitECAN (void *pMemory、const size_t numbBytes);extern exvolatile eCAN
    
    
    
    
    
    (excandcle) exctrand exvolatile eCAN (excote_excle)
    
    //get message at mailbox n
    extern bool CAN_getMail (volatile ECAN_REG_Handle reghandle、volatile ECAN_MBOOX_Handle boxhandle、volatile int n、volatile UINT32_t *数据、volatile UINT32_t *数据);
    //从邮箱 n
    extern int CAN_sendMSG 发送消息(volatile ECAN_REG_Handle 重发、volatile ECAN_MBOOX_Handle boxhandle、volatile int n、volatile UINT32_t datal、volatile UINT32_t datah); 

    为了设置 ECAN 寄存器的这些句柄、需要修改更多的文件:

    在 hal_obj.h 中、将这些句柄添加到对象定义中:

    易失性 ECAN_REG_Handle canRegHandle;//CAN 总线处理
    易失性 ECAN_MBOX_Handle canMboxHandle;
    易失性 ECAN_MOTS_Handle canMotsHandle;
    易失性 ECAN_MOTO_Handle canMotoHandle;
    易失性 ECAN_LAM_Handle canLamHandle; 

    在 hal.h 中、添加以下函数声明:

    // CAN 函数声明
    extern void HAL_setupCAN (HAL_Handle handle);
    extern bool HAL_checkCAN (HAL_handle);
    extern void HAL_sendCAN (HAL_handle、int I、uint32_t datal、uint32_t datah); 

    在 hal.c 中、定义以下函数:(此外、我在 hal.c 顶部定义了包含消息 ID 和数据长度的静态数组)

    //调用设置
    void HAL_setupCAN (volatile HAL_Handle handle)
    {
    volatile HAL_Obj * obj =(HAL_Obj *) handle;
    CAN_initCTRL (obj->canRegHandle);
    CAN_SetIDS (CANIDS、CANDLS);
    CAN_setupMail (obj->canRegHandle、 obj->canMboxHandle);
    return;
    }//call
    
    以检查消息
    bool HAL_checkCAN (volatile HAL_Handle handle)
    {
    volatile HAL_Obj * obj =(HAL_Obj *) handle;
    return CAN_checkMail (obj->canRegHandle);
    }
    
    //transmit
    void HAL_sendCAN (HAL_Obj *) handle、32、unvolatile mandt
    
    、unatile mandle、statt、unatile mage_handle、statt、unt、unt、statt、statt、al- 32
    

    您尚未完成。 需要对 hal.c 进行更多修改:

    在 HAL_init 函数中、添加:

    //初始化 CAN 接口
    obj->canRegHandle = CAN_InitECANReg ((void *) ECANA_REG_BASE_ADDR、sizeof (ECAN_regs);
    obj->canMboxHandle = CAN_InitECANMBOX (void *) ECANA_AMBON_BASE_ADDR、sizeof (ECAN_MOTE_EMOTO_EMORG
    )
    
    ;*= CAN_EMORT_AM_EMORG (void *= CAN_EMORT_AM_EMORG);CAN_EMORT_EMORG (void *= CAN_AM_AM_EMORG) 

    在主代码中、您将需要在 HAL_init 之后的某个时间调用 HAL_setupCAN。 之后、您应该能够仅使用为 CAN 接口添加的 HAL 函数来使用它。

    我认为这就是它的原因。 为供参考、我使用了 ECANA 技术参考 pdf、该文档可在 TI 网站(http://www.ti.com/lit/ug/sprueu0/sprueu0.pdf)上找到

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除上述内容外、您还可以研究 controlSUITE CAN 示例、并尝试将其移植到您正在处理的项目中。

    此外、Motorware 18还提供了一个示例、说明如何将 SCI 功能引入 Motorware 项目中; 当您不在寻找 SCI 时、遵循该指南可能会让您深入了解需要包含哪些文件以及需要创建哪些函数才能将 CAN 引入项目。 有关该指南、请查看 C:\ti\motorware\motorware_1_01_00_18\docs\Tutorials\motorware_hal_tutorial.pdf

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam、

    确实要感谢一百万。 非常慷慨和全面。

    我现在尝试使用"motorware_hal_tutorial"来使用板载电位计控制电机速度。  

    在我开始工作后、 我的下一步将是使用您的代码并通过 CANbus 启用速度控制。

    愉快的一天!!

    高贵

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sean、
    非常感谢。
    按照建议、我将在进入 CANbus 之前学习该教程、以获得更多的经验。
    高贵
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Adam、谢谢。

    您在哪里定义了 ECAN_MBOXES、CANIDS、CANDLS 和...?

    Andrew。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam、

     您是否 未在 CAN.h 中更改?  

    结构 MOTO_REGS{

    };

    输入

    typedef struct _mots_regs_


    } MOTO_REGS;

    Andrew。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ECAN_MBOXES 和此类文件是在我更改后的 can.h 文件中定义的。

    CANIDS 和 CANDLS 在 hal.c 中为我定义、然后传递到 HAL_setupCAN 中的 CAN.c。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我实际上在 CAN.h 中进行了该更改(以及与 LAM、MBOX、MOTS 等结构类似的更改) 忘记提一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒的工作!

    我将邮箱寄存器声明为数组、这样可以节省大量开关、并且可以在循环中初始化它们;

    //声明
    #pragma DATA_SECTION (EcanaMboxesArray、"ECANaMboxesFile");
    volatile struct MBOX EscanaMboxesArray[32];

    //用法(初始化)
    对于(I = 0;I < 32;I++)

    EcanaMboxesArray[I].MSGCTRL.ALL = 0;
    EscanaMboxesArray[i].MSGID.all = 0;//附加-初始化标识符*/
    EscanaMboxesArray[i].mdh.all = 0;//附加-清除数据*/
    EscanaMboxesArray[i].mdl.all = 0;//附加-清除数据*/


    您会得到这张图片。

    此致、

    Rob。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好。
    复活节后、在 MotorWare 18中添加 ECAN 的时间很短。
    lab01_ECanBack2ack - controlSUITE。
    lab09a_ECanBack2Back_API -单次读取/写入。
    lab09a_ECanCmd -使用 FIFO 进行突发读取/写入。
    我计划添加 CANopen 和 UAVCAN。

    这是我的 API 的初稿。
    github.com/.../MotorWare_eCAN

    Andrew
    电源
    如果发现错误或扩展名、请编写。

    稍后将进行中断处理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、
    帮助我解决"应答远程请求"问题。
    I 设置 MailBox0 MD = 0、
    ID = 80、IDE = 0、AME = 0、AAM = 1。
    MDL = 0x5A5A5A、MDH = MDL = 0x5A5A5A。
    我没有得到答复。

    谢谢你。

    Andrew。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、

    我添加了一个中断并修复了一个带有掩码的错误。

    Andrew。

    github.com/.../MotorWare_eCAN

    PS:
    "应答远程请求"我稍后会在必要时执行此操作。 )