十七、基于软核和CAN搭建FPGA在线升级系统设计

1. 系统搭建

系统主要包含:MicroBlaze软核处理器,Axi-Can控制器,Axi-lite-user用户通信接口,MIG DDR3控制器,中断控制器等。

        设计使用Can接收上位机发送的在线设计程序;在软核中解析Can协议;将烧写程序写到DDR中;利用AXI-LITE用户通信接口,给PL端发送在线更新指令,PL实现将DDR中在线升级程序搬到Flash中。

2,软核程序实现

  CAN接收数据协议主要在Can接收中断中实现;接收完下载数据后,通过完成标志下发在线更新指令;逻辑收到更新指令,搬运数据到Flash。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_cache.h"
#include "xil_io.h"
#include "sleep.h"

#include "sys_intr.h"
#include "can_init.h"
#include "can_intr.h"


#define TEST_RX_ONLY

#define MAX_PKT_LEN  8
#define NUMBER_OF_TRANSFERS 20
#define TEST_START_VALUE  1
#define TX_BUFFER_BASE  0x85000000
#define USER_BASE_ADDR  0x45000000

static XCan  Can;
static XIntc Intc;


int frame_cnt = 0;
int frame_length = 0;
int recv_frame_done = 0;


void init_intr_sys(void)
{
	Init_Intr_System(&Intc);
	Intc_Enable(&Intc,CAN_INTR_VEC_ID);
	Intc_Start(&Intc);
	Init_CanIntr(&Can, CAN_DEVICE_ID);
	Can_Setup_IntrSystem(&Intc, &Can, CAN_INTR_VEC_ID);
	Setup_Intr_Exception(&Intc);
}


int main(void)
{


//	can_frame msg;
	int i = 0;
//	int frame_length = 0;
//	int recv_frame_done = 0;
	xil_printf("Can start\r\n");

	init_intr_sys();

	while(1)
	{

		if(recv_frame_done) {
			xil_printf("frame_length=%d \r\n", frame_length);
			Xil_Out32(USER_BASE_ADDR,0x1);
			recv_frame_done = 0;
			for(i=0;i<frame_length;i++)
			{
				xil_printf("%d,DDR0 = 0x%x; DDR1 = 0x%x\r\n", i,Xil_In32(TX_BUFFER_BASE+i*8),Xil_In32(TX_BUFFER_BASE+i*8+4));
			}
			i = 0;
		}

	}


}


void can_RecvHandler(void *CallBackRef)
{
		XCan *CanPtr = (XCan *)CallBackRef;
		u32 recv_data[2];
		u32 RxFrame[XCAN_MAX_FRAME_SIZE_IN_WORDS] ={0};

		XCan_Recv(CanPtr, RxFrame);

		recv_data[0] = RxFrame[2];
		recv_data[1] = RxFrame[3];

		if(recv_data[0] == 0x5555AAAA && recv_data[1] == 0xAAAA5555){
			frame_cnt = 0;
			}
		else if(recv_data[0] == 0xEEEEFFFF && recv_data[1] == 0xFFFFEEEE){

			frame_length = frame_cnt;
			recv_frame_done = 1;
			frame_cnt=0;
			}
		else {
				Xil_Out32(TX_BUFFER_BASE+frame_cnt*8,recv_data[0]);
				Xil_Out32(TX_BUFFER_BASE+frame_cnt*8+4,recv_data[1]);
				frame_cnt++;
		}

}


3.Flash通信

        Flash通信可见:七、基于FPGA的Flash控制器设计_fpga flash读写_yxiune的博客-CSDN博客

其中Flash clk管脚配置方法:通过原语STARTUPE2

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA的程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。  经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序的在线升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值