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.

[参考译文] TMS320F2808:将 CAN 波特率从1个值更改为另一个值

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1040732/tms320f2808-changing-can-baud-rate-from-1-value-to-another

器件型号:TMS320F2808

您好! 我的 F2808将连接到默认为20Kbps CAN 波特率的器件、因此我需要 F2808以20Kbps 开始、然后 F2808可以将器件更新为1Mbps、然后 F2808需要更改它 波特率达1Mbps。 因此、我让 F2808以20Kbps 的速率与器件通信、并成功地将器件波特率更改为1Mbps。 现在、我需要将 F2808更改为1Mbps 以继续与器件通信、但是波特率变化在我第二次尝试更改配置时被挂起。

void UpdateCanRate (volatile struct eECAN_REGs* ecanregs、CANBaud CBR)

/ /
/*为 eCANx*/配置位时序参数
ECANShady.CANMC.ALL = ecanregs->CANMC.ALL;
ECANShady.CANMC.bit.CCR = 1;//设置更改配置请求= 1
ecanregs->CANMC.ALL = ECANShady.CANMC.ALL;

//等待 CPU 被授予更改配置寄存器的权限
操作

ECanShady.canes.all = ecanregs->canes.all;
} while (EDANShady.CANES.bit.CCE!= 1);//等待 CCE 位被置位。 <--  在使用20Kbps 进行通信后,尝试设置为1Mbps 时会在这里挂起--见下面的注释

ecanregs->CANBTC.all = ECanShady.CANBTC.all;

