当前位置:   article > 正文

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

fpga can远程升级

1. 系统搭建

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

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

2,软核程序实现

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

  1. #include <stdio.h>
  2. #include "platform.h"
  3. #include "xil_printf.h"
  4. #include "xil_cache.h"
  5. #include "xil_io.h"
  6. #include "sleep.h"
  7. #include "sys_intr.h"
  8. #include "can_init.h"
  9. #include "can_intr.h"
  10. #define TEST_RX_ONLY
  11. #define MAX_PKT_LEN 8
  12. #define NUMBER_OF_TRANSFERS 20
  13. #define TEST_START_VALUE 1
  14. #define TX_BUFFER_BASE 0x85000000
  15. #define USER_BASE_ADDR 0x45000000
  16. static XCan Can;
  17. static XIntc Intc;
  18. int frame_cnt = 0;
  19. int frame_length = 0;
  20. int recv_frame_done = 0;
  21. void init_intr_sys(void)
  22. {
  23. Init_Intr_System(&Intc);
  24. Intc_Enable(&Intc,CAN_INTR_VEC_ID);
  25. Intc_Start(&Intc);
  26. Init_CanIntr(&Can, CAN_DEVICE_ID);
  27. Can_Setup_IntrSystem(&Intc, &Can, CAN_INTR_VEC_ID);
  28. Setup_Intr_Exception(&Intc);
  29. }
  30. int main(void)
  31. {
  32. // can_frame msg;
  33. int i = 0;
  34. // int frame_length = 0;
  35. // int recv_frame_done = 0;
  36. xil_printf("Can start\r\n");
  37. init_intr_sys();
  38. while(1)
  39. {
  40. if(recv_frame_done) {
  41. xil_printf("frame_length=%d \r\n", frame_length);
  42. Xil_Out32(USER_BASE_ADDR,0x1);
  43. recv_frame_done = 0;
  44. for(i=0;i<frame_length;i++)
  45. {
  46. 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));
  47. }
  48. i = 0;
  49. }
  50. }
  51. }
  52. void can_RecvHandler(void *CallBackRef)
  53. {
  54. XCan *CanPtr = (XCan *)CallBackRef;
  55. u32 recv_data[2];
  56. u32 RxFrame[XCAN_MAX_FRAME_SIZE_IN_WORDS] ={0};
  57. XCan_Recv(CanPtr, RxFrame);
  58. recv_data[0] = RxFrame[2];
  59. recv_data[1] = RxFrame[3];
  60. if(recv_data[0] == 0x5555AAAA && recv_data[1] == 0xAAAA5555){
  61. frame_cnt = 0;
  62. }
  63. else if(recv_data[0] == 0xEEEEFFFF && recv_data[1] == 0xFFFFEEEE){
  64. frame_length = frame_cnt;
  65. recv_frame_done = 1;
  66. frame_cnt=0;
  67. }
  68. else {
  69. Xil_Out32(TX_BUFFER_BASE+frame_cnt*8,recv_data[0]);
  70. Xil_Out32(TX_BUFFER_BASE+frame_cnt*8+4,recv_data[1]);
  71. frame_cnt++;
  72. }
  73. }

3.Flash通信

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/964335
推荐阅读
相关标签
  

闽ICP备14008679号