rt_stm32f10x_spi.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. #include "rt_stm32f10x_spi.h"
  2. static rt_err_t configure(struct rt_spi_device* device, struct rt_spi_configuration* configuration);
  3. static rt_uint32_t xfer(struct rt_spi_device* device, struct rt_spi_message* message);
  4. static struct rt_spi_ops stm32_spi_ops =
  5. {
  6. configure,
  7. xfer
  8. };
  9. //------------------ DMA ------------------
  10. #ifdef SPI_USE_DMA
  11. static uint8_t dummy = 0xFF;
  12. #endif /*SPI_USE_DMA*/
  13. #ifdef SPI_USE_DMA
  14. static void DMA_Configuration(struct stm32_spi_bus * stm32_spi_bus, const void * send_addr, void * recv_addr, rt_size_t size)
  15. {
  16. DMA_InitTypeDef DMA_InitStructure;
  17. if(!stm32_spi_bus->dma)
  18. {
  19. return;
  20. }
  21. DMA_ClearFlag(stm32_spi_bus->dma->priv_data->DMA_Channel_RX_FLAG_TC
  22. | stm32_spi_bus->dma->priv_data->DMA_Channel_RX_FLAG_TE
  23. | stm32_spi_bus->dma->priv_data->DMA_Channel_TX_FLAG_TC
  24. | stm32_spi_bus->dma->priv_data->DMA_Channel_TX_FLAG_TE);
  25. /* RX channel configuration */
  26. DMA_Cmd(stm32_spi_bus->dma->priv_data->DMA_Channel_RX, DISABLE);
  27. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(stm32_spi_bus->SPI->DR));
  28. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  29. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  30. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  31. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  32. DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  33. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  34. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  35. DMA_InitStructure.DMA_BufferSize = size;
  36. if(recv_addr != RT_NULL)
  37. {
  38. DMA_InitStructure.DMA_MemoryBaseAddr = (u32) recv_addr;
  39. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  40. }
  41. else
  42. {
  43. DMA_InitStructure.DMA_MemoryBaseAddr = (u32) (&dummy);
  44. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  45. }
  46. DMA_Init(stm32_spi_bus->dma->priv_data->DMA_Channel_RX, &DMA_InitStructure);
  47. DMA_ITConfig(stm32_spi_bus->dma->priv_data->DMA_Channel_RX, DMA_IT_TC, ENABLE);
  48. DMA_Cmd(stm32_spi_bus->dma->priv_data->DMA_Channel_RX, ENABLE);
  49. /* TX channel configuration */
  50. DMA_Cmd(stm32_spi_bus->dma->priv_data->DMA_Channel_TX, DISABLE);
  51. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(stm32_spi_bus->SPI->DR));
  52. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  53. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  54. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  55. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  56. DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  57. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  58. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  59. DMA_InitStructure.DMA_BufferSize = size;
  60. if(send_addr != RT_NULL)
  61. {
  62. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)send_addr;
  63. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  64. }
  65. else
  66. {
  67. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&dummy);;
  68. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  69. }
  70. DMA_Init(stm32_spi_bus->dma->priv_data->DMA_Channel_TX, &DMA_InitStructure);
  71. DMA_ITConfig(stm32_spi_bus->dma->priv_data->DMA_Channel_TX, DMA_IT_TC, ENABLE);
  72. DMA_Cmd(stm32_spi_bus->dma->priv_data->DMA_Channel_TX, ENABLE);
  73. }
  74. #ifdef SPI1_USING_DMA
  75. static const struct stm32_spi_dma_private dma1_priv =
  76. {
  77. DMA1_Channel3,
  78. DMA1_Channel2,
  79. DMA1_FLAG_TC3,
  80. DMA1_FLAG_TE3,
  81. DMA1_FLAG_TC2,
  82. DMA1_FLAG_TE2,
  83. DMA1_Channel3_IRQn,
  84. DMA1_Channel2_IRQn,
  85. DMA1_FLAG_GL3,
  86. DMA1_FLAG_GL2,
  87. };
  88. static struct stm32_spi_dma dma1 =
  89. {
  90. &dma1_priv,
  91. };
  92. void DMA1_Channel2_IRQHandler(void) {
  93. /* enter interrupt */
  94. rt_interrupt_enter();
  95. rt_event_send(&dma1.event, SPI_DMA_TX_DONE);
  96. DMA_ClearFlag(dma1.priv_data->tx_gl_flag);
  97. /* leave interrupt */
  98. rt_interrupt_leave();
  99. }
  100. void DMA1_Channel3_IRQHandler(void) {
  101. /* enter interrupt */
  102. rt_interrupt_enter();
  103. rt_event_send(&dma1.event, SPI_DMA_RX_DONE);
  104. DMA_ClearFlag(dma1.priv_data->rx_gl_flag);
  105. /* leave interrupt */
  106. rt_interrupt_leave();
  107. }
  108. #endif /*SPI1_USING_DMA*/
  109. #ifdef SPI2_USING_DMA
  110. static const struct stm32_spi_dma_private dma2_priv =
  111. {
  112. DMA1_Channel5,
  113. DMA1_Channel5,
  114. DMA1_FLAG_TC5,
  115. DMA1_FLAG_TE5,
  116. DMA1_FLAG_TC4,
  117. DMA1_FLAG_TE4,
  118. DMA1_Channel5_IRQn,
  119. DMA1_Channel4_IRQn,
  120. DMA1_FLAG_GL5,
  121. DMA1_FLAG_GL4,
  122. };
  123. static struct stm32_spi_dma dma2 =
  124. {
  125. &dma2_priv,
  126. };
  127. void DMA1_Channel4_IRQHandler(void) {
  128. /* enter interrupt */
  129. rt_interrupt_enter();
  130. rt_event_send(&dma2.event, SPI_DMA_TX_DONE);
  131. DMA_ClearFlag(dma2.priv_data->tx_gl_flag);
  132. /* leave interrupt */
  133. rt_interrupt_leave();
  134. }
  135. void DMA1_Channel5_IRQHandler(void) {
  136. /* enter interrupt */
  137. rt_interrupt_enter();
  138. rt_event_send(&dma2.event, SPI_DMA_RX_DONE);
  139. DMA_ClearFlag(dma2.priv_data->rx_gl_flag);
  140. /* leave interrupt */
  141. rt_interrupt_leave();
  142. }
  143. #endif /*SPI2_USING_DMA*/
  144. #ifdef SPI3_USING_DMA
  145. static const struct stm32_spi_dma_private dma3_priv =
  146. {
  147. DMA2_Channel2,
  148. DMA2_Channel1,
  149. DMA2_FLAG_TC2,
  150. DMA2_FLAG_TE2,
  151. DMA2_FLAG_TC1,
  152. DMA2_FLAG_TE1,
  153. DMA2_Channel2_IRQn,
  154. DMA2_Channel1_IRQn,
  155. DMA2_FLAG_GL2,
  156. DMA2_FLAG_GL1,
  157. };
  158. static struct stm32_spi_dma dma3 =
  159. {
  160. &dma3_priv,
  161. };
  162. void DMA2_Channel1_IRQHandler(void) {
  163. /* enter interrupt */
  164. rt_interrupt_enter();
  165. rt_event_send(&dma3.event, SPI_DMA_TX_DONE);
  166. DMA_ClearFlag(dma3.priv_data->tx_gl_flag);
  167. /* leave interrupt */
  168. rt_interrupt_leave();
  169. }
  170. void DMA2_Channel2_IRQHandler(void) {
  171. /* enter interrupt */
  172. rt_interrupt_enter();
  173. rt_event_send(&dma3.event, SPI_DMA_RX_DONE);
  174. DMA_ClearFlag(dma3.priv_data->rx_gl_flag);
  175. /* leave interrupt */
  176. rt_interrupt_leave();
  177. }
  178. #endif /*SPI3_USING_DMA*/
  179. #endif /*SPI_USE_DMA*/
  180. rt_inline uint16_t get_spi_BaudRatePrescaler(rt_uint32_t max_hz)
  181. {
  182. uint16_t SPI_BaudRatePrescaler;
  183. /* STM32F10x SPI MAX 18Mhz */
  184. if(max_hz >= SystemCoreClock/2 && SystemCoreClock/2 <= 36000000)
  185. {
  186. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  187. }
  188. else if(max_hz >= SystemCoreClock/4)
  189. {
  190. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  191. }
  192. else if(max_hz >= SystemCoreClock/8)
  193. {
  194. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  195. }
  196. else if(max_hz >= SystemCoreClock/16)
  197. {
  198. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  199. }
  200. else if(max_hz >= SystemCoreClock/32)
  201. {
  202. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
  203. }
  204. else if(max_hz >= SystemCoreClock/64)
  205. {
  206. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  207. }
  208. else if(max_hz >= SystemCoreClock/128)
  209. {
  210. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  211. }
  212. else
  213. {
  214. /* min prescaler 256 */
  215. SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  216. }
  217. return SPI_BaudRatePrescaler;
  218. }
  219. static rt_err_t configure(struct rt_spi_device* device, struct rt_spi_configuration* configuration)
  220. {
  221. struct stm32_spi_bus * stm32_spi_bus = (struct stm32_spi_bus *)device->bus;
  222. SPI_InitTypeDef SPI_InitStructure;
  223. SPI_StructInit(&SPI_InitStructure);
  224. /* data_width */
  225. if(configuration->data_width <= 8)
  226. {
  227. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  228. }
  229. else if(configuration->data_width <= 16)
  230. {
  231. SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  232. }
  233. else
  234. {
  235. return RT_EIO;
  236. }
  237. /* baudrate */
  238. SPI_InitStructure.SPI_BaudRatePrescaler = get_spi_BaudRatePrescaler(configuration->max_hz);
  239. /* CPOL */
  240. if(configuration->mode & RT_SPI_CPOL)
  241. {
  242. SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  243. }
  244. else
  245. {
  246. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  247. }
  248. /* CPHA */
  249. if(configuration->mode & RT_SPI_CPHA)
  250. {
  251. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  252. }
  253. else
  254. {
  255. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  256. }
  257. /* MSB or LSB */
  258. if(configuration->mode & RT_SPI_MSB)
  259. {
  260. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  261. }
  262. else
  263. {
  264. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
  265. }
  266. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  267. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  268. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  269. /* init SPI */
  270. SPI_I2S_DeInit(stm32_spi_bus->SPI);
  271. SPI_Init(stm32_spi_bus->SPI, &SPI_InitStructure);
  272. /* Enable SPI_MASTER */
  273. SPI_Cmd(stm32_spi_bus->SPI, ENABLE);
  274. SPI_CalculateCRC(stm32_spi_bus->SPI, DISABLE);
  275. return RT_EOK;
  276. };
  277. static rt_uint32_t xfer(struct rt_spi_device* device, struct rt_spi_message* message)
  278. {
  279. struct stm32_spi_bus * stm32_spi_bus = (struct stm32_spi_bus *)device->bus;
  280. struct rt_spi_configuration * config = &device->config;
  281. SPI_TypeDef * SPI = stm32_spi_bus->SPI;
  282. struct stm32_spi_cs * stm32_spi_cs = device->parent.user_data;
  283. rt_uint32_t size = message->length;
  284. /* take CS */
  285. if(message->cs_take && stm32_spi_cs)
  286. {
  287. GPIO_ResetBits(stm32_spi_cs->GPIOx, stm32_spi_cs->GPIO_Pin);
  288. }
  289. #ifdef SPI_USE_DMA
  290. if(
  291. (stm32_spi_bus->parent.parent.flag & (RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX)) &&
  292. stm32_spi_bus->dma &&
  293. message->length > 32)
  294. {
  295. if(config->data_width <= 8)
  296. {
  297. rt_uint32_t ev = 0;
  298. DMA_Configuration(stm32_spi_bus, message->send_buf, message->recv_buf, message->length);
  299. SPI_I2S_DMACmd(SPI, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, ENABLE);
  300. rt_event_recv(&stm32_spi_bus->dma->event, SPI_DMA_COMPLETE,
  301. RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &ev);
  302. SPI_I2S_DMACmd(SPI, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, DISABLE);
  303. DMA_ITConfig(stm32_spi_bus->dma->priv_data->DMA_Channel_TX, DMA_IT_TC, DISABLE);
  304. DMA_ITConfig(stm32_spi_bus->dma->priv_data->DMA_Channel_RX, DMA_IT_TC, DISABLE);
  305. }
  306. }
  307. else
  308. #endif /*SPI_USE_DMA*/
  309. {
  310. if(config->data_width <= 8)
  311. {
  312. const rt_uint8_t * send_ptr = message->send_buf;
  313. rt_uint8_t * recv_ptr = message->recv_buf;
  314. while(size--)
  315. {
  316. rt_uint8_t data = 0xFF;
  317. if(send_ptr != RT_NULL)
  318. {
  319. data = *send_ptr++;
  320. }
  321. //Wait until the transmit buffer is empty
  322. while (SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE) == RESET);
  323. // Send the byte
  324. SPI_I2S_SendData(SPI, data);
  325. //Wait until a data is received
  326. while (SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE) == RESET);
  327. // Get the received data
  328. data = SPI_I2S_ReceiveData(SPI);
  329. if(recv_ptr != RT_NULL)
  330. {
  331. *recv_ptr++ = data;
  332. }
  333. }
  334. }
  335. else if(config->data_width <= 16)
  336. {
  337. const rt_uint16_t * send_ptr = message->send_buf;
  338. rt_uint16_t * recv_ptr = message->recv_buf;
  339. while(size--)
  340. {
  341. rt_uint16_t data = 0xFF;
  342. if(send_ptr != RT_NULL)
  343. {
  344. data = *send_ptr++;
  345. }
  346. //Wait until the transmit buffer is empty
  347. while (SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_TXE) == RESET);
  348. // Send the byte
  349. SPI_I2S_SendData(SPI, data);
  350. //Wait until a data is received
  351. while (SPI_I2S_GetFlagStatus(SPI, SPI_I2S_FLAG_RXNE) == RESET);
  352. // Get the received data
  353. data = SPI_I2S_ReceiveData(SPI);
  354. if(recv_ptr != RT_NULL)
  355. {
  356. *recv_ptr++ = data;
  357. }
  358. }
  359. }
  360. }
  361. /* release CS */
  362. if(message->cs_release && stm32_spi_cs)
  363. {
  364. GPIO_SetBits(stm32_spi_cs->GPIOx, stm32_spi_cs->GPIO_Pin);
  365. }
  366. return message->length;
  367. };
  368. /** \brief init and register stm32 spi bus.
  369. *
  370. * \param SPI: STM32 SPI, e.g: SPI1,SPI2,SPI3.
  371. * \param stm32_spi: stm32 spi bus struct.
  372. * \param spi_bus_name: spi bus name, e.g: "spi1"
  373. * \return
  374. *
  375. */
  376. rt_err_t stm32_spi_register(SPI_TypeDef * SPI,
  377. struct stm32_spi_bus * stm32_spi,
  378. const char * spi_bus_name)
  379. {
  380. rt_err_t res = RT_EOK;
  381. #ifdef SPI_USE_DMA
  382. NVIC_InitTypeDef NVIC_InitStructure;
  383. #endif
  384. rt_uint32_t flags = 0;
  385. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  386. if(SPI == SPI1)
  387. {
  388. stm32_spi->SPI = SPI1;
  389. #ifdef SPI_USE_DMA
  390. #ifdef SPI1_USING_DMA
  391. {
  392. rt_event_init(&dma1.event, "spi1ev", RT_IPC_FLAG_FIFO);
  393. stm32_spi->dma = &dma1;
  394. /* rx dma interrupt config */
  395. NVIC_InitStructure.NVIC_IRQChannel = dma1.priv_data->tx_irq_ch;
  396. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  397. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  398. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  399. NVIC_Init(&NVIC_InitStructure);
  400. NVIC_InitStructure.NVIC_IRQChannel = dma1.priv_data->rx_irq_ch;
  401. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  402. NVIC_Init(&NVIC_InitStructure);
  403. /* Enable the DMA1 Clock */
  404. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  405. flags |= RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX;
  406. }
  407. #else /*!SPI1_USING_DMA*/
  408. stm32_spi->dma = RT_NULL;
  409. #endif /*SPI1_USING_DMA*/
  410. #endif /*SPI_USE_DMA*/
  411. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  412. }
  413. else if(SPI == SPI2)
  414. {
  415. stm32_spi->SPI = SPI2;
  416. #ifdef SPI_USE_DMA
  417. #ifdef SPI2_USING_DMA
  418. {
  419. rt_event_init(&dma2.event, "spi2ev", RT_IPC_FLAG_FIFO);
  420. stm32_spi->dma = &dma2;
  421. /* rx dma interrupt config */
  422. NVIC_InitStructure.NVIC_IRQChannel = dma2.priv_data->tx_irq_ch;
  423. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  424. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  425. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  426. NVIC_Init(&NVIC_InitStructure);
  427. NVIC_InitStructure.NVIC_IRQChannel = dma2.priv_data->rx_irq_ch;
  428. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  429. NVIC_Init(&NVIC_InitStructure);
  430. /* Enable the DMA1 Clock */
  431. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  432. flags |= RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX;
  433. }
  434. #else /*!SPI2_USING_DMA*/
  435. stm32_spi->dma = RT_NULL;
  436. #endif /*SPI2_USING_DMA*/
  437. #endif /*SPI_USE_DMA*/
  438. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  439. }
  440. else if(SPI == SPI3)
  441. {
  442. stm32_spi->SPI = SPI3;
  443. #ifdef SPI_USE_DMA
  444. #ifdef SPI3_USING_DMA
  445. {
  446. rt_event_init(&dma3.event, "spi3ev", RT_IPC_FLAG_FIFO);
  447. stm32_spi->dma = &dma3;
  448. /* rx dma interrupt config */
  449. NVIC_InitStructure.NVIC_IRQChannel = dma3.priv_data->tx_irq_ch;
  450. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  451. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  452. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  453. NVIC_Init(&NVIC_InitStructure);
  454. NVIC_InitStructure.NVIC_IRQChannel = dma3.priv_data->rx_irq_ch;
  455. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  456. NVIC_Init(&NVIC_InitStructure);
  457. /* Enable the DMA1 Clock */
  458. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  459. flags |= RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX;
  460. }
  461. #else /*!SPI3_USING_DMA*/
  462. stm32_spi->dma = RT_NULL;
  463. #endif /*SPI3_USING_DMA*/
  464. #endif /*SPI_USE_DMA*/
  465. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
  466. }
  467. else
  468. {
  469. return RT_ENOSYS;
  470. }
  471. res = rt_spi_bus_register(&stm32_spi->parent, spi_bus_name, &stm32_spi_ops);
  472. stm32_spi->parent.parent.flag |= flags;
  473. return res;
  474. }