uart.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2016. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */
  33. #include "ac780x_uart_reg.h"
  34. #include "ac780x_dma.h"
  35. #include "uart.h"
  36. #include "gpio.h"
  37. #include "cfg.h"
  38. //#include "Comm.h"
  39. #define UART485 UART1
  40. #define UART485_IRQn UART1_IRQn
  41. UART_INFO rs485_info;
  42. uint32_t dmaRxBuf[UART_RECV_DATA_POOL_COUNT>>2];
  43. uint32_t dmaTxBuf[UART_TRANSMIT_DATA_POOL_COUNT>>2];
  44. int TransmitData(uint8_t *pdata, uint16_t length);
  45. void Rs485_Timer1_CB(void)
  46. {
  47. if(rs485_info.dmasend_count < 0xFF){
  48. rs485_info.dmasend_count++;
  49. }
  50. }
  51. /**
  52. * UARTTX_DMA_EventCallback
  53. *
  54. * @param[in] device: DMA_Type pointer
  55. * @param[in] wpara: DMA Channel Status
  56. * @param[in] lpara: reserve for user's code
  57. * @return none
  58. *
  59. * @brief uart transmit event callback
  60. */
  61. void UartTxDMAEventCallback(void *device, uint32_t wpara, uint32_t lpara)
  62. {
  63. if (wpara & DMA_CHANNEL_STATUS_FINISH_Msk) //!<DMA finish
  64. {
  65. rs485_info.dmasend_count = UART_DMASEND_COUNT_END;
  66. }
  67. else if (wpara & DMA_CHANNEL_STATUS_HALF_FINISH_Msk) //!<DMA half finish
  68. {
  69. }
  70. else if (wpara & DMA_CHANNEL_STATUS_TRANS_ERROR_Msk) //!<DMA error
  71. {
  72. }
  73. else
  74. {
  75. //!<never be here
  76. }
  77. }
  78. /**
  79. * UARTRX_DMA_EventCallback
  80. *
  81. * @param[in] device: DMA_Type pointer
  82. * @param[in] wpara: DMA Channel Status
  83. * @param[in] lpara: reserve for user's code
  84. * @return none
  85. *
  86. * @brief uart dma receive handle
  87. */
  88. static void UartRxDMAEventCallback(void *device, uint32_t wpara, uint32_t lpara)
  89. {
  90. /* Check if DMA Channel Receive Complete */
  91. if (wpara & DMA_CHANNEL_STATUS_FINISH_Msk) //!<DMA finish
  92. {
  93. }
  94. else if (wpara & DMA_CHANNEL_STATUS_HALF_FINISH_Msk) //!<DMA half finish
  95. {
  96. }
  97. else if (wpara & DMA_CHANNEL_STATUS_TRANS_ERROR_Msk) //!<DMA error
  98. {
  99. }
  100. else
  101. {
  102. //!<never be here
  103. }
  104. }
  105. /**
  106. * UARTRX_DMA_EventCallback
  107. *
  108. * @param[in] device: UART_Type pointer
  109. * @param[in] wpara: UART lsr0 register
  110. * @param[in] lpara: UART lsr1 register
  111. * @return none
  112. *
  113. * @brief uart dma receive handle
  114. */
  115. static void UartRxIdleCallBack(void *device, uint32_t wpara, uint32_t lpara)
  116. {
  117. /* Check if IDLE interrupt happened */
  118. if (lpara & UART_LSR1_IDLE_Msk)
  119. {
  120. // 关闭DMA
  121. DMA_SetChannel(DMA0_CHANNEL1, DISABLE);
  122. ///接收不足4字节会在DMA fifo中缓存
  123. rs485_info.recv_len = DMA0_CHANNEL1->DATA_TRANS_NUM + DMA0_CHANNEL1->FIFO_LEFT_NUM;
  124. ///将DMA fifo数据flush出来,因为mem设置为32bit,所以fifo也是4字节对齐
  125. ///(即使fifo里只有1个字节也会刷出4字节,需要保证缓存冗余不会溢出)
  126. DMA_ChannelFlush(DMA0_CHANNEL1);
  127. //DMA_SetChannel(DMA0_CHANNEL1, DISABLE);
  128. }
  129. }
  130. /**
  131. * rs485_Initialize
  132. *
  133. * @param[in] none
  134. * @return none
  135. *
  136. * @brief rs485 初始化
  137. */
  138. void rs485_Initialize(void)
  139. {
  140. UART_ConfigType uartConfig = {0};
  141. switch(config->br_index){
  142. case BaudRate_4800:
  143. uartConfig.baudrate = 4800;
  144. break;
  145. case BaudRate_9600:
  146. uartConfig.baudrate = 9600;
  147. break;
  148. case BaudRate_19200:
  149. uartConfig.baudrate = 19200;
  150. break;
  151. case BaudRate_38400:
  152. uartConfig.baudrate = 38400;
  153. break;
  154. case BaudRate_57600:
  155. uartConfig.baudrate = 57600;
  156. break;
  157. case BaudRate_115200:
  158. uartConfig.baudrate = 115200;
  159. break;
  160. case BaudRate_230400:
  161. uartConfig.baudrate = 230400;
  162. break;
  163. default:
  164. uartConfig.baudrate = 9600;
  165. break;
  166. };
  167. //uartConfig.baudrate = UART0_BaudRate;
  168. uartConfig.dataBits = UART_WORD_LEN_8BIT;
  169. uartConfig.stopBits = UART_STOP_1BIT;
  170. uartConfig.parity = UART_PARI_NO;
  171. uartConfig.fifoByteEn = ENABLE; ///<must enable fifoByte when use DMA
  172. uartConfig.dmaEn = UART_DMA_TXRX_EN;
  173. uartConfig.callBack = UartRxIdleCallBack; ///<uart2 interrupt callback
  174. UART_Init(UART485, &uartConfig);
  175. UART485->IDLE |= UART_IDLE_IDLEIE_Msk | UART_IDLE_ILEN_Msk; ///<enable uart idle interrupt
  176. ///Enable UARTx interrupt
  177. NVIC_SetPriority(UART485_IRQn, 5);
  178. NVIC_ClearPendingIRQ(UART485_IRQn);
  179. NVIC_EnableIRQ(UART485_IRQn);
  180. rs485_info.dmasend_count = 0;
  181. rs485_info.recv_buffer = (uint8_t *)dmaRxBuf;
  182. rs485_info.send_buffer = (uint8_t *)dmaTxBuf;
  183. rs485_info.recv_len = 0;
  184. rs485_info.send_len = 0;
  185. UART_ReceiveDMA(UART485, DMA0_CHANNEL1, rs485_info.recv_buffer, UART_RECV_DATA_POOL_COUNT, UartRxDMAEventCallback);
  186. }
  187. /**
  188. * TransmitData
  189. *
  190. * @param[in] pdata :发送数据指针
  191. * @param[in] length :发送数据长度
  192. * @return none
  193. *
  194. * @brief uart 发送函数,通过中断发送
  195. */
  196. int rs485_TransmitData(uint8_t *pdata, uint16_t length)
  197. {
  198. RS485_TX_EN;
  199. rs485_info.dmasend_count = UART_DMASEND_COUNT_START;
  200. UART_TransmitDMA(UART485, DMA0_CHANNEL0, pdata, length, UartTxDMAEventCallback);
  201. //uart0_info.recv_len=0;
  202. //UART_ReceiveDMA(UARTx, DMA0_CHANNEL1, uart0_info.recv_buffer, UART0_RECV_DATA_POOL_COUNT, UartRxDMAEventCallback);
  203. return 0;
  204. }
  205. void rs485_RecvData(void)
  206. {
  207. rs485_info.recv_len=0;
  208. UART_ReceiveDMA(UART485, DMA0_CHANNEL1, rs485_info.recv_buffer, UART_RECV_DATA_POOL_COUNT, UartRxDMAEventCallback);
  209. }