100 lines
2.0 KiB
C
100 lines
2.0 KiB
C
#include "shiftregister.h"
|
|
|
|
//Global Variables
|
|
uint32_t g_output_shift_data = 0; //!< Data to be written to the shift register outputs
|
|
uint32_t g_input_shift_data = 0; //!< Data read back from the shift register inputs
|
|
|
|
|
|
void set_sr_clock(uint8_t state)
|
|
{
|
|
HAL_GPIO_WritePin(SR_CLK_GPIO_Port, SR_CLK_Pin, state);
|
|
}
|
|
|
|
void set_sr_latch(uint8_t state)
|
|
{
|
|
HAL_GPIO_WritePin(SR_STRB_GPIO_Port, SR_STRB_Pin, state);
|
|
}
|
|
|
|
void set_sr_data_out(uint8_t state)
|
|
{
|
|
HAL_GPIO_WritePin(SR_DATA_GPIO_Port, SR_DATA_Pin, state);
|
|
}
|
|
|
|
void set_sr_reset_state(uint8_t state)
|
|
{
|
|
HAL_GPIO_WritePin(SR_RST_GPIO_Port, SR_RST_Pin, state);
|
|
}
|
|
|
|
void set_sr_output_state(uint8_t state)
|
|
{
|
|
HAL_GPIO_WritePin(SR_OE_GPIO_Port, SR_OE_Pin, state);
|
|
}
|
|
|
|
uint32_t read_sr_data_in(void)
|
|
{
|
|
// Read a single bit from port pin.
|
|
return HAL_GPIO_ReadPin(SR_DATAIN_GPIO_Port, SR_DATAIN_Pin);
|
|
}
|
|
|
|
void init_shift_registers(void)
|
|
{
|
|
set_sr_latch(1);
|
|
set_sr_clock(1);
|
|
|
|
// Set the default value on the shift registers
|
|
update_shift_registers();
|
|
}
|
|
|
|
// Updated the outputs on the Shift Register
|
|
uint32_t update_shift_registers(void)
|
|
{
|
|
uint32_t data_out = 0;
|
|
uint32_t data_in = 0;
|
|
uint32_t bit_mask;
|
|
uint8_t i;
|
|
|
|
// Shift Data out
|
|
data_out = g_output_shift_data;
|
|
bit_mask = 0x0800;
|
|
|
|
for (i = 0; i < 24; i++)
|
|
{
|
|
set_sr_clock(0);
|
|
|
|
if (data_out & bit_mask)
|
|
set_sr_data_out(1);
|
|
else
|
|
set_sr_data_out(0);
|
|
|
|
bit_mask >>= 1;
|
|
set_sr_clock(1);
|
|
}
|
|
|
|
// Once 16 bits have been loaded in, strobe to send the data to U7/U8 parallel outputs.
|
|
set_sr_latch(0);
|
|
set_sr_latch(1);
|
|
|
|
|
|
// Read the data back in and verify that it's correct.
|
|
// Data is clocked on negative edge.
|
|
for (i = 0; i < 24; i++)
|
|
{
|
|
set_sr_clock(0);
|
|
data_in <<= 1; //Data is shifted in MSB to LSB.
|
|
data_in |= read_sr_data_in();
|
|
set_sr_clock(1);
|
|
}
|
|
|
|
set_sr_clock(0);
|
|
|
|
// Check if the data read and sent the same
|
|
if ((data_in & 0x00FFFFFF) != g_output_shift_data)
|
|
{
|
|
//setShiftRegError();
|
|
}
|
|
|
|
g_input_shift_data = data_in;
|
|
return g_input_shift_data;
|
|
}
|
|
|