You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

66 lines
1.1 KiB

  1. #include "config.h"
  2. #include "adc.h"
  3. #include "timer.h"
  4. /* Currently using software SPI because it's easy.
  5. Consider using hardware SPI with DMA on a timer, though. */
  6. #define TRIS_SDATA TRISFbits.TRISF7
  7. #define R_SDATA PORTFbits.RF7
  8. #define TRIS_SCLK TRISFbits.TRISF6
  9. #define LAT_SCLK LATFbits.LATF6
  10. #define TRIS_CS TRISBbits.TRISB2
  11. #define LAT_CS LATBbits.LATB2
  12. void adc_init(void)
  13. {
  14. TRIS_SDATA = 1;
  15. LAT_CS = IO_HIGH;
  16. TRIS_CS = 0;
  17. LAT_SCLK = IO_HIGH;
  18. TRIS_SCLK = 0;
  19. }
  20. int16_t adc_get(void)
  21. {
  22. uint16_t v = 0;
  23. int i;
  24. LAT_CS = IO_LOW;
  25. for (i = 0; i < 16; i++) {
  26. v <<= 1;
  27. if (R_SDATA == IO_HIGH)
  28. v |= 1;
  29. LAT_SCLK = IO_LOW;
  30. nop(); nop(); nop();
  31. LAT_SCLK = IO_HIGH;
  32. }
  33. LAT_CS = IO_HIGH;
  34. /* Sign-extend the 12-bit value */
  35. if (v & 0x0800)
  36. v |= 0xF000;
  37. else
  38. v &= ~0xF000;
  39. return (int16_t) v;
  40. }
  41. uint16_t adc_get_raw(void)
  42. {
  43. uint16_t v = 0;
  44. int i;
  45. LAT_CS = IO_LOW;
  46. for (i = 0; i < 16; i++) {
  47. v <<= 1;
  48. if (R_SDATA == IO_HIGH)
  49. v |= 1;
  50. LAT_SCLK = IO_LOW;
  51. nop(); nop(); nop();
  52. LAT_SCLK = IO_HIGH;
  53. }
  54. LAT_CS = IO_HIGH;
  55. return (uint16_t) v;
  56. }