njithjw的个人空间 https://blog.eetop.cn/505866 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

microblaze通过串口读写FPGA内部axi4总线上的寄存器

已有 2708 次阅读| 2017-12-18 18:34 |个人分类:FPGA_Verilog|系统分类:硬件设计

对于一个几乎没有用过xilinx器件的,一个毕业后就没怎么写过C的人来说,做到能用就行了(反正也只是辅助调试,反正我以后还可以再优化(估计这辈子都不会再看这个代码)),其它的也不敢要求更多。

vivado的易用性实在是……,想死的心都有了

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xuartlite_i.h"
#include "xuartlite_l.h"
#include "xuartlite.h"
#include "xparameters.h"

#define UART_RCV_BUF_SIZE 20
#define UARTLITE_BASEADDR XPAR_AXI_UARTLITE_0_BASEADDR
u8 rcv_buf[UART_RCV_BUF_SIZE];

void log_print();
u8 AsciiToHex(u8 InAscii);
int HexToASCII(u8 *HexBuf, int NumBytes, u8 *SendBuf);

int main()
{
    init_platform();

    log_print();

    int i ;
    u32 addr;
    u32 data;
    xil_printf("write operation format\n\r");
    xil_printf("w 0001 12345678\n\r");
    xil_printf("read operation format\n\r");
    xil_printf("r 0001\n\r");
    xil_printf("********************************************************************************\n\r");

    while (1) {
    if (!XUartLite_IsReceiveEmpty(UARTLITE_BASEADDR)) {
    for (i = 0; i< UART_RCV_BUF_SIZE; i++) {
    rcv_buf[i] = XUartLite_RecvByte(UARTLITE_BASEADDR);
    if (rcv_buf[i] == 13) {
    break;
    }
    XUartLite_SendByte(UARTLITE_BASEADDR,rcv_buf[i]);
    }
    xil_printf("\n\r");
    }

addr =  (AsciiToHex(rcv_buf[2]) << 12) + (AsciiToHex(rcv_buf[3]) << 8) +
(AsciiToHex(rcv_buf[4]) << 4) + (AsciiToHex(rcv_buf[5]) << 0);
    if ((rcv_buf[0] == 'w') | (rcv_buf[0] == 'W')) {
    data =  (AsciiToHex(rcv_buf[7]) << 28) + (AsciiToHex(rcv_buf[8]) << 24) +
(AsciiToHex(rcv_buf[9]) << 20) + (AsciiToHex(rcv_buf[10]) << 16) +
(AsciiToHex(rcv_buf[11]) << 12) + (AsciiToHex(rcv_buf[12]) << 8) +
(AsciiToHex(rcv_buf[13]) << 4) + (AsciiToHex(rcv_buf[14]) << 0);
//    xil_printf("write data = %x\n\r",data);
//    xil_printf("write address = %x\n\r",addr);
    Xil_Out32(XPAR_AXI4_CPU_REG_IP_0_S00_AXI_BASEADDR + (addr<<2), data);
    xil_printf("%08x\n\r",Xil_In32((XPAR_AXI4_CPU_REG_IP_0_S00_AXI_BASEADDR) + (addr<<2)));
    for (i=0;i<UART_RCV_BUF_SIZE;i++)
    rcv_buf[0] = '0';
    }
    else if ((rcv_buf[0] == 'r') | (rcv_buf[0] == 'R')) {
//    xil_printf("read fpga reg\n\r");
//    xil_printf("addr = %x\n\r",addr);
    xil_printf("%08x\n\r",Xil_In32((XPAR_AXI4_CPU_REG_IP_0_S00_AXI_BASEADDR) + (addr<<2)));
    for (i=0;i<UART_RCV_BUF_SIZE;i++)
    rcv_buf[0] = '0';
    }
    }

    cleanup_platform();
    return 0;
}

void log_print()
{
xil_printf("********************************************************************************\n\r");
xil_printf("********************************************************************************\n\r");
xil_printf("**************************Welcome to Microblaze System**************************\n\r");
xil_printf("********************************************************************************\n\r");
xil_printf("********************************************************************************\n\r");
xil_printf("\n\n\n\r");
}

u8 AsciiToHex(u8 InAscii)
{
u8 HexVal;
if (((InAscii >= 0x41) & (InAscii <= 0x46)) | ((InAscii >= 0x61) & (InAscii <= 0x66)))
{
HexVal = (InAscii & 0x0F) + 0x9;
} else if ((InAscii >= 0x30) | (InAscii <= 0x39)) {
HexVal = InAscii - 0x30;
} else {
return XST_FAILURE;
}
//xil_printf("ASCII To HEX: %0x - %0x\n", InAscii, HexVal);
return HexVal;
}

int HexToASCII(u8 *HexBuf, int NumBytes, u8 *SendBuf)
{
int Index=0, localIndex=0;
u8 Value, intVal;

for (Index = 0; Index < NumBytes; Index++)
{
//xil_printf("HexToASCII: Byte = %0x\n", HexBuf[Index]);
localIndex = 2 * Index;
Value = HexBuf[Index];
//- Handle upper nibble
intVal = Value >> 4;
if (intVal > 9)
SendBuf[localIndex] = intVal + 0x37;
else
SendBuf[localIndex] = intVal + 0x30;
//- Handle lower nibble
intVal = Value & 0x0F;
if (intVal > 9)
SendBuf[localIndex + 1] = intVal + 0x37;
else
SendBuf[localIndex + 1] = intVal + 0x30;
//xil_printf("HexToASCII: upper nibble = %0x, Lower nibble = %0x\n", SendBuf[localIndex], SendBuf[localIndex+1]);
}
return (localIndex + 2);
}


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 17

    评论
  • 3512

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 08:49 , Processed in 0.015792 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部