精华内容
下载资源
问答
  • 2021-08-20 15:11:01

    SPI参数化分配寄存器

    SPI的原理请参考:spi 协议驱动设计

    //SPI salve支持功能:
    //支持三线SPI或者四线SPI,通过define切换
    //支持指令长度、帧长自定义
    //工作时钟可自定义,大于SPI clk的2倍
    //只需要修改:几线SPI 单帧长度 指令长度 寄存器开辟
    //注意:指令最高bit表示读写,低写高读,其余bit表示地址
    //指令接着为数据端,二者位宽之和即为SPI单帧长
    
    //`define SPI_LINE  //是否是三线SPI
    `define SPI_FRAME_WIDTH 16  //SPI一帧长度为16
    `define SPI_INS_WIDTH 8     //SPI指令长
    
    module spi_slave(
                input i_clk,//work clk
                input i_rst_n,
                
                input i_spi_clk,//SPI CLK
                input i_spi_cs,//SPI CS
                
                `ifdef SPI_LINE   //条件编译
                     inout io_spi_sdio
                `else
                     input i_spi_mosi,//SPI MOSI
                     output o_spi_miso //SPI MISO
                `endif
        );
        
    //位宽计算函数
    function integer clogb2(input integer depth);
    begin
        for(clogb2 = 0;depth > 0;clogb2 = clo
    更多相关内容
  • 三大通信协议(3)SPI 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示...

    目录

    一、SPI通信协议简介

    二、SPI通信时序

    1.主从通信

    2.模式选择

    三、实例

    总结


    一、SPI通信协议简介

         SPI是串行外设接口(Serial Peripheral Interface)的缩写,是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线,支持全双工通信、通信速率快(可以最高可达几十兆)。适用于主机与外设之间的近距离通信,经常应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间的通信。由于其通信速率快,支持全双工通信,并且占用的引脚数目较少(4根传输线),目前市面上很多芯片都集成了这种通信协议。当然,SPI通信协议也存在自身的缺点,没有指定的流控制,同时也没有相应的应答机制,因此在通信过程中缺乏一定的可靠性。

    二、SPI通信时序

    1.主从通信

           SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时),也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

    2.模式选择

          SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)即在没有数据传输时,时钟的空闲状态的电平和CPHA(时钟相位)即数据的采样时刻两个信号来控制我们主设备的通信模式,

    具体如下:

       如果CPOL被清0,则SCLK在空闲状态保持低电平,反之被置1则保持高电平;如果CPHA位被清0,则在SCLK每个时钟周期的第1个边沿(奇数边沿)进行数据位采样,反之被置1则在SCLK每个时钟周期的第2个边沿(偶数边沿)采样

    三、实例

              该例子是学习了V3学院——尤老师的腾讯课堂SPI接口实例。主机是FPGA,从机是DAC3283,通过FPGA进行写操作,将数据通过SPI协议发送给从机,完成主机与从机之间的单向通信(实质是FPGA通过该协议对DAC中的32个寄存器进行配置)。

        DAC3283内部共有32个寄存器,下图是每个寄存器的使用手则。

      每个寄存器最多可以写入的数据为5Byte,其中第1Byte用于命令传输,包括读写控制、传输字节个数、寄存器地址;剩余Byte用于数据传输,进行寄存器配置。第一个Byte的命令配置如下图所示:

          下图是发送第一个Byte和第二个Byte的时序图:

           设计过程:首先将要发送的命令信息和数据信息存在RAM中,RAM的深度是32(供32个寄存器),位宽是16(8bite的命令和8bite的数据),一次发送16bite信息,共发送32次。每次信息发送之间需要有一定的时间间隔,因此本设计采用状态机的形式进行设计。状态机共包括以下五个状态,上电复位后处于IDLE状态,Work_en拉高,进入到WAIT状态进行等待,等待8个SCLK时钟周期后进入READ_MEM状态,在该状态下将读RAM的地址累加,并将RAM中的数据读出存入到databuff中,等待一个系统周期 后进入WRITE_REG状态,在该状态下进行串并转换,将databuff中的数据输出给spi,同时输出SCLK时钟信号和sdenb使能信号,16个SCLK时钟周期进入WAIT状态,进行下次数据的发送,如果在WRITE_REG状态中检测到32组数据全部发送完毕,则进入STOP状态。在设计过程中应注意SCLK的上升沿对应每次数据的中心位置,保证充足的建立时间和保持时间。下图是对应的状态转移图和Verilog代码。

    状态转移图:

    时序图:

    Verilog代码如下:

    module  spi_ctrl(
              input              sys_clk,
    	  input              sys_res,
    	  input              work_en,
    //	  input              spo,
    	  output     reg     sclk,
    	  output     reg     spi,
    	  output     reg     sdenb
    );
    parameter       IDLE = 5'b00001;
    parameter       WAIT = 5'b00010;
    parameter       READ_MEM = 5'b00100;
    parameter       WRITE_REG = 5'b01000;
    parameter       STOP = 5'b10000;
    reg     [4:0]state;
    reg     [4:0]fre_count;
    wire          sclk_n;
    reg          sclk_p;
    reg          sclk_flag;
    reg     [3:0]wait_cnt;
    reg     [3:0]shift_cnt;//数据移位计数器,前八位为命令位,后八位为数据位
    reg     [4:0]r_addr;//读RAM中的地址计数器   
    reg     [15:0]shift_buff;//存储从RAM中读出的数据
    reg           data_end;
    
    
    wire         wren_sig;
    wire   [15:0]r_data;
      
    
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	     fre_count <= 5'd0;
    	 else if(fre_count == 5'd24)
    	     fre_count <= 5'd0;
    	 else 
    	     fre_count <= fre_count + 1'd1;
    end 
    
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
             sclk_p <= 1'b0;
    	 else if(fre_count == 5'd24)
    	     sclk_p <= ~sclk_p;
    	 else 
    	     sclk_p <= sclk_p;
    end 
    
    assign sclk_n = ~sclk_p;
    
    //sclk_flag 为分频后的时钟sclk_n一个周期的标志
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	    sclk_flag <= 1'b0;
    	 else if(fre_count == 5'd24 && sclk_n == 1'b0)
    	    sclk_flag <= 1'b1;
    	 else 
    	    sclk_flag <= 1'b0;
    end 
    
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	wait_cnt <= 4'd0;
         else if(state == WAIT && sclk_flag)
            wait_cnt <= wait_cnt + 1'b1;
         else if(state != WAIT)
            wait_cnt <= 4'd0;
         else
            wait_cnt <= wait_cnt;
    end 
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	shift_cnt <= 4'd0;
         else if(state == WRITE_REG && sclk_flag)
            shift_cnt <= shift_cnt + 1'b1;
         else if(state != WRITE_REG)
            shift_cnt <= 4'd0;
         else
            shift_cnt <= shift_cnt;
    end 
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	    state <= IDLE;	
         else begin
            case(state)
    		   IDLE:if(work_en)
    		           state <= WAIT;
    				else 
    				   state <= state;
    		   WAIT:if(wait_cnt[3])
    		           state <= READ_MEM;	
    				else
    				   state <= state;
    		   READ_MEM:state <= WRITE_REG;
    		   WRITE_REG:if(shift_cnt == 4'd15 && sclk_flag && data_end)
    						     state <= STOP;
    					 else if(shift_cnt == 4'd15 && sclk_flag)
    						     state <= WAIT;
    					 else
    					     state <= state;
    		   STOP:state <= state;
               default:state <= IDLE; 		   
            endcase		
    	 end 
    end 
    
    always@(posedge sys_clk or negedge sys_res)begin
         if(!sys_res)
    	    r_addr <= 5'd0;
    	 else if(state == READ_MEM)
    	    r_addr <= r_addr + 1'b1;
    	 else
    	    r_addr <= r_addr; 
    end  
    always@(posedge sys_clk or negedge sys_res)
          if(!sys_res)
    	     data_end <= 1'b0;
    	  else if(state == READ_MEM && (&r_addr) == 1'b1)//等价于r_addr == 5‘d31
    	     data_end <= 1'b1;
    	  else
    	     data_end <= data_end;
    
    
    always@(posedge sys_clk or negedge sys_res)begin
       if(!sys_res)
    	    shift_buff <= 16'd0;
    	 else if(state == READ_MEM)
    	    shift_buff <= r_data;
    	 else if(state == WRITE_REG && sclk_flag)
    	    shift_buff <= {shift_buff[14:0],1'b1};
    	 else
    	    shift_buff <= shift_buff;
    end 
    
    always@(posedge sys_clk or negedge sys_res)
         if(!sys_res)
    	    spi <= 1'b0;
    	 else if(state == WRITE_REG)
    	    spi <= shift_buff[15];
    	 else 
    	    spi <= 1'b0;
    
    always@(posedge sys_clk or negedge sys_res)
          if(!sys_res)
    	   sdenb <= 1'b1;
            else if(state == WRITE_REG)
               sdenb <= 1'b0;
            else
               sdenb <= 1'b1;	  
    	   
    always@(posedge sys_clk or negedge sys_res)
          if(!sys_res)
    	     sclk <= 1'b0;
    	  else if(state == WRITE_REG)
    	     sclk <= sclk_p;
    	  else
    	     sclk <= 1'b0;
    
    assign wren_sig = 1'b0;
    ram_16_32_r ram_16_32_r_inst (
        .address ( r_addr ),
        .clock ( sys_clk ),
        .data ( 16'd0 ),
        .wren ( wren_sig ),//写使能高有效,读使能低有效
        .q ( r_data )
        );
    
    endmodule

    仿真验证

    tb测试代码:

    `timescale  1ns/1ns
    module tb_spi_ctrl;
    reg     clk;
    reg     res;
    reg     work_en;
    //wire    spo;
    wire    sclk;
    wire    spi;
    wire    sdenb;
    reg     [15:0]read_mem[31:0];
    reg     [15:0]shift_buffer = 16'd0;
    initial  begin
          clk <= 1'b0;
    	  res <= 1'b0;
    	  #200 res <= 1'b1;
    end
    
    initial  begin
         work_en <= 1'b0;
    	 #250 work_en <= 1'b1;
    end
    
    initial begin
         $readmemb("ram_data.txt",read_mem);
    end 
    initial begin
        rec_spi();
    end 
    
    
    always #10 clk <= ~clk;
    
    task  rec_spi();
       integer  i,j;
       begin
    
            for(i=0;i<32;i=i+1)begin
    		    for(j=0;j<16;j=j+1)begin
    			
    			     @(posedge sclk)
    				 shift_buffer = {shift_buffer[14:0],spi};
    				 if(j == 15 && shift_buffer == read_mem[i])
    				      $display("ok,data index is %d,rec_data is %d,send_data is %d",i,shift_buffer,read_mem[i]);
    				 else if(j == 15)
    				      $display("error");
    			 	  
    			end 
    		end 
    
       end 
    
    endtask
    
    
      spi_ctrl u_spi_ctrl(
             .sys_clk(clk),
    	 .sys_res(res),
    	 .work_en(work_en),
    	// .spo(spo),
    	 .sclk(sclk),
    	 .spi(spi),
    	 .sdenb(sdenb)
    );
      
      
      
    endmodule 

    读取的数据:

    0000000000011111
    0000001010011001
    0000000000011000
    0000001011110110
    0001010101000111
    0000001001001010
    0000001100010001
    0010000101111111
    0001010101011100
    0000011100011100
    0000000000000000
    0000001100010001
    0001011011110011
    0000000001010110
    0000000000000000
    0000001100010001
    0010001010101011
    0000000000000100
    0000001100010001
    0001011011100001
    1101100111101001
    0000000000111000
    0000000001010111
    0000001101101011
    0001111010101110
    0000001000111111
    0000000111001010
    0000000000000000
    0000000001010111
    0000000001010110
    1101010100111011
    0000000111001000

    仿真结果(注意由于调用了ramip核,因此,在仿真的过程中需要添加ramip核生成的.v文件以及库文件altera_mf.v文件):



    总结

            SPI通信协议应用范围十分广泛,接下来将继续学习一下该通信协议的一些例子,比如在FPGA内部对外部Flash进行全擦除或扇区擦除以及FPGA对外部Flash进行读、写操作的实验。

            初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!

    展开全文
  • AD9364 SPI 寄存器配置

    2017-07-21 01:32:15
    本人现在使用arm芯片的spi接口对射频芯片ad9364进行配置,由于寄存器数量繁多,在网上下载了一个寄存器配置软件,帮助我进行寄存器的配置,但是将寄存器内容写入,发射通道始终没有信号。 1、想知道可能是什么原因...
  • 通过AD936x评估软件进行寄存器配置,其中主要包括输入输出接口配置,RF PLL和BB PLL配置,时钟配置,数据接口和通道带宽配置,TX和RX滤波器设置,双工模式和增益配置等。 (1)射频输入输出接口配置如下: (2)参考...

    AD9361配置
    一、FPGA纯逻辑SPI配置寄存器
    通过AD936x评估软件进行寄存器配置,其中主要包括输入输出接口配置,RF PLL和BB PLL配置,时钟配置,数据接口和通道带宽配置,TX和RX滤波器设置,双工模式和增益配置等。

    (1)射频输入输出接口配置如下:
    在这里插入图片描述
    (2)参考时钟和RF & BB PLL配置:
    在这里插入图片描述
    (3)数据接口和通道带宽配置
    设置接口速率,RX&TX通道带宽以及3个HB滤波器的抽取和内插系数的设置,软件会根据设置自动得出ADC CLK和DAC CLK。

    (4)RX端&TX端的滤波器参数设置
    在这里插入图片描述在这里插入图片描述

    曲线表示的是RX和TX端的模拟滤波器响应,数字滤波器响应和级联响应。
    软件在设置TX和RX滤波器之后,还包括了数字接口设置(CMOS&LVDS),TDD&FDD设置,边沿采样模式设置和AGC&MGC增益设置。配置完成后保存并Create Init Script,在随后弹出的小窗口选择Low Level Scripting(文件保存类型选择为.txt)可以生成对应当前配置的完整配置参数文本。

    生成文本也就是我们所需的SPI接口对AD9361寄存器的初始化配置。
    在这里插入图片描述
    在这里插入图片描述
    二、PS端对AD9361配置

    在VIVADO工程界面,如果AD9361的HDL工程已经建立好,接下来就是添加软件驱动端的C文件,我们生成bit流文件然后launch SDK,启动SDK创建空白工程,将我们工程所需的C文件复制到新建工程目录下面的src文件夹下。实现AD9361各个参数配置,对PL中的一些寄存器进行读写,控制发送数据源,通过DMA控制器对发送和接收的数据进行传输,从而实现AD9361对数据的接收、处理和发送,整个程序是使用C语言来完成的。
    进入SRC下我们可以看到很多源文件和头文件,dac_core.h、dac_core.c是模数转换模块控制文件,包括模块的初始化和数据传输等;Platform.c、platform.h是Xilinx平台一些驱动文件;AD9361.c,AD9361.h,AD9361的驱动文件,common.h 通用驱动文件;包含时钟结构体和通用宏定义;
    AD9361_api.c,AD9361_api.h,AD9361应用编程接口驱动文件,如AD9361的初始化函数。

    整个软件的函数配置流程如图所示:
    在这里插入图片描述

    其中按照流程配置函数有:

    console_get_command(received_cmd);
    gpio_init(GPIO_DEVICE_ID);
    gpio_direction(default_init_param.gpio_resetb, 1);
    spi_init(SPI_DEVICE_ID, 1, 0);
    ad9361_init(&ad9361_phy, &default_init_param);
    ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
    ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
    dac_init(ad9361_phy, DATA_SEL_DMA, 1);
    adc_capture(16384, ADC_DDR_BASEADDR);
    Xil_DCacheInvalidateRange(ADC_DDR_BASEADDR, 16384);
    console_get_command(received_cmd);
    

    其中RX和TX端的FIR配置函数ad9361_set_tx_fir_config和ad9361_set_rx_fir_config可按照官方给的案例文件参数配置即可,我们需要修改通道,通路增益,收发通道时钟频率,RF中心频率以及基带频率等只需要用AD9361_InitParam定义出一个新的结构体变量,然后将这个新的结构体变量在gpio_direction()以及ad9361_init()中进行调用即可。

    DAC的初始化函数的参数包括指向AD9361初始化结构体的指针,发送数据源选择以及DMA的配置。数据源可选择DDS生成的信号,通过DMA发送DDR中的信号数据,发送全0信号,发送随机数信号,发送从ADC中接收到的数据信号,发送选定设备的信号和用户数据。

    其中包括了DMA传输部分,对DMAC寄存器配置,实现DDR与AD9361之间的数据传输和直接访问功能,DAC中DMA初始化配置是利用dac_dma_write()函数向dma特定地址中写入参数值,其中包括:

    dac_dma_write(AXI_DMAC_REG_CTRL, 0);//初始化DMA
    dac_dma_write(AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE);//DMA通道使能
    dac_dma_write(AXI_DMAC_REG_SRC_ADDRESS, DAC_DDR_BASEADDR);//设置DMA的传输源地址为DDR的基地址
    dac_dma_write(AXI_DMAC_REG_SRC_STRIDE, 0x0);//设置传输行字节数
    dac_dma_write(AXI_DMAC_REG_X_LENGTH, length - 1);//传输总字节数
    dac_dma_write(AXI_DMAC_REG_Y_LENGTH, 0x0);//传输字节行数
    dac_dma_write(AXI_DMAC_REG_START_TRANSFER, 0x1);//传输开始请求
    

    在ADC初始化和输入捕获设置时,adc_init(struct ad9361_rf_phy *phy),adc_capture(uint32_t size, uint32_t start_address),首先初始化时包括了指向AD9361的射频设备结构体的指针,对ADC的捕获设置时,需设置捕获的数据量以及存储捕获数据的目的地址。同时同DAC一样进行ADC的DMA初始化配置,利用adc_dma_write()和adc_dma_read()函数进行dma特定地址的读出和写入参数操作。其中ADC的DMA的使能,初始化,传输地址和字节设置与DAC相似,但是有两个中断状态的读取和写入操作如下:

    adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, &reg_val);  //读取中断状态
    adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val);  //写入中断状态寄存器,使中断寄存器初始化
    
    展开全文
  • SPI寄存器介绍

    2015-05-05 15:30:04
    SPI寄存器-Bit 7 – SPIE: 使能SPI 中断 Bit 6 – SPE: 使能SPI接口总线模块 Bit 5 – DORD: 数据次序选择位。置位时LSB(发送数据的最低位)首发,否则MSB(数据的最高位)首发。 Bit 4 – MSTR: 主/ 从选择位。...
  • SPI寄存器

    2020-12-28 22:05:36
    引脚配置Pin Mode SPC0 BIDIROE MISO MOSI主模式操作标准 0 X Master In Master Out0 Master In双向 ...

    引脚配置

    Pin Mode SPC0 BIDIROE MISO MOSI

    主模式操作

    标准 0 X Master In Master Out

    0 Master In

    双向 1 1 MISO not used by SPI Master I/O

    从模式操作

    标准 0 X Slave Out SlaveIn

    0 Slave In

    双向 1 1 Slave I/O MOSI not used by SPI

    SPI Baud Rate Register

    Register Address: $___0

    Bit7 6 5 4 3 2 1 Bit0

    R 0 0

    SPPR2 SPPR1 SPPR0 SPR2 SPR1 SPR0

    W RVD RVD

    Reset: 0 0 0 0 0 0 0 0

    注:RVD=保留位

    SPPR2-SPPR0--SPI波特率预选择位

    SPR2-SPR0--SPI波特率选择位

    BaudRateDivisor=(SPPR+1)*2^(SPR+1)

    BaudRate=BusClock/BaudRateDivisor

    SPI Status Register

    Register Address: $___0

    Bit7 6 5 4 3 2 1 Bit0

    R SPIF 0 SPTEF MODF 0 0 0 0

    W RVD RVD RVD RVD RVD RVD RVD RVD

    Reset: 0 0 1 0 0 0 0 0

    注:RVD=保留位

    SPIF-SPIF中断标志位。当SPI数据寄存器接收到一字节的数据时,该位置1。

    将SPI数据寄存器中的数据读出后,该位清零。

    1=新的数据进入SPI数据寄存器

    0=传输还没完成

    SPTEF-SPI发送空的中断标志位。数据寄存器为空,SPTEF为1。读SPISR并写一个数据

    到SPIDR能清零该位。必须读到SPTEF=1后才能写数据到SPIDR,不然SPIDR的写

    入操作无效。而且如果SPICR1寄存器中的SPTIE位为1,则SPTEF将产生一个CPU

    中断请求。当1字节的数据从发送寄存器发送到发送移位寄存器中时,SPTEF自动

    为1.当SPI空闲(没有数据在发送寄存器、移位寄存器,也没有数据在传输)时,

    数据写到SPIDR中,并立即传输到移位寄存器中,SPTEF置1。这时SPTEF置1表示

    发送缓冲区可以接收新数据。如果缓冲区没有数据,则SPTEF简单的保持为SPTEF=1,

    并且没有数据从缓冲区送到移位寄存器。

    1=SPI数据寄存器为空

    0=SPI数据寄存器位满

    MODF-模式错误标志位。在主机方式下,SS为低电平输入,MODF=1.当MODF为1时,读SPI

    状态寄存器,写SPI控制寄存器,然后MODF自动清零。只有在SPI控制寄存器的MODEFN

    位为1时,MODF才能置1。

    1-模式错误

    0-模式没有错误

    SPI Data Register

    Regi

    展开全文
  • 图给出了SPI配置控制寄存器的各位分配情况(地址7040h1),表描述了各位的功能定义。  图 SPI配置控制寄存器(SPICCR)  表 SPI配置控制寄存器功能定义 欢迎转载,信息来源维库电子市场网(www.dzsc.com) ...
  • #1 打开时钟 SPI之间使用的时钟是不同的,SPI0使用的是bus clock ,SPI1使用的是system clock,bus clock 是system clock的一半 ...3对SPI寄存器进行编程 控制状态数据波特率是最基本用到的寄存器 ...
  • 里面包含AD9361-Register-Map英文寄存器手册的全部翻译内容,以及一个SPI配置寄存器样本文件
  • 本文在介绍AD9707的工作原理和典型电路的基础上,着重阐述了通过ARM和FPGA两种方式分别配置AD9707内部寄存器的方法,同时给出了两种配置方法基本操作的具体步骤和相应代码。
  • 使用STM32F405的SPI通信接口对ADS1292R进行寄存器配置的参考代码源文件。
  • SPI分配传感器的寄存器 SPI分配寄存,来驱动传感器。或者将一些指令传出来给UART由PC端来控制。 信号名称 方向 位宽(bit) 说明 spi_com_clk I 1 spi通信模块时钟 sys_rst_n I 1 系统复位,低电平有效 ...
  • 文章目录一、文章简介二、SPI协议三、STM32的SPI外设 一、文章简介 本篇主要介绍SPI总线,第二章讲解SPI协议,首先从硬件入手了解SPI通信协议,接着讲解SPI的四种工作时序模式。第三章介绍STM32的SPI外设。 参考链接...
  • 要完成锁相环的寄存器配置,需要对照协议将锁相环的每一个寄存器所要实现的功能分析清除。从大的方面来讲,寄存器分为系统信息及状态查询型寄存器、功能型寄存器、性能型寄存器,其中第一种寄存器多为只读寄存器,后...
  • AD9516寄存器配置SPI程序
  • AD9779A是目前国内能买到的性能较高的高速DAC芯片,内部集成PLL倍频电路、同步控制、增益控制等功能模块,通过SPI接口和外部通信,可以设置优化各种功能以达到性能。  1 AD9779A简介  AD9779A是Analog Devices...
  • STM32 SPI笔记(基于寄存器

    千次阅读 2018-07-20 15:59:00
    1.说在前面:最近尝试操作VS1053音频模块 使用的数据传输方法使用SPI协议,打算学一下SPI配置方式 2.SPI 2-1:SPI(Secial Periperal interface),作为四线的通信接口,有着MISO MOSI SCLK和CS MISO:主进从出 ...
  • STM32学习------SPI笔记【寄存器版】

    千次阅读 2019-04-04 21:24:11
    模拟SPI 3. 硬件SPI 一、介绍 简述: 1)通常 SPI 通信要求 4 根线,分别是 MOSI(主机输出从机输入), MISO(主机输入从机输出), CLK(时钟线), CS(片选线) 2)当发送和接受数据的工作都准备好了,...
  •  如图 SPI接收移位寄存器和MIMO输入寄存器 由SCK钟控的计数器用来对输入到移位寄存器的数据位进行计数,它也能够能够产生数据传输完毕的指示信号。当数据传输完成,移位寄存器中数据被装入SPI
  • 1、SPI协议简介1.1 SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD...
  • 于是就想起了直接通过操作寄存器的方式来读写。完事开头难,直接从STM32F103C8T6程序上copy了一份出来,程序如下: u8 SPI_W25QWriteRead(u8 data) { u8 spi_wait_time = 0; spi_wait_time = 0; while(((SPI2 -...
  • 该例程用的stm32f103vc...只用了写,没用LMX2594的读,初始化的寄存器数据是用寄存器软件获取的,初始频率好像是9000MHZ,我的项目只需要写,不需要读,工程中不需要改变其他的寄存器 只改变N值就行,所以算法比较简单
  • extern SPI_HandleTypeDef hspi2; #define SWRITE_CMD 0x61 #define SREAD_CMD 0x60 #define SPAGE 0xFF #define STS 0xFE #define SIO 0xF0 void read5396reg(uint8_t page, uin
  • ADC SPI配置FPGA代码

    2018-07-09 20:30:09
    利用ADC的SPI,通过Verilog给出了对常见ADC的配置方法,并给出了详细的注释,易于代码的理解,只需针对自己的实际情况稍加修改便可直接使用
  • 最近正在调试一个芯片的评估板,其中配置寄存器使用的是SPI通信协议。其实很多芯片寄存器配置都用到了SPI通信协议,我们今天就需要实现这个SPI通信协议。首先,我们需要了解SPI协议的基本内容,SPI主要有四根传输...
  • SMT32通过SPI读写FPGA的寄存器

    千次阅读 2020-08-14 21:44:00
    本设计在FPGA用32个寄存器构建了一个8bit*32的ROM,可通过STM32使用SPI写入命令字节来实现对32个寄存器的读写操作。 命令字节的格式: bit 7:读写控制位, 1:W 0:R bit6-bit2:寄存器地址 bit1-bit0:未...
  • TI的3系列ADC的配置软件,可以配置包括ADC34JXX, ADC32JXX, ADC34XX, ADC32XX 的AD芯片,可以根据自己的需求通过SPI接口将数据接口配置成1 wire 或者 2 wire 类型。
  • AD9779A是目前国内能买到的性能较高的高速DAC芯片,内部集成PLL倍频电路、同步控制、增益控制等功能模块,通过SPI接口和外部通信,可以设置优化各种功能以达到最佳性能。  1 AD9779A简介  AD9779A是Analog ...
  • RTC寄存器配置.pdf

    2020-04-01 12:23:26
    I2C、SPI、Register Map、Sleep Mode、Watchdog Timer (WDT)等 详细的rtc寄存器配置pdf
  • SPI controller RTL 代码 APB 总线配置寄存器 带文档5899621281103061Run2536

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,906
精华内容 7,162
关键字:

spi寄存器配置