GPIO_SPI.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /*
  2. 개념
  3. Falling Edge
  4. 1 LOW CS
  5. 2. HIGH MOSI
  6. 3. LOW CLK
  7. 4. LOOP
  8. int i;
  9. for (i = 0; i < 7; i++)
  10. {
  11. GPIO_MOSI = DATA(i);
  12. GPIO_MISO = DATA(i);
  13. HIGH CLK
  14. LOW CLK
  15. }
  16. 5. HIGH MOSI
  17. 6. HIGH CS
  18. 소스코드 예졔1
  19. */
  20. #include "GPIO_SPI.h"
  21. #define SDA_SETUP_TIME 4
  22. #define CS_SETUP_TIME SDA_SETUP_TIME
  23. // LSB 방식
  24. uint8_t dummy_data;
  25. /*=========== GPIO Port F ===============*/
  26. #define Lora_NCS_CLR HAL_GPIO_WritePin(GPIOB,SX1276_NSS_Pin,RESET)
  27. #define Lora_NCS_SET HAL_GPIO_WritePin(GPIOB,SX1276_NSS_Pin,SET)
  28. #define Lora_SCLK_CLR HAL_GPIO_WritePin(GPIOB,SX1276_CLK_Pin,RESET)
  29. #define Lora_SCLK_SET HAL_GPIO_WritePin(GPIOB,SX1276_CLK_Pin,SET)
  30. //
  31. //#define Lora_MISO_CLR HAL_GPIO_WritePin(GPIOB,SX1276_MISO_Pin,RESET)
  32. //#define Lora_MISO_SET HAL_GPIO_WritePin(GPIOB,SX1276_MISO_Pin,SET)
  33. #define Lora_MOSI_CLR HAL_GPIO_WritePin(GPIOB,SX1276_MOSI_Pin,RESET)
  34. #define Lora_MOSI_SET HAL_GPIO_WritePin(GPIOB,SX1276_MOSI_Pin,SET)
  35. #define Lora_MISO_READ HAL_GPIO_ReadPin(GPIOB,SX1276_MISO_Pin)
  36. #define Read_SX1278_SDO() Lora_MISO_READ
  37. #define Set_SX1278_SDI() Lora_MOSI_SET
  38. #define Set_SX1278_SCK() Lora_SCLK_SET
  39. #define Clr_SX1278_SDI() Lora_MOSI_CLR
  40. #define Clr_SX1278_SCK() Lora_SCLK_CLR
  41. uint8_t SPIReadByte(uint8_t addr);
  42. uint8_t SPIWriteByte(uint8_t addr, uint8_t data);
  43. uint8_t SPIGPIOTxRx(uint8_t addr, uint8_t data);
  44. void SPI_Delay(int ustime)
  45. {
  46. volatile int i;
  47. volatile int k;
  48. for(i = 0; i < ustime; i++)
  49. {
  50. k++;
  51. }
  52. }
  53. #if 1 // PYJ.2019.04.02_BEGIN --
  54. #ifdef STM32F1
  55. void SpiInOut(uint8_t addr_write)
  56. {
  57. uint8_t i;
  58. for (i = 0; i < 8; i++)
  59. {
  60. SPI_Delay(SDA_SETUP_TIME);
  61. Clr_SX1278_SCK();
  62. if (addr_write & 0x80)
  63. {
  64. Set_SX1278_SDI();
  65. }
  66. else
  67. {
  68. Clr_SX1278_SDI();
  69. }
  70. SPI_Delay(SDA_SETUP_TIME);
  71. Set_SX1278_SCK();
  72. addr_write = addr_write << 1;
  73. SPI_Delay(SDA_SETUP_TIME);
  74. }
  75. Clr_SX1278_SCK();
  76. }
  77. uint8_t SpiRead(void)
  78. {
  79. uint8_t i = 0,Readdata = 0;
  80. for (i = 0; i < 8; i++)
  81. {
  82. Readdata <<= 1;
  83. SPI_Delay(SDA_SETUP_TIME);
  84. Set_SX1278_SCK();
  85. if (Read_SX1278_SDO())
  86. Readdata |= 0x01;
  87. else
  88. Readdata &= 0xfe;
  89. SPI_Delay(SDA_SETUP_TIME);
  90. Clr_SX1278_SCK();
  91. }
  92. return Readdata;
  93. }
  94. #if 1 // PYJ.2019.04.02_BEGIN --
  95. uint8_t SPIGPIOTxRx(uint8_t addr, uint8_t data){
  96. uint8_t readdata;
  97. Lora_NCS_CLR;
  98. SpiInOut(addr);
  99. SpiInOut(data);
  100. readdata = SpiRead();
  101. Lora_NCS_SET;
  102. return readdata;
  103. }
  104. #endif // PYJ.2019.04.02_END --
  105. #endif
  106. //#else
  107. #if 0 // PYJ.2019.04.02_BEGIN --
  108. void BLUECELL_SPI_Transmit(uint8_t data) // int 가 16Bit 일때
  109. {
  110. int i;
  111. Lora_MOSI_SET;
  112. // Lora_NCS_SET;
  113. Lora_SCLK_CLR; // CLK Low
  114. // Lora_NCS_CLR; //
  115. SPI_Delay(CS_SETUP_TIME);
  116. for(i = 0; i < 8; i++)
  117. {
  118. Lora_SCLK_CLR; // CLK LOW
  119. SPI_Delay(SDA_SETUP_TIME);
  120. if(data & 0x80) {
  121. Lora_MOSI_SET;
  122. }
  123. else {
  124. Lora_MOSI_CLR;
  125. }
  126. SPI_Delay(SDA_SETUP_TIME);
  127. data <<= 1 ;
  128. Lora_SCLK_SET;
  129. SPI_Delay(SDA_SETUP_TIME);
  130. }
  131. // Lora_NCS_SET;
  132. // Lora_MOSI_SET;
  133. // SPI_Delay(SDA_SETUP_TIME);
  134. }
  135. #else
  136. void BLUECELL_SPI_Transmit(uint8_t data) {
  137. SpiInOut(data);
  138. }
  139. #endif // PYJ.2019.04.02_END --
  140. #if 0 // PYJ.2019.04.01_BEGIN --
  141. // MSB 방식
  142. void SOUT(int data) // int 가 16Bit 일때
  143. {
  144. int i;
  145. uint16_t mask = 0x8000;
  146. SET_SPI_MOSI;
  147. SET_SPI_CS;
  148. CLR_SPI_SCL; // CLK Low
  149. CLR_SPI_CS; //
  150. SPI_Delay(CS_SETUP_TIME);
  151. for(i = 0; i < 16; i++)
  152. {
  153. CLR_SPI_SCL; // CLK LOW
  154. SPI_Delay(SCL_LOW_TIME);
  155. if(data & mask)) {
  156. SET_SPI_SDA;
  157. }
  158. else {
  159. CLR_SPI_SDA;
  160. }
  161. SPI_Delay(SDA_SETUP_TIME);
  162. mask >> =1;
  163. SET_SPI_SCL;
  164. SPI_Delay(SCL_HIGH_TIME);
  165. }
  166. SET_SPI_CS;
  167. SET_SPI_SDA;
  168. SPI_Delay(CS_PULSE_TIME);
  169. }
  170. #endif // PYJ.2019.04.01_END --
  171. //소스 예제 2 Read 시는 Addr 의 취상위비트가 0, Write 시에는 취상위비트가 1
  172. uint8_t SPIReadByte(uint8_t addr)
  173. {
  174. /* Read Command */
  175. uint8_t readdata;
  176. Lora_NCS_CLR;
  177. SpiInOut(addr);
  178. readdata = SpiRead();
  179. Lora_NCS_SET;
  180. return readdata;
  181. }
  182. uint8_t SPIWriteByte(uint8_t addr, uint8_t data)
  183. {
  184. /* Write Command */
  185. addr |= 0x80;
  186. dummy_data = SPIGPIOTxRx(addr, data);
  187. //return SPIGPIOTxRx(data);
  188. return dummy_data;
  189. }
  190. #if 0 // PYJ.2019.04.02_BEGIN --
  191. uint8_t SPIGPIOTxRx(uint8_t addr, uint8_t data)
  192. {
  193. uint8_t i;
  194. uint8_t rx;
  195. uint8_t mask;
  196. uint16_t wdata, wmask;
  197. rx = 0;
  198. mask = 0x80;
  199. wmask = 0x8000;
  200. Lora_SCLK_CLR;
  201. Lora_NCS_CLR;
  202. if ( addr & 0x80 ) {
  203. wdata = (uint16_t)(addr << 8) | data;
  204. // write
  205. for ( i = 0 ; i < 16 ; i++ ) {
  206. if ( wdata & wmask ) Lora_MOSI_SET;
  207. else Lora_MOSI_CLR;
  208. Lora_SCLK_SET;
  209. if ( Lora_MISO_READ ) rx |= wmask;
  210. else rx &= ~wmask;
  211. wmask <<= 1;
  212. Lora_SCLK_CLR;
  213. }
  214. }
  215. else {
  216. // read
  217. for ( i = 0 ; i < 8 ; i++ ) {
  218. Lora_SCLK_SET;
  219. SPI_Delay(SDA_SETUP_TIME);
  220. if ( addr & mask ) Lora_MOSI_SET;
  221. else Lora_MOSI_CLR;
  222. SPI_Delay(SDA_SETUP_TIME);
  223. Lora_SCLK_CLR ;
  224. mask <<= 1;
  225. }
  226. Lora_NCS_SET;
  227. for ( i = 0 ; i < 8 ; i++ ){
  228. Lora_SCLK_SET;
  229. if ( Lora_MISO_READ ) rx |= mask;
  230. else rx &= ~mask;
  231. Lora_SCLK_CLR ;
  232. }
  233. }
  234. Lora_NCS_SET;
  235. Lora_SCLK_CLR;
  236. Lora_MOSI_CLR;
  237. return rx;
  238. }
  239. #endif // PYJ.2019.04.02_END --
  240. #endif // PYJ.2019.04.02_END --