在已有的硬件平台上根据原理图增加参数配置:
之前创建的工程都是通过PS UART0打印调试信息。开发板还有一个PL UART。该UART由PL侧(BANK35)的引脚通过USB转串口芯片(CH340X)转成USB接口的。PS端的UART1可以通过EMIO的方式扩展到PL侧的这两个引脚上。这次我们就通过该串口输出调试信息。
CAN也是通过EMIO的方式扩展到PL侧的B35_IO0和B35_IO25引脚上
UART1原理图:UART1通过EMIO的方式扩展到PL侧的B35_L20_P和B35_L20_N引脚上
配置界面:
在clock配置页面可以配置CAN的时钟,后面配置CAN的波特率和采样点需要用到这个时钟。
点击OK,同样,右击CAN_0,UART_1_0,点击Make External,软件会自动在顶层模块中自动生成与CAN_0,CAN_0,UART_1_0 接口对应的外部引脚:进行后续操作:
根据原理图配置完成界面:
综合、实现、生成bitstream后,导出新.xsa文件
在vitis里面平台工程更新一下:右击创建的平台工程,点击Update Hardware Specification:选择.xsa文件路径,出现以下弹框,点击OK,说明更新成功。
由于我们要通过EMIO方法用UART1打印调试信息,而平台默认是用UART0打印,所以我们要修改一些平台信息,即BSP信息:
同样,虽然有俩个Board Support Package,但一定修改的是下面的内容,修改上面的不会有效果。最后点击OK。
打开Board Support Package->Modify BSP Setting->standalone将ps7_uart_0修改为ps7_uart_1。这样标准输入输出的串口就被指定到ps uart1上了。
代码中的体现:
然后重新build平台工程。
接着进行应用工程的创建,唯一不同的点在选择模板时选择空的.c文件。
将我们提供的例子里的源码添加到工程中。你也可以参考vitis中自带的测试工程。一般路径在vitis在安装目录下:Xilinx\Vitis\2021.1\data\embeddedsw\XilinxProcessorIPLib\drivers。
ZYNQ7020的CAN波特率配置需要通过设置CAN控制器寄存器来实现。具体来说,需要计算并设置CAN_BTR0和CAN_BTR1寄存器的值,以达到所需的波特率和采样点。
以下是更详细的步骤和解释:
首先,需要明确所需的CAN波特率,例如500kbps或1Mbps。同时,也需要确定采样点,通常建议设置为85%左右。
有关采样点的配置,根据CiA(CAN in Automation)的建议是: (1)一般配置在75-80%的位置 (2)选择采样点位置在85%左右为佳 (3)波特率 > 800K:75% 波特率 > 500K:80% 波特率 <= 500K:87.5%
波特率及采样点配置都需要参考下图来计算
Sync Segment:同步段(sync_seg ) Propagation Segment : 传播时间段(prop_seg ) Phase Segment 1 :相位缓冲段1(phase_Seg1 ) Phase Segment 2 :相位缓冲段2(phase_Seg1 )
根据CAN控制器的技术手册,波特率和采样点与BTR0和BTR1寄存器的关系如下:
公式:
波特率计算:Bit Rate = Fpclk / ( (1+BRP) * (1 + (1+TSEG1) +(1+ TSEG2) )
采样点计算:SamplePoint = (sync_seg + prop_seg + phase_seg1)/(sync_seg + prop_seg + phase_seg1 + phase_seg2)×100%
其中:
Fpclk 是CAN控制器时钟频率。
BRP 是CAN_BTR0寄存器的低8位,控制分频系数。
TSEG1 和 TSEG2 是CAN_BTR1寄存器的相应位,控制时间段1和时间段2的长度。
采样点:采样点通常用百分比表示,例如87.5%。它表示在位时间中,采样点相对于位时间的比例。
举例:如果Fpclk是50MHz,目标波特率为500kbps,采样点为87.5%,可以计算出BRP = 2,TSEG1 = 12,TSEG2 = 3, 对应的CAN_BTR0 = 0x02,CAN_BTR1 = 0x13。
在ZYNQ7020的CAN控制器中,找到对应的寄存器,并将计算出的值写入CAN_BTR0和CAN_BTR1。
完成寄存器配置后,需要启动CAN控制器,使其进入工作状态。
按照IIC文档的编译调试步骤即可。
需要注意的是,这次和电脑连接的USB串口改为开发板上的PL_UART。
CAN通信测试通常需要至少两个独立的CAN通道,其中一个作为发送端(Tx),另一个作为接收端(Rx),以验证数据的完整收发功能。目前开发板仅有单个CAN通道,所以无法直接实现自发自收的测试场景。需要单独准备一个CAN设备。
如果没有CAN设备,只能进行回环测试:
回环模式调试结果如下:
如果有另一个CAN设备,则可以进行普通模式。
如果使用我们的两个开发板,在一台电脑上,使用两个vitis分别通过jtag口调试两个开发板的CAN通信,则需要先要配置一下jtag端口。
默认情况下,jtag仿真器的端口是3121。如果两个仿真器要分别连接到开发板,则需要给不同的仿真器指定不同的端口。
x# 仿真器默认的端口是127.0.0.1:3121,所以需要给不同的仿真器指定不同的端口# 1.查询仿真器的JTAG port# 在xilinx software command line tool中执行以下命令connectjtag ta
# 至此会列出所有的jtag设备,得到两个jtag port:0ABC01和0ABC00#1 my vendor co my board 0ABC01# 2 arm_dap (idcode 4ba00477 irlen 4)# 3 xc7z020 (idcode 23727093 irlen 6 fpga)#4 vtino vtino board 0ABC00# 5 arm_dap (idcode 4ba00477 irlen 4)# 6 xc7z020 (idcode 23727093 irlen 6 fpga)# 将0ABC01绑定到3121端口,将0ABC00绑定到3122端口,执行以下命令hw_server -s tcp::3121 -e "set jtag-port-filter 0ABC01" #这句也可以不执行,因为默认就是分配到3121端口的# 再开一个命令窗口,执行以下命令:hw_server -s tcp::3122 -e "set jtag-port-filter 0ABC00"# 执行以上命令后,两个窗口不要关闭
# 如果后面需要端口重新绑定,则可能需要把对应的端口释放netstat -ano | findstr :3121 # 查询占用该端口的PID# 查询结果如下:# TCP 0.0.0.0:3121 0.0.0.0:0 LISTENING 10564
tasklist | findstr 10564 # 找到该任务# 结果如下,然后去任务管理器中将相应的任务杀掉# hw_server.exe 16864 Console 6 23,652 K再在vitis中将相应的工程配置到相应的端口上
调试时选择相应的端口服务:
普通模式调试结果如下,完成发送数据并打印出另个一设备所收到的数据再发过来:
发送的数据:
接收到的数据: