вобщем мы подумали и я решил: выкинуть УАРТ и выводить команды прямо в паралельный порт, с которого адресо-командо байты передаются в СПИ модуль в спартане.
выглядит это так:
код в микроблейзе:
Код
//================================================================================
=
//
//================================================================================
=
#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"
//================================================================================
=
получилась вот такая картинка. вобщем , что посылаю, то и получаю.....
Эскизы прикрепленных изображений