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.
我正在尝试通过观察窗口确认我的 CAN 配置、但似乎没有更新任何寄存器或存储器。
我将以与 C200ware 示例 CAN_loopback_bitfields_cpu01中类似的方式配置 CANA。 我正在设置 CAN_CTL Init 和 CCE 位、并且可以在观察窗口上看到此更新。 当我写入 CAN_BTR 寄存器时、我在观察窗口中观察到寄存器没有变化。 其他寄存器似乎也没有设置、当我通过存储器浏览器观察 CANA 消息 RAM 时、我看到它没有变化。
我还尝试以 C200ware exmaple CAN_external_transmit cpu01中使用的方式设置 CAN_BTR、并观察到类似的结果。
我做了什么错误、或者我错过了什么?
提前感谢您的任何见解。
尊敬的 Andrew:
如果有一种方法可以将应用移植到使用 driverlib 函数和示例(在 C2000Ware 根目录/driverlib/f2837xs/examples/cpu1/cA/…中)、我强烈建议您这样做。 已弃用 bitfield 函数和示例、并且不提供大量支持。 我怀疑您看到的是与旧位字段结构进行寄存器映射的结果。
无论如何、下面是一个快速建议来查看它是否确实是一个寄存器显示映射问题(但是在执行以下步骤之前、为了使 CAN_BTR 寄存器可写、必须设置 CAN_CTL 中的 CCE 和 Init 位):
-添加此声明:struct can_regs *canregs;
-将其添加到您的代码中:canregs =&CanaRegs.CAN_BTR;
上述代码片段仅将 CAN_BTR 的地址分配给变量寄存器。 在表达式窗口中、添加 canregs。 执行上述代码后、canregs 地址的值将显示在 Expressions 窗口中。 转至内存浏览器并键入 canregs 的地址。 在写入位时序参数时、查看存储器窗口是否显示 CAN_BTR 的更新值。 给这个机会、让我知道。
此致、
Joseph
Joseph、
我已经做了以下声明:
volatile struct CAN_regs *康雷格斯;
volatile union CAN_BTR_REG *坎本;
注意: 我添加了*canbtr 作为保险、因为我收到编译器警告、"volatiule union CAN_BTR_REG 类型无法分配给"volatile struct CAN_regs"类型的实体;但它按计划工作。
并在我的代码中实现了以下行:
canregs =&CanaRegs.CAN_BTR;
CANBtr =&CANaRegs.CAN_BTR;
易失性 UINT32 BTRupdate = (UINT32) BRP_VAL \
+((UINT32) SJW_VAL<<6) \
+(((UINT32) TSEG1_VAL <<8) \
+(((UINT32) TSEG2_VAL <<12) \
+(((uint32) BRPE_VAL<<16);
CanaRegs.CAN_BTR.All = BTRupdate;
执行上述行后的表达式和内存浏览器窗口如下所示:
请注意、CANGS 和 CANBtr 均设置为地址0x00048006、这不是 CAN_BTR 地址、应为0x00048000C。 这是问题吗?
尊敬的 Andrew:
是的、这是 CAN 位字段标头的问题、因为寄存器视图会误导开发者。 寄存器实现是每隔32位字执行一次、但在寄存器视图中未正确显示。 在 driverlib 中、这些偏移在 inc/hw_ca.h 中预定义:
//
//
//为 CAN 寄存器偏移定义了以下内容
//
//
#define CAN_O_CTL 0x0U // CAN 控制寄存器
#define CAN_O_ES 0x4U //错误和状态寄存器
#define CAN_O_ERRC 0x8U //错误计数器寄存器
#define CAN_O_BTR 0xCU //位时序寄存器
#define CAN_O_INT 0x10U //中断寄存器
#define CAN_O_TEST 0x14U //测试寄存器
#define CAN_O_PERR 0x1CU // CAN 奇偶校验错误代码
//注册
#define CAN_O_RAM_INIT 0x40U // CAN RAM 初始化
:
:...等等...
此致、
Joseph
Joseph、
感谢您提供的信息、现在有很多道理。
我已经成功地对寄存器进行了如下编程:
UNION CAN_BTR_REG *pcAN_BTR;
CAN.A.PCAN_BTR =(UNION CAN_BTR_REG *)(CANA_base + CAN_O_BTR);
这样我就可以访问位字段、至少出于调试目的。 我注意到、写入操作作为32位字执行时、似乎只能可靠地执行、这有道理吗?
还有一个问题。 邮箱1和2是否仅限于传输? 我可以看到、当我将邮箱0的消息 RAM 配置为 TX 时、它被正确配置、但是如果我将邮箱1配置为 Rx、我不会获得预期结果(RAM 从零开始)。
谢谢、
Andy
Andrew、
所有32个邮箱都可配置为发送或接收。 所有邮箱都不是只能用于发送或接收的。
此致、
Joseph