CAN波特率的计算公式:
baudRate = pClk / (brp[9:0]+1)/(1+(ts1[3:0]+1)+(ts2[2:0]+1))
采样点 = (1+ts1[3:0]+1) / (1+ts1[3:0]+1+ts2[2:0]+1)
需要满足的条件:
tBS1 >= tBS2
tBS2 >= tq
tBS2 >= 2*tSJW
采样点需要满足的条件:
波特率 采样点
<= 500K 87.5%
> 500K 80%
> 800K 75%
'''
计算当前频率下的所有配置的波特率
配置需要满足的条件:
1. tBS1 >= tBS2
tBS2 >= tq
tBS2 >= 2*tSJW
2. 采样点
采样点需要满足的条件:
<= 500K 87.5%
> 500K 80%
> 800K 75%
采样点的计算方式:
smp = (1+TS1)/(1+TS1+TS2)
'''
RST = {
'brp': [],
'pClk': [],
'ts1': [],
'ts2': [],
'baudRate': [],
'sam': []
}
def calc(pClk):
for brp in range(1024):
for ts1 in range(16):
for ts2 in range(8):
baudRate = pClk / (brp+1) / (1+(ts1+1)+(ts2+1))
sam = (2 + ts1) / (3 + ts1 + ts2)
RST['brp'].append(brp)
RST['ts1'].append(ts1)
RST['ts2'].append(ts2)
RST['baudRate'].append(baudRate)
RST['sam'].append(sam)
def findTargetBaudRate(tarBaud):
for i in range(len(RST['baudRate'])):
# 筛选目标波特率的配置
if (tarBaud > RST['baudRate'][i] - 1) and (tarBaud < RST['baudRate'][i] + 1):
# 根据目标波特率筛选合适的配置
''' tBS1 >= tBS2
tBS2 >= tq
tBS2 >= 2*tSJW
'''
if (RST['ts1'][i] >= RST['ts2'][i]) and (RST['ts2'][i] >= 1):
if (RST['sam'][i] > 0.740) and (RST['sam'][i] < 0.88):
print("%d, %d, %d, %f, %f" %
(RST['brp'][i], RST['ts1'][i], RST['ts2'][i], RST['baudRate'][i], RST['sam'][i]))
if __name__ == "__main__":
pClk = float(input("请输入当前的Pclk(Hz), eg: 1000000 为1MHz. :"))
targetBaudRate = float(input('请输入想要得到的目标波特率(Hz):'))
calc(pClk)
print("brp[9:0], ts1[3:0], ts2[2:0], baudRate, sample")
findTargetBaudRate(targetBaudRate)
注意:这里最终的结果为:
1. 计算出的值均为寄存器的原始值,具体是标准库或HAL库中的哪个宏,请自行匹配。。。。。。
2. 计算出的多个匹配的参数,请自行根据采样点进行选择,程序中仅输出了74%–88%的匹配值
![drawing](https://img-blog.csdnimg.cn/f837a7dcfd1a4318aaca64f5adb5eb05.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQmVydGVfWXU=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center#pic_center)