请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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。 对此有何评论?
谢谢