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.