Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src_hw/axi_adxl345.sv
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ module axi_adxl345 #(
logic out_awfull ;

logic [ 7:0] version_major = 8'h01 ; // read only,
logic [ 7:0] version_minor = 8'h0A ; // read only,
logic [ 7:0] version_minor = 8'h0B ; // read only,
logic [ 6:0] i2c_address = DEFAULT_DEVICE_ADDRESS ; // reg[0][14:8]
logic link_on = 1'b0 ;
logic on_work = 1'b0 ; // reg[0][4]
Expand Down Expand Up @@ -247,6 +247,7 @@ module axi_adxl345 #(
logic has_dt_intr;
logic has_act_intr;
logic has_inact_intr;
logic has_ff_intr;

always_comb begin : has_dataready_intr_proc
if ((int_source_reg[7] & int_enable_reg[7]))
Expand Down Expand Up @@ -284,6 +285,14 @@ module axi_adxl345 #(
has_inact_intr = 1'b0;
end

always_comb begin : has_ff_intr_proc
if (int_source_reg[2] & int_enable_reg[2])
has_ff_intr = 1'b1;
else
has_ff_intr = 1'b0;
end


always_comb begin

int_enable_reg = register[11][2];
Expand Down Expand Up @@ -669,7 +678,7 @@ module axi_adxl345 #(
if (has_st_intr | has_dt_intr | has_act_intr | has_inact_intr)
current_state <= TX_WRITE_ACT_TAP_STATUS_PTR_ST;
else
if (has_dataready_intr)
if (has_dataready_intr | has_ff_intr)
current_state <= TX_WRITE_INTR_DATA_PTR_ST;
else
current_state <= IDLE_ST;
Expand Down
112 changes: 112 additions & 0 deletions src_sw/free_fall_intr/app.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "axi_adxl.h"
#include <time.h>
#include <xscugic.h>

#include <xparameters.h>


int scugic_initialize(XScuGic *ptr, axi_adxl* adxl_ptr);
void adxl_intr_handler(void *callback);

int main(){

init_platform();

axi_adxl adxl_device;
XScuGic gic;

axi_adxl_init(&adxl_device, 0x40030000, 0x40040000);

scugic_initialize(&gic, &adxl_device);

int status = axi_adxl_enable(&adxl_device, 0x53, 10);
if (status != ADXL_OK){
printf("[MAIN] : enable device return code [%d]\r\n", status);
}

status = axi_adxl_calibration(&adxl_device);
if (status != ADXL_OK){
printf("[MAIN] : calibration device return code [%d]\r\n", status);
}

status = axi_adxl_disable_requesting(&adxl_device);
if (status != ADXL_OK){
xil_printf("[MAIN] : disable requests return code : [%d]\r\n", status);
return 0;
}

axi_adxl_set_int_map(&adxl_device, FREE_FALL, 0x00);
axi_adxl_set_thresh_ff(&adxl_device, 0x10);
axi_adxl_set_time_ff(&adxl_device, 0x10);
axi_adxl_int_enable(&adxl_device, FREE_FALL);

volatile int change_mode = 0;
volatile int mode = 0;
while(1){
if (change_mode){

axi_adxl_change_bw(&adxl_device, mode);

change_mode = 0;
}

}
cleanup_platform();
return 0;
}




int scugic_initialize(XScuGic *ptr, axi_adxl* adxl_ptr){

int status = 0;

XScuGic_Config *cfg;

cfg = XScuGic_LookupConfig(XPAR_SCUGIC_0_DEVICE_ID);
if (!cfg){
return XST_FAILURE;
}

status = XScuGic_CfgInitialize(ptr, cfg, cfg->CpuBaseAddress);
if (status != XST_SUCCESS){
return XST_FAILURE;
}

XScuGic_SetPriorityTriggerType(ptr, XPAR_FABRIC_AXI_ADXL345_VHD_0_ADXL_IRQ_INTR, 0x00, 0x3);

status = XScuGic_Connect(ptr, XPAR_FABRIC_AXI_ADXL345_VHD_0_ADXL_IRQ_INTR, (Xil_InterruptHandler)adxl_intr_handler, adxl_ptr);
if (status != XST_SUCCESS){
return XST_FAILURE;
}

XScuGic_Enable(ptr, XPAR_FABRIC_AXI_ADXL345_VHD_0_ADXL_IRQ_INTR);

Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, ptr);
Xil_ExceptionEnable();

return status ;
}

int iter = 0;

void adxl_intr_handler(void *callback){
axi_adxl *ptr = (axi_adxl*)callback;
adxl_cfg_ack(ptr->cfg);

printf("INTR[%5d]\r\n", iter);
iter++;
// axi_adxl_debug(ptr);

// g_coord g;
//
// axi_adxl_get_gravity(ptr, &g);
//
// printf("[x] : %3.3f \t[y] : %3.3f \t [z] %3.3f\r\n", g.x, g.y, g.z);
return;
}

Loading