主题中讨论的其他器件:controlSUITE、 MOTORWARE
您好!
我想通过 CANbus 或任何其他串行通信设置速度和 Iq 值。
此外、接收总线电压、电流和电机转速等信息。
我该怎么做? 我应该从哪里开始?
非常感谢。 此致
高贵。
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.
您好!
我想通过 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)上找到
大家好。
复活节后、在 MotorWare 18中添加 ECAN 的时间很短。
lab01_ECanBack2ack - controlSUITE。
lab09a_ECanBack2Back_API -单次读取/写入。
lab09a_ECanCmd -使用 FIFO 进行突发读取/写入。
我计划添加 CANopen 和 UAVCAN。
这是我的 API 的初稿。
github.com/.../MotorWare_eCAN
Andrew
电源
如果发现错误或扩展名、请编写。
稍后将进行中断处理。