Перейти к содержанию

    

adc_spi_init

Привет народ, кто может помочь дописать модуль на верилоге для инициализации ADC4245 по заданному описанию?

 

HIGH PERF MODE

echo -en "\x03\x00" > $SPI_DEV

# LVDS CMOS

#echo -en "\x41\x00" > $SPI_DEV

# EN DIGITAL

echo -en "\x42\x08" > $SPI_DEV

# LVDS STRENG

#echo -en "\x45\x00" > $SPI_DEV

# HIGH FREQ MODE CH B

#echo -en "\x4A\x00" > $SPI_DEV

# HIGH FREQ MODE CH A

#echo -en "\x58\x00" > $SPI_DEV

 

# CH A/B TEST PATTERNS

echo -en "\x25\x04" > $SPI_DEV

echo -en "\x2B\x04" > $SPI_DEV

# Start calibration

devmem 0x43C20044 32 0x00000100

sleep 2

ADC_DONE_STATUS=$((`devmem 0x43C20010` & 0x00000003))

if [[ $ADC_DONE_STATUS -eq 3 ]]

then

echo -ne $yellow

echo "Calibration Done"

echo -ne $normal

else

echo -ne $lightred

echo "Calibration Failed"

echo -ne $normal

fi

# Stop calibration

devmem 0x43C20044 32 0x00000000

# CH A/B Normal mode

echo -en "\x25\xC0" > $SPI_DEV

echo -en "\x2B\x00" > $SPI_DEV

 

предполагаю, что начало должно выглядеть так:

 

