您好! 我的 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。 这是怎么可能的、或者是否有其他方法允许再次更改配置? (此时所有发送和接收都已完成。)