Problem with while loop
You need to re-read the ADC status register inside the loop; otherwise, you're just re-testing the bit you read the first time. Also, you need to reverse the sense of the test &mdash; you want to repeat the test if the bit is "1" and drop out of the loop once it switches to "0". It may also be necessary to toggle chip select to the ADC on each read, as shown in the comments below.

unsigned char CheckStatus(void)
{
  unsigned char adcStatus;
  do {
    /* TBD: assert chip select here? */
    spi(0x40);
    adcStatus = spi(0xFF);
    /* TBD: negate chip select here? */
  } while ((adcStatus &amp; 0x80) == 0x80);                         
  return adcStatus;
}