matlab_23550/Inu/Src/N12_Xilinx/x_parallel_bus.c
Razvalyaev 7e0063eee0 #3 Скомпилилось, но пока ничего не вызывается
Все основные файлы подтянуты без изменений

Изменены (только папка main_matlab):
- заглушки для ненужных функций (main_matlab.c)
- iq библиотека (IQmathLib_matlab.c)
- библиотеки DSP281x
2025-01-13 11:09:58 +03:00

239 lines
7.0 KiB
C
Raw Blame History

#include "x_parallel_bus.h"
#include "MemoryFunctions.h"
#include "Spartan2E_Adr.h"
#include "Spartan2E_Functions.h"
#include "xp_controller.h"
#include "xerror.h"
X_PARALLEL_BUS x_parallel_bus_project = X_PARALLEL_BUS_DEFAULTS;
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_run_cmd(X_PARALLEL_BUS *v)
{
volatile unsigned int d_wr;
d_wr = ( (v->flags.bit.cmd_start & 0x1) << 15 ) | ( (v->setup.setup_error_count_read & 0xf) << 8 ) | ((v->setup.size_table - 1) & 0xff);
WriteMemory(ADR_PARALLEL_BUS_CMD, d_wr);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_clear_table(X_PARALLEL_BUS *v)
{
v->setup.size_table = -1;
v->setup.free_table = -1;
v->flags.bit.cmd_start = 1;
x_parallel_bus_run_cmd(v);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
int x_parallel_bus_check_free_table(X_PARALLEL_BUS *v)
{
if ( (v->setup.size_table + v->setup.tms_adr_data_start) <= v->setup.tms_adr_data_finish)
{
return 1;
}
return 0;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_add_table(X_PARALLEL_BUS *v)
{
volatile unsigned int d_wr;
if (v->flags.bit.started)
{
v->stop(v);
}
// if (v->setup.size_table != 0)
// v->setup.size_table++;
if ( (v->setup.size_table + v->setup.tms_adr_data_start) > v->setup.tms_adr_data_finish)
{
// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!!!
xerror(xparall_bus_er_ID(1),(void *)0);
return;
}
d_wr = v->setup.size_table & 0xff;
WriteMemory(ADR_PARALLEL_BUS_ADR_TABLE, d_wr);
d_wr = ( (v->slave_addr & 0xf) << 12 ) | ( (v->reg_addr & 0xf) << 8 ) | (( (v->setup.tms_adr_data_start & 0xff) + v->setup.size_table) & 0xff);
WriteMemory(ADR_PARALLEL_BUS_SET_TABLE, d_wr);
v->setup.free_table = (v->setup.tms_adr_data_finish - v->setup.tms_adr_data_start) - v->setup.size_table;
// x_parallel_bus_run_cmd(v);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_start(X_PARALLEL_BUS *v)
{
if (v->setup.size_table != 0)
{
v->flags.bit.error = 0;
v->flags.bit.cmd_start = 1;
v->flags.bit.was_started = 0;
x_parallel_bus_run_cmd(v);
v->flags.bit.started = 1;
}
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_stop(X_PARALLEL_BUS *v)
{
v->flags.bit.cmd_start = 0;
x_parallel_bus_run_cmd(v);
v->flags.bit.started = 0;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_restart(X_PARALLEL_BUS *v)
{
v->flags.bit.cmd_start = 0;
x_parallel_bus_run_cmd(v);
v->flags.bit.started = 0;
v->flags.bit.error = 0;
v->flags.bit.cmd_start = 1;
x_parallel_bus_run_cmd(v);
v->flags.bit.started = 1;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_init(X_PARALLEL_BUS *v)
{
if (v->flags.bit.init)
return;
v->setup.size_table = 0;//-1;
v->setup.tms_adr_data_start = ADR_FIRST_FREE;
v->setup.tms_adr_data_finish = ADR_LAST_FREE;
v->setup.setup_error_count_read = MAX_WAIT_ERROR_PARALLEL_BUS;
v->setup.free_table = v->setup.tms_adr_data_finish - v->setup.tms_adr_data_start;
v->flags.all = 0;
v->slave_addr = 0;
v->reg_addr = 0;
v->error_count_start = 0;
v->count_read = 0;
v->stop(v);
v->flags.bit.init = 1;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void x_parallel_bus_read_status(X_PARALLEL_BUS *v)
{
// volatile unsigned int d_rd;
static unsigned int prev_error = 0;
T_controller_read r_c;
// check prev status?
if (v->flags.bit.error)
return;
// read status bus
r_c.errors_buses.all = i_ReadMemory(ADR_BUS_ERROR_READ);
v->flags.bit.count_error = r_c.errors_buses.bit.count_error_pbus;// ((d_rd >> 8) & 0xf);
v->flags.bit.slave_addr_error = r_c.errors_buses.bit.slave_addr_error; // ((d_rd >> 4) & 0xf);
if ( v->flags.bit.count_error >= v->setup.setup_error_count_read )
{
v->flags.bit.error = 1;
}
else
v->flags.bit.error = 0;
if ((prev_error != v->flags.bit.error ) && (v->flags.bit.error))
{
v->error_count_start++;
if (v->flags.bit.started)
{
v->flags.bit.was_started = 1;
x_parallel_bus_stop(v);
}
}
prev_error = v->flags.bit.error;
if ( v->flags.bit.started && (v->flags.bit.error == 0))
v->count_read++;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
#pragma CODE_SECTION(x_parallel_bus_read_one_data,".fast_run");
void x_parallel_bus_read_one_data(X_PARALLEL_BUS *v)
{
// read data from parallel bus
v->data_table_read = i_ReadMemory(ADR_FIRST_FREE + v->adr_table_read);
}
////////////////////////////////////////////////////////////////