OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7827|回复: 3

[其他] microblaze里怎么用spi控制dac的spi接口啊!头大了!

[复制链接]

14

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2021-4-4
在线时间
18 小时
发表于 2021-7-15 09:52:15 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hawkgreen 于 2021-7-15 09:55 编辑

大家好,我最近在做SPI控制外部DAC的实验,但是遇到了很多问题,如果您有相应的经验,请帮我看看我哪里做的有问题:[软件版本VIVADO2019.2VITIS2019.2]
如下图,我在block design中加入的第二个spi模块(第一个spi模块是用来烧写FLASH的),意图是控制外部的DAC,想用ILA抓图发送的数据,所以手动添加了一个SYSTEM_ILA,手动连线到SPI的四根线,并选中4个网络,如下图中的MOSI,MISO,SCKSSn,右键DEBUG,但是正如图所示,只有输出的位置有3个小爬虫,在输入引脚MISO那个线上并没有小爬虫,这个十分困惑。

在生成BIT文件的时候,遇到了CRITICAL WARNING,代码如下:
[Chipscope 16-3] Cannot debug net'system_wrapper_i/axi_quad_spi_1_sck_o'; it is connected between In/Out buffer andIn/Out flip flop having property IOB true.
[Chipscope 16-3] Cannot debug net'system_wrapper_i/system_ila_0/inst/probe2_1'; it is connected between In/Outbuffer and In/Out flip flop having property IOB true.
我理解这个警告时SCK引脚这个不能被用来做debug,但是我想看的话,应该怎么做呢?

还有一个联合调试的问题,我导出XSA,用VITIS写了一个SPI的控制程序,基于SPI例子里的polled mode例子。我仅仅修改了LOOKBACK部分:
    //Status = XSpi_SetOptions(SpiInstancePtr,XSP_MASTER_OPTION |
    //              XSP_LOOPBACK_OPTION);
    Status= XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION );
因为我想将数据发送到SPI BUS上,所以没用XSP_LOOPBACK_OPTION仅仅将SPI设置成MASTER,然后将程序用debug的形式下载到FPGA中,这时在VIVADO界面上就能看到ILA的界面了:
file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
如上图,因为SSn平时是高电平,所以在触发里设置了0作为触发值,点击三角箭头,这样在status里就能看到waiting for trigger了,但是我在VITIS里按F6运行时序的时候,在VIVADO界面并没有抓到触发的波形,请问,是我哪里做的不对吗?
或者谁有用MICROBLAZE里的SPI控制DAC的例子可以给我参考下,自己一步一步摸索下来效率太低了。

VITIS的完整代码如下,和例子基本相同,就是修改了LOOKBACK部分:
#include "xparameters.h"    /* XPAR parameters */
#include "xspi.h"       /* SPI devicedriver */
#include "xspi_l.h"
#include "xil_printf.h"
#define SPI_DEVICE_ID       XPAR_SPI_1_DEVICE_ID
#define BUFFER_SIZE     8
typedef u8 DataBuffer[BUFFER_SIZE];
int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId);
static XSpi  SpiInstance;   /* The instance of the SPI device */
u8ReadBuffer[BUFFER_SIZE];
u8WriteBuffer[BUFFER_SIZE];
int main(void)
{
    int Status;
    Status= SpiPolledExample(&SpiInstance, SPI_DEVICE_ID);
    if (Status != XST_SUCCESS){
        xil_printf("Spi polled Example Failed\r\n");
        return XST_FAILURE;
    }
    xil_printf("Successfully ran Spi polledExample\r\n");
    return XST_SUCCESS;
}
int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId)
{
    int Status;
    u32 Count;
    u8 Test;
    XSpi_Config *ConfigPtr; /* Pointer toConfiguration data */
    ConfigPtr= XSpi_LookupConfig(SpiDeviceId);
    if (ConfigPtr == NULL) {
        return XST_DEVICE_NOT_FOUND;
    }
    Status= XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr,
                  ConfigPtr->BaseAddress);
    if (Status != XST_SUCCESS){
        return XST_FAILURE;
    }
    Status= XSpi_SelfTest(SpiInstancePtr);
    if (Status != XST_SUCCESS){
        return XST_FAILURE;
    }
    if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) {
        return XST_SUCCESS;
    }
    //Status = XSpi_SetOptions(SpiInstancePtr,XSP_MASTER_OPTION |
    //              XSP_LOOPBACK_OPTION);
    Status= XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION );
    if (Status != XST_SUCCESS){
        return XST_FAILURE;
    }
    XSpi_Start(SpiInstancePtr);
    XSpi_IntrGlobalDisable(SpiInstancePtr);
    Test= 0x10;
    for (Count = 0; Count <BUFFER_SIZE; Count++) {
        WriteBuffer[Count]= (u8)(Count + Test);
        ReadBuffer[Count]= 0;
    }
    XSpi_Transfer(SpiInstancePtr,WriteBuffer, NULL, BUFFER_SIZE);
    return XST_SUCCESS;
}
VIVADOBLOCK DESIGN的完整视图如下,估计太小了看不清楚:
file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg


