uart.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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) 2022. 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. /******************************************************************************
  34. * @version: V2.0.1 AC7840x Demo
  35. ******************************************************************************/
  36. #include "uart.h"
  37. #include "string.h"
  38. #include "ckgen_drv.h"
  39. #include "ckgen_hw.h"
  40. #include "gpio_drv.h"
  41. #include "gpio_hw.h"
  42. #include "uart_drv.h"
  43. #include "uart_hw.h"
  44. #include "uart_irq.h"
  45. #include "dma_drv.h"
  46. #include "dma_hw.h"
  47. #include "cfg.h"
  48. #include "gpio.h"
  49. #define UART1_RX_DMA_CHANNEL 0
  50. #define UART1_TX_DMA_CHANNEL 1
  51. #define UART1_INSTANCE_ID 1
  52. //#define UART_DATA_LEN 4 /*数据传输长度*/
  53. uart_state_t s_uartState = {NULL}; /*UART运行变量状态*/
  54. UART_INFO uart1_info;
  55. uint32_t dmaRxBuf[UART1_RECV_DATA_POOL_COUNT>>2];
  56. uint32_t dmaTxBuf[UART1_TRANSMIT_DATA_POOL_COUNT>>2];
  57. //uint8_t g_sendflag = 0;
  58. void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam);
  59. void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam);
  60. /* UART rx DMA channel config */
  61. dma_channel_config_t s_uartRxDmaChConfig =
  62. {
  63. .channelPriority = DMA_CHN_PRIORITY_LOW,
  64. .virtChnConfig = UART1_RX_DMA_CHANNEL,
  65. .source = DMA_REQ_UART1_RX,
  66. .callback = (dma_callback_t)UART_RxDMAEventCallback,
  67. .callbackParam = NULL,
  68. .enableTrigger = false,
  69. };
  70. /* UART tx DMA channel config */
  71. dma_channel_config_t s_uartTxDmaChConfig =
  72. {
  73. .channelPriority = DMA_CHN_PRIORITY_LOW,
  74. .virtChnConfig = UART1_TX_DMA_CHANNEL,
  75. .source = DMA_REQ_UART1_TX,
  76. .callback = (dma_callback_t)UART_TxDMAEventCallback,
  77. .callbackParam = NULL,
  78. .enableTrigger = false,
  79. };
  80. dma_chn_state_t s_uartRxDmaChState =
  81. {
  82. .virtChn = UART1_RX_DMA_CHANNEL, /* dma virtual channel */
  83. .status = DMA_CHN_NORMAL, /* dma channel normal */
  84. .callback = NULL, /* no callback function */
  85. };
  86. /* UART tx dma channel state */
  87. dma_chn_state_t s_uartTxDmaChState =
  88. {
  89. .virtChn = UART1_TX_DMA_CHANNEL, /* dma virtual channel */
  90. .status = DMA_CHN_NORMAL, /* dma channel normal */
  91. .callback = NULL,
  92. };
  93. dma_state_t g_dma_state;
  94. typedef enum
  95. {
  96. UART_RX_INIT = 1,
  97. UART_RX_DATA = 2,
  98. UART_RX_FINISH = 3,
  99. UART_TX_STA = 4,
  100. } uart_rx_step_t;
  101. uart_rx_step_t g_uartRxStep = UART_RX_INIT;
  102. /*!
  103. * @brief Uart transmit event callback
  104. * @param[in] DMAx: DMA_Type pointer
  105. * @param[in] wparam: reserve for user's code
  106. * @param[in] lparam: reserve for user's code
  107. * @return none
  108. */
  109. void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam)
  110. {
  111. }
  112. /*!
  113. * @brief Uart dma receive handle
  114. * @param[in] DMAx: DMA_Type pointer
  115. * @param[in] wparam: reserve for user's code
  116. * @param[in] lparam: reserve for user's code
  117. * @return none
  118. */
  119. void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam)
  120. {
  121. }
  122. /*!
  123. * @brief UART1接收中断回调函数
  124. *
  125. *
  126. * @param none
  127. * @return none
  128. */
  129. void UART1_RX_Callback(void *driverState, uint32_t event, void *userData)
  130. {
  131. if(event == UART_EVENT_IDLE_LINE){
  132. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  133. //UART_SetIdleInterrupt(uart_type, false);
  134. uint32_t rxRemainByte = UART1_RECV_DATA_POOL_COUNT;
  135. UART_DRV_GetReceiveStatus(UART1_INSTANCE_ID, &rxRemainByte);
  136. uart1_info.recv_len = UART1_RECV_DATA_POOL_COUNT - rxRemainByte;
  137. UART_DRV_AbortReceivingData(UART1_INSTANCE_ID);
  138. }else if(event == UART_EVENT_END_TRANSFER){
  139. //LED3_TOGGLE;
  140. }else{
  141. }
  142. }
  143. /*!
  144. * @brief UART1发送中断回调函数
  145. *
  146. *
  147. * @param none
  148. * @return none
  149. */
  150. void UART1_TX_Callback(void *driverState, uint32_t event, void *userData)
  151. {
  152. if(UART_EVENT_TX_EMPTY == event){
  153. }else if(event == UART_EVENT_END_TRANSFER){
  154. //uart1_info.recv_len = 0;
  155. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  156. //UART_SetIdleInterrupt(uart_type, true);
  157. //UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  158. }else{
  159. }
  160. }
  161. /**
  162. * Uart1_Initialize
  163. *
  164. * @param[in] none
  165. * @return none
  166. *
  167. * @brief uart 初始化
  168. */
  169. void Uart1_Initialize(void)
  170. {
  171. uart_user_config_t userConfig;
  172. memset(&userConfig, 0U, sizeof(userConfig));
  173. /*GPIO Configuration for UART1 */
  174. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
  175. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
  176. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
  177. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
  178. switch(config->br_index){
  179. case BaudRate_4800:
  180. userConfig.baudRate = 4800;
  181. break;
  182. case BaudRate_9600:
  183. userConfig.baudRate = 9600;
  184. break;
  185. case BaudRate_19200:
  186. userConfig.baudRate = 19200;
  187. break;
  188. case BaudRate_38400:
  189. userConfig.baudRate = 38400;
  190. break;
  191. case BaudRate_57600:
  192. userConfig.baudRate = 57600;
  193. break;
  194. case BaudRate_115200:
  195. userConfig.baudRate = 115200;
  196. break;
  197. case BaudRate_230400:
  198. userConfig.baudRate = 230400;
  199. break;
  200. default:
  201. userConfig.baudRate = 115200;
  202. break;
  203. };
  204. userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
  205. userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
  206. userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
  207. userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
  208. userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
  209. userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
  210. userConfig.rxCallback = UART1_RX_Callback;
  211. userConfig.rxCallbackParam = NULL;
  212. userConfig.txCallback = UART1_TX_Callback;
  213. userConfig.txCallbackParam = NULL;
  214. UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
  215. UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  216. UART_SetIdleFunc(uart_type, true);
  217. UART_SetIdleInterrupt(uart_type, true);
  218. uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
  219. uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
  220. uart1_info.recv_len = 0;
  221. uart1_info.send_len = 0;
  222. RS485_RX_EN;
  223. UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  224. }
  225. int Uart1_TransmitData(uint8_t *pdata, uint16_t length)
  226. {
  227. //UART_DRV_SendData(UART1_INSTANCE_ID, pdata, length);
  228. RS485_TX_EN;
  229. UART_DRV_SendDataBlocking(UART1_INSTANCE_ID, pdata, length, 50);
  230. return 0;
  231. }
  232. void Uart1_RecvData(void)
  233. {
  234. uart1_info.recv_len = 0;
  235. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  236. //UART_SetIdleFunc(uart_type, true);
  237. //UART_SetIdleInterrupt(uart_type, true);
  238. RS485_RX_EN;
  239. UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  240. }
  241. /*!
  242. * @brief UART模块配置
  243. * UART1配置普通UART模式,波特率115200,数据长度为8bit,停止位为1bit
  244. * 使能接收和发送DMA功能
  245. * @param none
  246. * @return none
  247. */
  248. void UART1_Init(void)
  249. {
  250. uart_user_config_t userConfig;
  251. /*GPIO Configuration for UART1 */
  252. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
  253. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
  254. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
  255. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
  256. memset(&userConfig, 0U, sizeof(userConfig));
  257. userConfig.baudRate = 115200; /*波特率配置 */
  258. userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
  259. userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
  260. userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
  261. userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
  262. userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
  263. userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
  264. userConfig.rxCallback = UART1_RX_Callback;
  265. userConfig.rxCallbackParam = NULL;
  266. userConfig.txCallback = UART1_TX_Callback;
  267. userConfig.txCallbackParam = NULL;
  268. UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
  269. UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  270. UART_SetIdleFunc(uart_type, true);
  271. UART_SetIdleInterrupt(uart_type, true);
  272. /*DMA配置*/
  273. //DMA_DRV_Init(&g_dma_state, NULL, NULL, NULL);
  274. //DMA_DRV_ChannelInit(&s_uartRxDmaChState, &s_uartRxDmaChConfig);
  275. //DMA_DRV_ChannelInit(&s_uartTxDmaChState, &s_uartTxDmaChConfig);
  276. uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
  277. uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
  278. uart1_info.recv_len = 0;
  279. uart1_info.send_len = 0;
  280. RS485_RX_EN;
  281. UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  282. }
  283. /*!
  284. * @brief UART数据传输处理
  285. * UART查询接收数据,接收到数据后再将数据发送出去
  286. *
  287. * @param none
  288. * @return none
  289. */
  290. void UART1_DATA_Proce(void)
  291. {
  292. //uint32_t rxRemainByte = 0;
  293. #if 0
  294. status_t status;
  295. status = UART_DRV_ReceiveDataPolling(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  296. if (status == STATUS_SUCCESS)
  297. {
  298. memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
  299. uart1_info.send_len = uart1_info.recv_len;
  300. UART_DRV_SendData(UART1_INSTANCE, uart1_info.send_buffer, uart1_info.send_len);
  301. }
  302. #else
  303. if(uart1_info.recv_len > 0){
  304. memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
  305. uart1_info.send_len = uart1_info.recv_len;
  306. UART_DRV_SendData(UART1_INSTANCE_ID, uart1_info.send_buffer, uart1_info.send_len);
  307. uart1_info.recv_len = 0;
  308. }
  309. #endif
  310. }