Untitled
unknown
c_cpp
a year ago
1.7 kB
13
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