andreichk 0 24 марта, 2018 Опубликовано 24 марта, 2018 · Жалоба Привет народ, кто может помочь дописать модуль на верилоге для инициализации 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 Приветствуется любая помощь. Заранее спасибо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 25 марта, 2018 Опубликовано 25 марта, 2018 · Жалоба // 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); подключил микроблейз к спартану. Поморгал светодиодами и инициализировал УАРТ. Проверил осциллографом пины УАРТА, Точно вижу, что шлёт указанные байты. Но остались непонятки с синтаксисом. Кто подстажет, как это описать на Си в микроблейзе? Спасибо заранее.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 27 марта, 2018 Опубликовано 27 марта, 2018 · Жалоба вобщем мы подумали и я решил: выкинуть УАРТ и выводить команды прямо в паралельный порт, с которого адресо-командо байты передаются в СПИ модуль в спартане. выглядит это так: код в микроблейзе: //================================================================================ = // //================================================================================ = #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" //================================================================================ = получилась вот такая картинка. вобщем , что посылаю, то и получаю..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться