25 #include "mcp4012_x.h" 28 #include "hal_nop_delay.h" 32 #include "nrf_assert.h" 34 #ifndef SPIM_ENABLE_ENABLE_Enabled 35 #error "The SoC does not have the SPIM peripheral needed for this module" 38 #define SPIM_ID CONCAT_2(NRF_SPIM,SPIM_USED_MCP4012_DRIVER) 42 static void simple_spi_init();
50 static void simple_spi_transmit(uint8_t *data, uint32_t len);
52 #define BUFFER_SIZE 16 55 #define NO_OF_STEPS 64 57 #define SIZE_OF_WORD (NO_OF_STEPS/BUFFER_SIZE) 64 static uint8_t data_to_be_sent[BUFFER_SIZE];
65 static uint32_t UD_bar;
66 static uint32_t CS_bar;
67 static uint32_t SCK_pin;
69 void mcp4012_init(uint32_t CS_bar_pin_no, uint32_t UD_bar_pin_no, uint32_t SCK_pin_no)
71 hal_gpio_cfg_output(CS_bar_pin_no, 1);
72 hal_gpio_cfg_output(UD_bar_pin_no, 1);
73 hal_gpio_cfg_output(SCK_pin_no, 1);
74 UD_bar = UD_bar_pin_no;
75 CS_bar = CS_bar_pin_no;
81 ASSERT(value_sent_by_user < NO_OF_STEPS);
84 uint32_t last_seq = 0;
85 uint32_t last_word_no = 0;
86 uint32_t wiper_value = 0;
88 memset(data_to_be_sent, ALL_AA, BUFFER_SIZE);
91 hal_gpio_pin_set(CS_bar);
93 hal_gpio_pin_set(UD_bar);
95 hal_gpio_pin_clear(CS_bar);
97 hal_gpio_pin_clear(UD_bar);
99 simple_spi_transmit(data_to_be_sent, BUFFER_SIZE);
100 hal_gpio_pin_set(CS_bar);
104 wiper_value = NO_OF_STEPS - value_sent_by_user;
105 word_no = wiper_value/SIZE_OF_WORD;
106 last_seq = wiper_value % SIZE_OF_WORD;
107 last_word_no = word_no+1;
110 memset(data_to_be_sent, ALL_AA, word_no);
112 memset(&data_to_be_sent[word_no], ALL_00, (BUFFER_SIZE-word_no));
114 for(i = 0; i < last_seq; i++)
116 data_to_be_sent[word_no] = 0x80 | data_to_be_sent[word_no] >> 2;
120 hal_gpio_pin_set(UD_bar);
122 hal_gpio_pin_set(CS_bar);
123 hal_gpio_pin_clear(UD_bar);
125 hal_gpio_pin_clear(CS_bar);
127 simple_spi_transmit(data_to_be_sent, last_word_no);
128 hal_gpio_pin_set(CS_bar);
132 static void simple_spi_init()
134 SPIM_ID->TASKS_SUSPEND = 1;
135 SPIM_ID->TASKS_STOP = 1;
136 SPIM_ID->PSEL.MOSI = UD_bar | (0 << 31);
137 SPIM_ID->PSEL.SCK = SCK_pin | (0 << 31);
138 SPIM_ID->CONFIG = (SPIM_CONFIG_ORDER_MsbFirst << SPIM_CONFIG_ORDER_Pos)
139 |(SPIM_CONFIG_CPHA_Trailing << SPIM_CONFIG_CPHA_Pos)
140 |(SPIM_CONFIG_CPOL_ActiveHigh << SPIM_CONFIG_CPOL_Pos);
142 SPIM_ID->FREQUENCY = SPIM_FREQUENCY_FREQUENCY_M1 << SPIM_FREQUENCY_FREQUENCY_Pos;
143 SPIM_ID->TXD.LIST = 1 << 0;
146 static void simple_spi_transmit(uint8_t *data, uint32_t len)
149 SPIM_ID->TXD.PTR = (uint32_t ) data;
150 SPIM_ID->TXD.MAXCNT = len;
151 SPIM_ID->ENABLE = SPIM_ENABLE_ENABLE_Enabled << SPIM_ENABLE_ENABLE_Pos;
152 SPIM_ID->TASKS_START = 0x01;
153 while(!(SPIM_ID->EVENTS_ENDTX));
154 SPIM_ID->EVENTS_ENDTX = 0;
155 SPIM_ID->ENABLE = SPIM_ENABLE_ENABLE_Disabled << SPIM_ENABLE_ENABLE_Pos;
156 SPIM_ID->TASKS_STOP = 0x01;
#define ASSERT(expression)
Macro for runtime assertion of an expression. If the expression is false the assert_nrf_callback func...
void mcp4012_init(uint32_t CS_bar_pin_no, uint32_t UD_bar_pin_no, uint32_t SCK_pin_no)
This function is used to initialize MCP4012 in our program. This will set wiper value of MCP4012 to z...
void mcp4012_set_value(uint32_t value_sent_by_user)
This function is used to set the value of MCP4012 wiper value.