Skip to content

Commit

Permalink
applications: sdp: mspi: Fixed bit blocking on bus width change
Browse files Browse the repository at this point in the history
Fixed bug where after increasing bus width using buffered registers,
in first clock cycle the mask for previous bus width was still present.

Signed-off-by: Michal Frankiewicz <[email protected]>
  • Loading branch information
mif1-nordic committed Jan 22, 2025
1 parent c1eb1b3 commit 7a4f3ad
Showing 1 changed file with 29 additions and 6 deletions.
35 changes: 29 additions & 6 deletions applications/sdp/mspi/src/hrt/hrt.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,29 @@ static const nrf_vpr_csr_vio_shift_ctrl_t write_final_shift_ctrl_cfg = {
.in_mode = NRF_VPR_CSR_VIO_MODE_IN_CONTINUOUS,
};

static nrf_vpr_csr_vio_shift_ctrl_t xfer_shift_ctrl = {
.shift_count = SHIFTCNTB_VALUE(BITS_IN_WORD / 1),
.out_mode = NRF_VPR_CSR_VIO_SHIFT_OUTB_TOGGLE,
.frame_width = 1,
.in_mode = NRF_VPR_CSR_VIO_MODE_IN_CONTINUOUS,
};

static void hrt_tx(volatile hrt_xfer_data_t *xfer_data, uint8_t frame_width, bool *counter_running,
uint16_t counter_value)
{
if (xfer_data->word_count == 0) {
return;
}

nrf_vpr_csr_vio_shift_ctrl_t xfer_shift_ctrl = {
.shift_count = SHIFTCNTB_VALUE(BITS_IN_WORD / frame_width),
.out_mode = NRF_VPR_CSR_VIO_SHIFT_OUTB_TOGGLE,
nrf_vpr_csr_vio_mode_out_t out_mode = {
.mode = NRF_VPR_CSR_VIO_SHIFT_OUTB_TOGGLE,
.frame_width = frame_width,
.in_mode = NRF_VPR_CSR_VIO_MODE_IN_CONTINUOUS,
};
uint8_t prev_frame_width = xfer_shift_ctrl.frame_width;
uint32_t data;

xfer_shift_ctrl.shift_count = SHIFTCNTB_VALUE(BITS_IN_WORD / frame_width);
xfer_shift_ctrl.frame_width = frame_width;

nrf_vpr_csr_vio_shift_ctrl_buffered_set(&xfer_shift_ctrl);

Expand All @@ -74,16 +84,28 @@ static void hrt_tx(volatile hrt_xfer_data_t *xfer_data, uint8_t frame_width, boo
xfer_shift_ctrl.shift_count = SHIFTCNTB_VALUE(xfer_data->last_word_clocks);
nrf_vpr_csr_vio_shift_ctrl_buffered_set(&xfer_shift_ctrl);

xfer_data->vio_out_set(xfer_data->last_word);
data = xfer_data->last_word;
break;
case 2: /* Last but one transfer.*/
xfer_shift_ctrl.shift_count =
SHIFTCNTB_VALUE(xfer_data->penultimate_word_clocks);
nrf_vpr_csr_vio_shift_ctrl_buffered_set(&xfer_shift_ctrl);
default: /* Intentional fallthrough */
xfer_data->vio_out_set(((uint32_t *)xfer_data->data)[i]);
data = ((uint32_t *)xfer_data->data)[i];
}

/* In case of bus width change device has to load
* new bus width before loading new out data.
*/
if (prev_frame_width != frame_width) {
prev_frame_width = frame_width;
while (nrf_vpr_csr_vio_shift_cnt_out_get() != 0) {
}
nrf_vpr_csr_vio_mode_out_set(&out_mode);
}

xfer_data->vio_out_set(data);

if ((i == 0) && (!*counter_running)) {
/* Start counter */
nrf_vpr_csr_vtim_simple_counter_set(0, counter_value);
Expand Down Expand Up @@ -123,6 +145,7 @@ void hrt_write(hrt_xfer_t *hrt_xfer_params)
default:
break;
}
xfer_shift_ctrl.frame_width = out_mode.frame_width;

nrf_vpr_csr_vtim_count_mode_set(0, NRF_VPR_CSR_VTIM_COUNT_RELOAD);
nrf_vpr_csr_vtim_simple_counter_top_set(0, hrt_xfer_params->counter_value);
Expand Down

0 comments on commit 7a4f3ad

Please sign in to comment.