swspi.cpp 2.3 KB

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