vitis1.png
vitis2.png
vitis3.png

最佳答案

查看完整内容[请看2#楼]

最后还是自己写RTL级的SPI控制协议,然后打包成IP,放到了block design 里
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2021-4-4
在线时间
18 小时
 楼主| 发表于 2021-7-15 09:52:16 | 显示全部楼层
最后还是自己写RTL级的SPI控制协议,然后打包成IP,放到了block design 里
回复

使用道具 举报

14

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2021-4-4
在线时间
18 小时
 楼主| 发表于 2021-7-15 09:58:11 | 显示全部楼层
由于MISO端口无法加debug,又换了一种方法,自己写了一个模块,除了时钟和复位外,就是将四个输入缓冲一下,给到四个输出,如下:
module SPI_BUFFER(
        //system:
        input      clk    ,
        input      rstn   ,
        //SPI in
        output reg i_MISO ,
        input      i_MOSI ,
        input      i_SCK  ,
        input      i_SSn  ,
        //SPI out        
        input      o_MISO ,
        output reg o_MOSI ,
        output reg o_SCK  ,
        output reg o_SSn
);
        reg d_MISO;
        reg d_MOSI;
        reg d_SCK ;
        reg d_SSn ;
        always@(posedge clk or negedge rstn)
        begin
                if(!rstn)
                begin
                        d_MISO<=1'b0;
                        d_MOSI<=1'b0;
                        d_SCK <=1'b0;
                        d_SSn <=1'b1;
                end
                else
                begin
                        d_MISO<=o_MISO;
                        i_MISO<=d_MISO;
                        d_MOSI<=i_MOSI;
                        o_MOSI<=d_MOSI;
                        d_SCK <=i_SCK ;
                        o_SCK <=d_SCK ;
                        d_SSn <=i_SSn ;
                        o_SSn <=d_SSn ;
                end
        end
endmodule
这个模块加入到block design里:

这样,再选4个网络:i_MOSI,i_SCK,i_SSn,o_MISO右键debug就能看到4个小爬虫标示了.
编译的时候又遇到了CRITICAL WARNING:
[Place 30-73] Invalid constraint on register 'system_wrapper_i/axi_quad_spi_1/U0/NO_DUAL_QUAD_MODE.QSPI_NORMAL/IO1_I_REG'. It has the property IOB=TRUE, but it is not driving or driven by any IO element.
[Place 30-73] Invalid constraint on register 'system_wrapper_i/axi_quad_spi_1/U0/NO_DUAL_QUAD_MODE.QSPI_NORMAL/QSPI_LEGACY_MD_GEN.QSPI_CORE_INTERFACE_I/LOGIC_FOR_MD_0_GEN.SPI_MODULE_I/RATIO_NOT_EQUAL_4_GENERATE.SCK_O_NQ_4_NO_STARTUP_USED.SCK_O_NE_4_FDRE_INST'. It has the property IOB=TRUE, but it is not driving or driven by any IO element.
我理解这个警告是说axi_quad_spi_1的io1_i引脚时有IOB属性的,但是它却没有连接到对外引脚上。不知道这个警告是否可以忽略。但是我继续编译,并导出了BIT文件。
在这个基础上还是按照昨天的方法调试,VITIS下载程序,在VIVADO的ILA上做触发,依然没有抓到SSn=0的波形。非常困惑。请问有人用SPI控制过DAC或者ADC的SPI寄存器吗?请帮看下哪里有问题,谢谢。
vitis4.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165312
金钱
165312
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-7-16 02:12:34 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 21:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表