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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...