/*以下块仅用于100MHz SYSCLKOUT。
请参阅文件末尾的注释。
波特率= SYSCLKOUT/((BRP+1)* BT)
位时间=(TSEG1reg + 1)+(TSEG2reg + 1)+ 1
*
开关(CBR)

//设置预分频器- orig BRPREG 为2
案例 CANBaud1000000:
// 100MHz/((9 + 1)* 10)= 1MHz
ECANShady.CANBTC.bit.BRPREG = 9;
中断;
CANBaud50000案例:
ECANShady.CANBTC.bit.BRPREG = 19;
中断;
案例 CANBaud250000:
ECANShady.CANBTC.bit.BRPREG = 39;
中断;
案例 CANBaud125000:
ECANShady.CANBTC.bit.BRPREG = 79;
中断;
案例 CANBaud50000:
ECANShady.CANBTC.bit.BRPREG = 199;
中断;
案例 CANBaud20000:
ECANShady.CANBTC.bit.BRPREG = 249;
中断;
默认值:
中断;

if (CBR!= CANBaud20000)

//将 BT 设置为15 =(2+1)+(10+1)+ 1
//原始值为10 BT =(6+1)+(1+1)+ 1
ECANShady.CANBTC.bit.TSEG2REG = 1;//2;// 1时间段2 <-采样启动
ECANShady.CANBTC.bit.TSEG1REG = 6;//10;//6时间段1 <-采样在采样开始前存在

其他

ECANShady.CANBTC.bit.TSEG2REG = 4;
ECANShady.CANBTC.bit.TSEG1REG = 13;

ECANShady.CANBTC.bit.SAM = 1;//采样点设置
ecanregs->CANBTC.all = ECanShady.CANBTC.all;

ECANShady.CANMC.ALL = ecanregs->CANMC.ALL;
ECANShady.CANMC.bit.CCR = 0;//设置更改配置请求= 0
ecanregs->CANMC.ALL = ECANShady.CANMC.ALL;

//等待 CPU 不再具有更改配置寄存器的权限
操作

ECanShady.canes.all = ecanregs->canes.all;
} while (EDANShady.CANES.bit.CCE!= 0);//等待 CCE 位被清除。
/ /

注意:根据 SPRUEU0–2009年1月、 一旦 CCE 位被清除(作为模块初始化的一部分)、CANRX 引脚必须被感测为高电平、然后才能再次将 CCE 位设置为1。 这是怎么可能的、或者是否有其他方法允许再次更改配置? (此时所有发送和接收都已完成。)

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

    在总线空闲期间、CANRX 管脚持续处于高电平。 所有发送/接收完成也意味着总线空闲。 在这种情况下、CANRX 引脚应该确实是高电平并且器件应该能够将 CCE 设定为1。 代码卡在该循环中时、您是否检查了 CANRX 引脚的电平? 这种行为是否一致、或者您只是间歇性地看到它?

    [引用 userid="352848" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1040732/tms320f2808-changing-can-baud-rate-from-1-value-to-another "]是否有其他方法允许再次更改配置?

    更改位定时的唯一方法是设置 CCR 位、检查 CCE 是否被置位、然后继续更新 CANBTR。

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

    感谢您的回复。 卡在环路中时、CANRXA、GPIO30、卡在环路中时为3.3伏。 卡在环路中的行为是一致的-这种情况一直发生、因为我在 CCE = 0后尝试更改 CAN 配置。  

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

    Jeff、

      在私人对话中、您提到 eCAN 并不传输您认为它在传输的内容、而是需要对其进行调试。 将等待您的更新。

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

    我已经从 CAN 器件中解析了 Txing 和 Rxing。 但是、我得到以下错误:

    CANES 0x00200000 - CRC 错误。

    是否要清除此位以查看这是否是阻止我更改 CAN 配置的原因?  

    此外、逻辑分析仪正在向我展示 F2808似乎正在输出其他可能导致 CRC 错误的位? 观察某些高电平信号中的"x"。 定义为0x00的数据字段显示至少1个带有"x"的高电平位。 我认为错误校正可能发生在另一端、因为我能够获得正确的 CAN 响应。 为什么神秘的"x"位? 请参阅上面的 BRPREG 和 TSEG[1、2]设置。 (这些位也存在为什么在单序列模式中使用 O'Scope"、因此它不是逻辑分析仪异常。)

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

    CRC 错误正在尝试告诉您一些问题。 您不会因为什么而设置错误位。

    CCR 位也已设置。 请注意、如果节点脱离总线、该位将被置位。

    [引用 userid="352848" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1040732/tms320f2808-changing-can-baud-rate-from-1-value-to-another/3851127 #3851127"] F2808似乎列出了其他位[/引用]

    这些是由发送器插入的填充位。 在 CAN 传输中是预期的。

    [引用 userid="352848" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1040732/tms320f2808-changing-can-baud-rate-from-1-value-to-another/3851127 #3851127"]我认为错误更正可能发生在另一端

    CAN 中没有纠错功能、仅进行错误检测。 如果帧的任何部分出现错误,其它节点将检测到该错误,发送错误帧并销毁该帧。  

    [引用 userid="352848" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1040732/tms320f2808-changing-can-baud-rate-from-1-value-to-another/3851127 #3851127"]这些位也存在为什么在单序列模式下使用 O'Scope[/quot]

    您的示波器是否能够在 CAN 帧上触发? 无论如何、我认为示波器屏幕仍会显示这些位、因为它们应该忠实地捕获总线活动。  

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

    丢脸! 我错误地读取了内存浏览器。 请参阅图像:

    但是 、仍然存在无法复位配置请求位的问题。 我可以做什么来 重新授予更改配置寄存器的权限?

        /*******************************************************************/
        /* Configure bit timing parameters for eCANx*/
        ECanShadow.CANMC.all = ecanregs->CANMC.all;
        ECanShadow.CANMC.bit.CCR = 1 ;            // Set Change Configuration Request = 1
        ecanregs->CANMC.all = ECanShadow.CANMC.all;
    
        // Wait until the CPU has been granted permission to change the configuration registers
        do
        {
            ECanShadow.CANES.all = ecanregs->CANES.all; // <== HANGS HERE FOREVER 2ND TIME
        } while(ECanShadow.CANES.bit.CCE != 1 );       // Wait for CCE bit to be set..

    我甚至尝试仅从1Mbps 到1Mbps 进行测试、而不是从20Kbps 到1Mbps、但结果是相同的。

    此外、我实现了良好的20Kbs 传输(尝试1Mbps 时也是如此)、因为我能够从另一个 CAN 器件请求信息、并且我正在恢复预期。

    找到的问题:似乎我第一次调用 UpdateECanRate(),是在 EALLOW...EDIS 例程中,但对同一函数的外部调用无法设置更新 CANBTC 寄存器所需的 EALLOW...EDIS 区域。

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

    不启用 EALLOW 是一个常见的错误。 我在 www.ti.com/lit/spra876的调试提示中提到了这一点