zynq 7000 sdk下裸机can(ps/pl) 调试

该博客主要介绍了如何在Zynq-7000 SDK环境下配置和调试两个CAN接口,分别位于PS和PL端。首先,通过SDK导入示例代码并计算PS端CAN的波特率为100k,接着详细展示了初始化CAN设备、设置波特率和进入配置模式的过程。然后,使用宇泰8251 USB CAN设备设置相同波特率进行通信测试。PL端的调试步骤与PS类似,需要注意CAN时钟频率来计算波特率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. SDK下打开system.mss文件,如下图所示,import examples导入polled相关例程。

因为我们的设备上有两个can,一个ps端一个pl端的,原理图在can收发器侧一样。

2. ps 端参调试

确定逻辑对ps can的clock配置值,为100M,参考《ug585-Zynq-7000-TRM.pdf》手册,计算can波特率。

波特率=100M/ ((49 +1)*(3 +15 +2)) = 100k

int CanPsPolledExample(u16 DeviceId)
{
	int Status;
	XCanPs *CanInstPtr = &Can;
	XCanPs_Config *ConfigPtr;

	/*
	 * Initialize the Can device.
	 */
	ConfigPtr = XCanPs_LookupConfig(DeviceId);
	if (CanInstPtr == NULL) {
		return XST_FAILURE;
	}
	Status = XCanPs_CfgInitialize(CanInstPtr,
					ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	/*
	 * Run self-test on the device, which verifies basic sanity of the
	 * device and the driver.
	 */
	Status = XCanPs_SelfTest(CanInstPtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	xil_printf("SelfTest successfuly \r\n\r\n");

	/*
	 * Enter Configuration Mode so we can setup Baud Rate Prescaler
	 * Register (BRPR) and Bit Timing Register (BTR).
	 */
	XCanPs_EnterMode(CanInstPtr, XCANPS_MODE_CONFIG);
	while(XCanPs_GetMode(CanInstPtr) != XCANPS_MODE_CONFIG);

	/*
	 * Setup Baud Rate Prescaler Register (BRPR) and
	 * Bit Timing Register (BTR). ps_can_clock = 100M .
	 */
	XCanPs_SetBaudRatePrescaler(CanInstPtr, /*TEST_BRPR_BAUD_PRESCALAR*/ 49);
	XCanPs_SetBitTiming(CanInstPtr, TEST_BTR_SYNCJUMPWIDTH,
				TEST_BTR_SECOND_TIMESEGMENT,

				TEST_BTR_FIRST_TIMESEGMENT);

	/*
	 * Enter Loop Back Mode.
	 */
#define ps_can_clock 100000000  //100M

	XCanPs_EnterMode(CanInstPtr, XCANPS_MODE_SLEEP);
	while(XCanPs_GetMode(CanInstPtr) != XCANPS_MODE_SLEEP);

	xil_printf("ps can bitRate: %lu bps\r\n", ps_can_clock/((49+1)* (3+15+2)));

	/*
	 * Send a frame, receive the frame via the loop back and verify its
	 * contents.
	 */
	Status = SendFrame(CanInstPtr);
	if (Status != XST_SUCCESS) {
		return Status;
	}

	xil_printf("recving ....... \r\n");
	while(1){
	Status = RecvFrame(CanInstPtr);
	}

	return Status;
}

can消息格式:有效负载为DWR, DW2R

 

确定发送id

2. 使用宇泰的 8251 usb can设备,按照说明书设置好can卡,波特率为100k.

sdk启动debug,上来就会发送一帧数据个给外部can设备,使用宇泰can上位机给板子发数据,板子侧添加收数据打印信息。

3. pl 侧can和ps测试过程一样,需要注意can clock是多少,去计算can波特率

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木泽八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值