`timescale 1ms / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Module Name: adc_spi  настройка ацп по спи
//////////////////////////////////////////////////////////////////////////////////
module adc_spi_init(
  // Clock
  input wire clock,
  input wire init_en,
  // ADC Out
  output  reg adc_sload,
  output wire adc_sclk,
  output  reg adc_sdata
);

reg [7:0]HIGH_PERF_MODE = 8'h03 & 8'h00;      // HIGH_PERF_MODE
reg [7:0]LVDS_CMOS = 8'h41 & 8'h00;           // LVDS_CMOS

reg [7:0]EN_DIGITAL = 8'h42 & 8'h08;          // EN_DIGITAL
reg [7:0]LVDS_STRENG = 8'h45 & 8'h00;         // LVDS_STRENG

reg [7:0]HIGH_FREQ_MODE_CH_B = 8'h4A & 8'h00; // HIGH_FREQ_MODE_CH_B
reg [7:0]HIGH_FREQ_MODE_CH_A = 8'h58 & 8'h00; // HIGH_FREQ_MODE_CH_A

reg [7:0]CH_A_TEST_PATTERNS = 8'h25 & 8'h04;  // CH_A_TEST_PATTERNS
reg [7:0]CH_B_TEST_PATTERNS = 8'h2B & 8'h04;  // CH_B_TEST_PATTERNS

always @ ( posedge clock )

  begin
..........................................

end

endmodule

 

Приветствуется любая помощь. Заранее спасибо...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// HIGH PERF MODE
          xil_printf("%b", 0x03, 0x00 );
// LVDS CMOS
          xil_printf("%b", 0x41, 0x00);
// EN DIGITAL
          xil_printf("%d", 0x42, 0x08);
// LVDS STRENG
          xil_printf("%b", 0x45, 0x00);
// HIGH FREQ MODE CH B
          xil_printf("%b", 0x4A, 0x00);
// HIGH FREQ MODE CH A
          xil_printf("%b", 0x58, 0x00);

// CH A/B TEST PATTERNS
          xil_printf("%b", 0x25, 0x04);
          xil_printf("%b", 0x2B, 0x04);
// Start calibration

                ///    devmem 0x43C20044 32 0x00000100 непонятно как это описать?

             delay(2); // delay one second    sleep 2

                ///ADC_DONE_STATUS=$((`devmem 0x43C20010` & 0x00000003)) непонятно как это описать?

  if( inbyte()== 3 )//читаем ответ  if [[ $ADC_DONE_STATUS -eq 3 ]]
           xil_printf("Calibration Done");
      else xil_printf("Calibration Failed");

                                                    ///fi непонятно как это описать?
// Stop calibration
                            ///devmem 0x43C20044 32 0x00000000 непонятно как это описать?
// CH A/B Normal mode
             xil_printf("%b", 0x25, 0xC0);
             xil_printf("%b", 0x2B, 0x00);

 

подключил микроблейз к спартану. Поморгал светодиодами и инициализировал УАРТ.

Проверил осциллографом пины УАРТА, Точно вижу, что шлёт указанные байты. Но остались непонятки с синтаксисом. Кто подстажет, как это описать на Си в микроблейзе?

Спасибо заранее....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вобщем мы подумали и я решил: выкинуть УАРТ и выводить команды прямо в паралельный порт, с которого адресо-командо байты передаются в СПИ модуль в спартане.

выглядит это так:

код в микроблейзе:

//================================================================================
=
//
//================================================================================
=
#include <pthread.h>
#include <stdio.h>
#include "platform.h"
#include <xparameters.h>
#include <xiomodule.h>
#include <xiomodule_l.h>

XIOModule gpo1;

volatile u16 addr_command[]= {
                                0x0002,// RESET
                                0x0001,// READOUT ENABLE
                                0x0300,// HIGH PERF MODE
                                0x4101,// LVDS/ КАНАЛ "В" ОТКЛЮЧЕН
                                0x4208,// EN DIGITAL
                                0x4500,// LVDS STRENG
                                0x4A00,// HIGH FREQ MODE CH B
                                0x5800,// HIGH FREQ MODE CH A
                                0x2504,// CH A TEST PATTERNS
                                0x2B04,// CH B TEST PATTERNS
                                0x2BC0,// CH B Normal mode
                                0x25C0,// CH A Normal mode
                                0x3D20,// ENABLE OFFSET CORR
                                0xCFBC,// FREEZE OFFSET CORR, OFFSET CORR TIME CONSTANT
                                0x2900,// DATA FORMAT Twos complement
                                0x4200 //, // DIS DIGITAL
                                //0x0000 //
};

volatile u32 ct = 0;
void delay(u32 ms) {
    ct = 0;            // set the counter to 0
    while (ct++ < ms); // wait for ms number of milliseconds
}

int main() {
            XIOModule_Initialize(&gpo1, XPAR_IOMODULE_0_DEVICE_ID);
            XIOModule_Start(&gpo1);

            volatile int i = 0;
             for (i = 0; i < 16; ++i) {
                                XIOModule_DiscreteWrite(&gpo1, 1, addr_command[i]);// отправка команд в АЦП
                                delay(2);
                            }
   return 0;
}

 

и приёмник в спартане:

 

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Create Date:    26/03/2018 
// Module Name:    SPI_Master 
// SPI интерфейс для ADS4245
// Serial Data Input. This device has a 16-bit shift register.
//////////////////////////////////////////////////////////////////////////////////
module SPI_Master16(
      input clk,
     input [15:0]IN_Data,
      output reg CS,
      output reg SDATA,
      output reg SCLK
);
     
reg  [5:0] cnt;
reg  [9:0] DataRate;
reg  [4:0] ByteCaunt;
reg [15:0] DataINReg;

//------------------------------------------------
//Формирования тактовых импульсов и последовательных данных      
always @(posedge clk)
       begin
     
        if (CS == 0) begin
             cnt = cnt + 1'b1;
                      
                if (cnt == 12) begin
                    SCLK = 0;
                  SDATA = DataINReg [15 - ByteCaunt];                    
                        
                end
          
                if (cnt == 24) begin
                  
                          ByteCaunt = ByteCaunt + 1'b1;
                    SCLK = 1;
                      cnt = 0;
                        
                end
                  
          end else begin
          
                    SCLK = 1;
                      cnt = 0;
                  ByteCaunt =0;
                        SDATA = 0;
         end                        
          
   end         
//-----------------------------------------------
//-----------------------------------------------
// Формирование частоты обновления и чип селекта
// 120.88 МГц тактовые импульсы
// Поступающие данные 5 MГц
always @(posedge clk)
       begin
         
            DataRate = DataRate + 1'b1;
          
            if (DataRate == 256) begin
             
                  CS = 0;
                  
            end
          
            if (DataRate == 640) begin
             
                  CS = 1;
                  
                  DataRate = 0;
            end         

      end
//-----------------------------------------------

always @(posedge clk)
       begin
         
           DataINReg = IN_Data;
         
         end

endmodule

 

//===============================================================================
//--------------------- ВСТРОЕННЫЙ ПРОЦЕССОР MICROBLAZE  ------------------------
//===============================================================================
wire [15:0]GPO1;   
reg  [15:0]data16;
wire ADS_CS, ADS_SDATA, ADS_SCLK;
microblaze_mcs_v1_4 mcs_0 (
                          .Clk(res_clkA),   //  input clk
                          .Reset(resetS0),  //  input Reset
                          .GPO1(GPO1[15:0]) // output [15 : 0] GPO1
);
//===============================================================================
//--------------------- ИНИЦИАЛИЗАЦИЯ И КАЛИБРОВКА ADS4245 ----------------------
//===============================================================================
SPI_Master16 ADS4245(
                    .clk(res_clkA),      //
                    .IN_Data(GPO1[15:0]),//входные данные 16bit
                     .CS(ADS_CS),
                     .SDATA(ADS_SDATA),
                     .SCLK(ADS_SCLK)
);
assign RESET = GPO1[1];  //"C14" '0' для управления по СПИ
assign SCLK  = ADS_SCLK; //"D15" 
assign SDATA = ADS_SDATA;//"C16" 
assign SEN   = ADS_CS;   //"D17"
//================================================================================
=

 

получилась вот такая картинка. вобщем , что посылаю, то и получаю.....

 

post-16143-1522171564_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация