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.

[参考译文] TM4C123GH6PM:如何在 CAN 外围设备定期禁用/启用时设置 CAN 外围设备(及其消息 TX/RX 对象)?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1077671/tm4c123gh6pm-how-to-setup-the-can-peripherals-and-its-message-tx-rx-objects-when-the-can-peripheral-is-periodically-disabled-enabled

部件号:TM4C123GH6PM
“线程”中讨论的其它部件:TM4C123

嗨,

我正在努力为与 CAN 相关的公司寻找一个好的解决方案。

在我的项目中,CAN Rx/TX 线路被固定。 这意味着我喜欢通过循环时间分片收听不同的 CAN 网络。 目前的程序是:

MUX to can network 1
wait 5ms till signals have settled
CAN activate
setup CAN rx message objects
send CAN tx message
wait for INTR on CAN rx object with a timeout
CAN deactivate

MUX to can network 2
wait 5ms till signals have settled
CAN activate
setup CAN rx message objects
send CAN tx message
wait for INTR on CAN rx object with a timeout
CAN deactivate

....
MUX to can network 30
wait 5ms till signals have settled
CAN activate
setup CAN rx message objects
send CAN tx message
wait for INTR on CAN rx object with a timeout
CAN deactivate

MUX to can network 1
wait 5ms till signals have settled
CAN activate
setup CAN rx message objects
send CAN tx message
wait for INTR on CAN rx object with a timeout
CAN deactivate

....


如果你们能看看我的能激活/停用代码并给我反馈,那将是很棒的。它是我为 TM4C123编写的 Zephyr 端口的一部分。 因此,不要与内核 API 函数调用混淆
bool sysctl_activatePeripheral(const uint32_t pAddr) {
	const int indx =findPeripheral(pAddr);
	if (indx < 0) return false;

	if (syscontrolOn[indx] == true) {
		return true;
	}

	const uint32_t sp = peripheralToSysCtrl[indx].i;
	// SysCtlPeripheralPowerOn(sp);

	SysCtlPeripheralEnable(sp);
	while(!SysCtlPeripheralReady(sp)){
	}

	syscontrolOn[indx] = true;
	return true;
}

void sysctl_deactivatePeripheral(const uint32_t pAddr) {
	const int indx =findPeripheral(pAddr);
	if (false == syscontrolOn[indx] ) {
		return;
	}
	const uint32_t sp = peripheralToSysCtrl[indx].i;
	SysCtlPeripheralDisable(sp);
	SysCtlPeripheralReset(sp);
	syscontrolOn[indx] = false;
}

static void can_tiva_activate(const struct device *dev) {
	const uint32_t base = DEV_CFG(dev)->base;
	struct can_tiva_runtime *data = DEV_DATA(dev);

	sysctl_activatePeripheral(base);
	for (unsigned int i = 1; i < MAX_CAN_MSG; i++){
		CANMessageClear(base, i);
		k_sem_reset(&(data->ms[i].ioSem));
	}
	CANInit(base);
	CANRetrySet(base, false);
	CANBitRateSet(base, SysCtlClockGet(), DEV_CFG(dev)->bus_speed);
	CANIntEnable(base, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
	CANEnable(base);
}

static void can_tiva_deactivate(const struct device *dev) {
	const uint32_t base = DEV_CFG(dev)->base;

	if (true == sysctl_getActiveState(base)) {
		CANIntDisable(base, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
		CANDisable(base);
	}
	sysctl_deactivatePeripheral(base);
}

你怎么看?

另一个小问题。在期待 CAN 消息(Rx)后首次发送(TX) CAN 消息时,我应该使用哪种类型的消息对象。 目前我正在使用 MSG_OBJ_TYPE_RX 和 MSG_OBJ_TYLE_TX。 对此有何评论?

谢谢

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

    斯特凡,你好!

    我对这种应用并不是很熟悉,所以我不会在这里利用任何以前的专业知识,而仅仅是一般的设备知识。

    就激活/停用流程而言,从一般逻辑流程的角度看,这些流程对我来说很好。 最重要的是,每次禁用外围设备时,您必须重新配置所有设置,因此,您可以在此处充分了解这些设置,因此我认为这应该可以正常工作。

    对于使用的消息, MSG_OBJ_TYPE_TX 和 MSG_OBJ_TYLE_RX  几乎 都 是使用的消息。 我认为我个人没有使用过其他东西,所以所有的东西都可以检查。

    从我所看到的情况来看 ,从 TivaWare / TM4C 外设的角度看,您的总体架构对我来说很好,我只能评论一下您定义的应用程序特定程序的工作效果如何,因为我以前没有做过类似的事情。

    此致,

    拉尔夫·雅各比