swspi.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "swspi.h"
  2. #ifdef SWSPI_RPI
  3. #include <bcm2835.h>
  4. #define GPIO_INP(gpio) bcm2835_gpio_fsel(gpio, BCM2835_GPIO_FSEL_INPT)
  5. #define GPIO_OUT(gpio) bcm2835_gpio_fsel(gpio, BCM2835_GPIO_FSEL_OUTP)
  6. #define GPIO_SET(gpio) bcm2835_gpio_write(gpio, HIGH)
  7. #define GPIO_CLR(gpio) bcm2835_gpio_write(gpio, LOW)
  8. #define GPIO_GET(gpio) (bcm2835_gpio_lev(gpio) != LOW)
  9. #define DELAY(delay) usleep(delay)
  10. #endif //SWSPI_RPI
  11. #ifdef SWSPI_AVR
  12. #include "Arduino.h"
  13. #define GPIO_INP(gpio) pinMode(gpio, INPUT)
  14. #define GPIO_OUT(gpio) pinMode(gpio, OUTPUT)
  15. #define GPIO_SET(gpio) digitalWrite(gpio, HIGH)
  16. #define GPIO_CLR(gpio) digitalWrite(gpio, LOW)
  17. #define GPIO_GET(gpio) (digitalRead(gpio) != LOW)
  18. #define DELAY(delay) delayMicroseconds(delay)
  19. #endif //SWSPI_AVR
  20. #if (SWSPI_POL != 0)
  21. #define SWSPI_SCK_UP GPIO_CLR(SWSPI_SCK)
  22. #define SWSPI_SCK_DN GPIO_SET(SWSPI_SCK)
  23. #else
  24. #define SWSPI_SCK_UP GPIO_SET(SWSPI_SCK)
  25. #define SWSPI_SCK_DN GPIO_CLR(SWSPI_SCK)
  26. #endif
  27. void swspi_init()
  28. {
  29. GPIO_INP(SWSPI_MISO);
  30. GPIO_OUT(SWSPI_MOSI);
  31. GPIO_OUT(SWSPI_SCK);
  32. GPIO_OUT(SWSPI_CS);
  33. GPIO_CLR(SWSPI_MOSI);
  34. SWSPI_SCK_DN;
  35. GPIO_SET(SWSPI_CS);
  36. }
  37. #if (SWSPI_MOSI == SWSPI_MISO)
  38. void swspi_tx(unsigned char tx)
  39. {
  40. GPIO_OUT(SWSPI_MOSI);
  41. unsigned char i = 0; for (; i < 8; i++)
  42. {
  43. if (tx & 0x80) GPIO_SET(SWSPI_MOSI);
  44. else GPIO_CLR(SWSPI_MOSI);
  45. DELAY(SWSPI_DEL);
  46. SWSPI_SCK_UP;
  47. DELAY(SWSPI_DEL);
  48. SWSPI_SCK_DN;
  49. tx <<= 1;
  50. }
  51. }
  52. unsigned char swspi_rx()
  53. {
  54. GPIO_INP(SWSPI_MISO);
  55. unsigned char rx = 0;
  56. unsigned char i = 0; for (; i < 8; i++)
  57. {
  58. rx <<= 1;
  59. DELAY(SWSPI_DEL);
  60. SWSPI_SCK_UP;
  61. DELAY(SWSPI_DEL);
  62. rx |= GPIO_GET(SWSPI_MISO)?1:0;
  63. SWSPI_SCK_DN;
  64. }
  65. return rx;
  66. }
  67. #else //(SWSPI_MOSI == SWSPI_MISO)
  68. unsigned char swspi_txrx(unsigned char tx)
  69. {
  70. unsigned char rx = 0;
  71. unsigned char i = 0; for (; i < 8; i++)
  72. {
  73. rx <<= 1;
  74. if (tx & 0x80) GPIO_SET(SWSPI_MOSI);
  75. else GPIO_CLR(SWSPI_MOSI);
  76. DELAY(SWSPI_DEL);
  77. SWSPI_SCK_UP;
  78. DELAY(SWSPI_DEL);
  79. rx |= GPIO_GET(SWSPI_MISO)?1:0;
  80. SWSPI_SCK_DN;
  81. tx <<= 1;
  82. }
  83. return rx;
  84. }
  85. #endif //(SWSPI_MOSI == SWSPI_MISO)
  86. void swspi_start()
  87. {
  88. GPIO_CLR(SWSPI_CS);
  89. }
  90. void swspi_stop()
  91. {
  92. GPIO_SET(SWSPI_CS);
  93. }