spi.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "spi.h"
  2. #include "stm32f10x_gpio.h"
  3. #include "stm32f10x_spi.h"
  4. #include "stm32f10x.h"
  5. #if !defined(SPI_HARD)
  6. void RF_SPI_SCK_H(void)
  7. {
  8. GPIO_WriteBit(RF_SPI_SCK_Port, RF_SPI_SCK_IO, BOARD_PIN_H);
  9. }
  10. void RF_SPI_SCK_L(void)
  11. {
  12. GPIO_WriteBit(RF_SPI_SCK_Port, RF_SPI_SCK_IO, BOARD_PIN_L);
  13. }
  14. void RF_SPI_MISO_H(void)
  15. {
  16. GPIO_WriteBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO, BOARD_PIN_H);
  17. }
  18. void RF_SPI_MISO_L(void)
  19. {
  20. GPIO_WriteBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO, BOARD_PIN_L);
  21. }
  22. void RF_SPI_MISO_SETMODE(GPIOMode_TypeDef mode)
  23. {
  24. GPIO_InitTypeDef GPIO_InitStructure;
  25. GPIO_InitStructure.GPIO_Pin = RF_SPI_MISO_IO;
  26. GPIO_InitStructure.GPIO_Mode = mode;
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_Init(RF_SPI_MISO_Port, &GPIO_InitStructure);
  29. }
  30. uint8_t READ_RF_SPI_MISO(void)
  31. {
  32. return GPIO_ReadInputDataBit(RF_SPI_MISO_Port, RF_SPI_MISO_IO);
  33. }
  34. #endif
  35. void RF_SPI_NSS_H(void)
  36. {
  37. GPIO_WriteBit(RF_SPI_NSS_Port, RF_SPI_NSS_IO, BOARD_PIN_H);
  38. }
  39. void RF_SPI_NSS_L(void)
  40. {
  41. GPIO_WriteBit(RF_SPI_NSS_Port, RF_SPI_NSS_IO, BOARD_PIN_L);
  42. }
  43. void spi_init(void)
  44. {
  45. GPIO_InitTypeDef GPIO_InitStructure;
  46. GPIO_InitStructure.GPIO_Pin = RF_SPI_MISO_IO;
  47. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  48. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49. GPIO_Init(RF_SPI_MISO_Port, &GPIO_InitStructure);
  50. GPIO_InitStructure.GPIO_Pin = RF_SPI_SCK_IO;
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  53. GPIO_Init(RF_SPI_SCK_Port, &GPIO_InitStructure);
  54. GPIO_InitStructure.GPIO_Pin = RF_SPI_NSS_IO;
  55. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  56. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57. GPIO_Init(RF_SPI_NSS_Port, &GPIO_InitStructure);
  58. RF_SPI_NSS_H();
  59. }
  60. void SpiWrite(uint8_t byteToWrite)
  61. {
  62. uint8_t i;
  63. __set_PRIMASK(1); //全局中断关闭
  64. RF_SPI_MISO_SETMODE(GPIO_Mode_Out_PP);
  65. RF_SPI_SCK_L();
  66. for(i=0; i<8; i++)
  67. {
  68. if(byteToWrite & 0x80)
  69. {
  70. RF_SPI_MISO_H();
  71. }
  72. else
  73. {
  74. RF_SPI_MISO_L();
  75. }
  76. RF_SPI_SCK_H();
  77. byteToWrite <<= 1;
  78. RF_SPI_SCK_L();
  79. }
  80. __set_PRIMASK(0); //全局中断打开
  81. }
  82. uint8_t SpiRead(void)
  83. {
  84. uint8_t i, temp;
  85. temp = 0;
  86. __set_PRIMASK(1); //全局中断关闭
  87. RF_SPI_MISO_SETMODE(GPIO_Mode_IN_FLOATING);
  88. RF_SPI_SCK_L();
  89. for(i=0; i<8; i++)
  90. {
  91. temp <<= 1;
  92. RF_SPI_SCK_H();
  93. if(READ_RF_SPI_MISO())
  94. {
  95. temp ++;
  96. }
  97. RF_SPI_SCK_L();
  98. }
  99. __set_PRIMASK(0); //全局中断打开
  100. return temp;
  101. }