Untitled
unknown
c_cpp
a year ago
1.7 kB
7
Indexable
uint32_t readADC(uint32_t bit_CS, uint32_t bit_CLK, uint32_t bit_SDO) { // ADC 12-bit (2^12 == 4096) uint32_t bit_CSmask = 1 << bit_CS; uint32_t bit_SCLKmask = 1 << bit_CLK; // enable outputs for /CS and SCLK uint32_t bitsMask = bit_CSmask | bit_SCLKmask; gpio_oe_and_or(~bitsMask, bitsMask); // inverted mask + mask // fire /CSx gpio_out_and_or(~bit_CSmask, 0); // inverted mask + target value // init result uint32_t result = 0; uint32_t dataADC = 0; uint32_t magicNumber = getMagicNumber(bit_SDO); for (int i = 1; i < 16; i++) { // clock tact gpio_out_and_or(~bit_SCLKmask, 0); // inverted mask + target value gpio_out_and_or(~bit_SCLKmask, bit_SCLKmask); // inverted mask + mask if (i > 1 && i < 14) // we're skipping two 0 before & two 0 after (see datasheet) { // get data from INPUT register dataADC = gpio_in();// ^ 0xffff; //printf("bit# %d register value %d\n", i, dataADC); // pseudo-scientific part if (dataADC != magicNumber) { result++; //printf("Result incremented \n"); } if (i > 1 && i < 13) result = result << 1; //printf("bit# %d result value %d\n", i, result); } } // restore /CSx gpio_out_and_or(~bit_CSmask, bit_CSmask); // inverted mask + target value //printf("Result: %d\n", result); return result; }
Editor is loading...
Leave a Comment