yc11xx_uart.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "yc11xx_uart.h"
  2. typedef struct
  3. {
  4. uint16_t Baudrate;
  5. uint16_t RxSadr;
  6. uint16_t RxEadr;
  7. uint16_t RxRptr;
  8. uint16_t TxSadr;
  9. uint16_t TxEadr;
  10. uint16_t TxWptr;
  11. }UartxRegDef;
  12. typedef struct
  13. {
  14. UartxRegDef rbu;
  15. uint8_t cbu;
  16. }UartxRegControlBackup;
  17. #define UART_PER_NUM 2
  18. UartxRegControlBackup regBeck[UART_PER_NUM];
  19. uint8_t uartA_tx_buf[uart_DMA_buf_len]={0};
  20. uint8_t uartA_rx_buf[uart_DMA_buf_len]={0};
  21. uint8_t uartB_tx_buf[uart_DMA_buf_len]={0};
  22. uint8_t uartB_rx_buf[uart_DMA_buf_len]={0};
  23. void USART_Init(USART_TypeDef USARTx, USART_InitTypeDef* USART_InitStruct)
  24. {
  25. uint8_t CtrValue = 0;
  26. void *Ptr = NULL;
  27. uint16_t UartxCtrlAdr = 0;
  28. UartxRegDef *UartAdr = NULL;
  29. HWRITE(CORE_UART_CLKSEL, 1);
  30. HWCOR(CORE_CLKOFF + 1, 0x80);
  31. #define UARTC_BIT_ENABLE (1<<0)
  32. #define BAUD_USE_SETTING (1<<7)
  33. /*check parameter*/
  34. _ASSERT(USART_InitStruct != NULL);
  35. _ASSERT(IS_USARTAB(USARTx));
  36. _ASSERT(IS_UARTE_BAUDRATE(USART_InitStruct->USART_BaudRate));
  37. _ASSERT(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength));
  38. _ASSERT(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits));
  39. _ASSERT(IS_USART_PARITY(USART_InitStruct->USART_Parity));
  40. _ASSERT(IS_USART_MODE(USART_InitStruct->USART_Mode));
  41. _ASSERT(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl));
  42. _ASSERT(IS_USART_TXLen(USART_InitStruct->USART_TXLen));
  43. _ASSERT(IS_USART_RXLen(USART_InitStruct->USART_RXLen));
  44. /*init baud backup*/
  45. regBeck[USARTx].rbu.Baudrate = USART_InitStruct->USART_BaudRate;
  46. if(USARTx ==UARTA)
  47. {
  48. /*init tx ring buffer backup*/
  49. Ptr=uartA_tx_buf;
  50. regBeck[USARTx].rbu.TxSadr = (uint32_t)Ptr;
  51. regBeck[USARTx].rbu.TxEadr = (uint32_t)Ptr + USART_InitStruct->USART_TXLen;
  52. /*init rx ring buffer backup*/
  53. Ptr = uartA_rx_buf;
  54. regBeck[USARTx].rbu.RxSadr = (uint32_t)Ptr;
  55. regBeck[USARTx].rbu.RxEadr = (uint32_t)Ptr + USART_InitStruct->USART_RXLen;
  56. }
  57. else
  58. {
  59. /*init tx ring buffer backup*/
  60. Ptr = uartB_tx_buf;
  61. regBeck[USARTx].rbu.TxSadr = (uint32_t)Ptr;
  62. regBeck[USARTx].rbu.TxEadr = (uint32_t)Ptr + USART_InitStruct->USART_TXLen;
  63. /*init rx ring buffer backup*/
  64. Ptr = uartB_rx_buf;
  65. regBeck[USARTx].rbu.RxSadr = (uint32_t)Ptr;
  66. regBeck[USARTx].rbu.RxEadr = (uint32_t)Ptr + USART_InitStruct->USART_RXLen;
  67. }
  68. CtrValue = USART_InitStruct->USART_Mode | USART_InitStruct->USART_HardwareFlowControl |\
  69. USART_InitStruct->USART_Parity |USART_InitStruct->USART_StopBits| \
  70. USART_InitStruct->USART_WordLength|BAUD_USE_SETTING|UARTC_BIT_ENABLE;
  71. regBeck[USARTx].cbu = CtrValue;
  72. if(USARTx == UARTA) {
  73. UartxCtrlAdr = CORE_UART_CTRL;
  74. UartAdr = (UartxRegDef *)(reg_map(CORE_UART_BAUD));
  75. }
  76. else {
  77. UartxCtrlAdr = CORE_UARTB_CTRL;
  78. UartAdr = (UartxRegDef *)(reg_map(CORE_UARTB_BAUD));
  79. }
  80. HWCOR(UartxCtrlAdr, 1);
  81. /*init all reg by backup*/
  82. HW_REG_16BIT(((uint32_t)(&UartAdr->Baudrate)), regBeck[USARTx].rbu.Baudrate);
  83. HW_REG_16BIT(((uint32_t)(&UartAdr->TxSadr)), (uint32_t)regBeck[USARTx].rbu.TxSadr);
  84. HW_REG_16BIT(((uint32_t)(&UartAdr->TxEadr)), (uint32_t)regBeck[USARTx].rbu.TxEadr);
  85. HW_REG_16BIT(((uint32_t)(&UartAdr->TxWptr)), (uint32_t)regBeck[USARTx].rbu.TxSadr);
  86. HW_REG_16BIT(((uint32_t)(&UartAdr->RxSadr)), (uint32_t)regBeck[USARTx].rbu.RxSadr);
  87. HW_REG_16BIT(((uint32_t)(&UartAdr->RxEadr)), (uint32_t)regBeck[USARTx].rbu.RxEadr);
  88. HW_REG_16BIT(((uint32_t)(&UartAdr->RxRptr)), (uint32_t)regBeck[USARTx].rbu.RxSadr);
  89. HWOR(UartxCtrlAdr, regBeck[USARTx].cbu);
  90. }
  91. void USART_DeInit(USART_TypeDef USARTx)
  92. {
  93. _ASSERT(IS_USARTAB(USARTx));
  94. if(USARTx == UARTA) {
  95. HWOR(reg_map(CORE_UART_CTRL), (1<<0));
  96. HWOR(reg_map(CORE_UART_CTRL), (0<<0));
  97. }else {
  98. HWOR(reg_map(CORE_UARTB_CTRL), (1<<0));
  99. HWOR(reg_map(CORE_UARTB_CTRL), (0<<0));
  100. }
  101. }
  102. // void UartxInit(USART_TypeDef UARTx)
  103. // {
  104. // USART_InitTypeDef USART_InitStruct ;
  105. // USART_InitStruct.USART_BaudRate = UARTE_BAUDRATE_BAUDRATE_Baud115200;
  106. // USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  107. // USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  108. // USART_InitStruct.USART_StopBits = USART_StopBits_1;
  109. // USART_InitStruct.USART_Mode =USART_Mode_duplex;
  110. // USART_InitStruct.USART_Parity = USART_Parity_Even ;
  111. // USART_InitStruct.USART_RXLen = UARTBUFSIZE;
  112. // USART_InitStruct.USART_TXLen = UARTBUFSIZE;
  113. // if(UARTA == UARTx){
  114. // GPIO_SetGpioMultFunction(IO_TXA,GPCFG_UART_TXD);
  115. // GPIO_SetGpioMultFunction(IO_RXA,GPCFG_UART_RXD);
  116. // }else if (UARTB == UARTx){
  117. // GPIO_SetGpioMultFunction(IO_TXB,GPCFG_UARTB_TXD);
  118. // GPIO_SetGpioMultFunction(IO_RXB,GPCFG_UARTB_RXD);
  119. // }
  120. // USART_Init(UARTx,&USART_InitStruct);
  121. // }
  122. void USART_SendData(USART_TypeDef USARTx, uint8_t Data)
  123. {
  124. UartxRegDef * UartAdr = NULL;
  125. uint16_t WPtr = 0;
  126. _ASSERT(IS_USARTAB(USARTx));
  127. if(USARTx == UARTA) {
  128. UartAdr = (UartxRegDef *)(reg_map(CORE_UART_BAUD));
  129. }else {
  130. UartAdr = (UartxRegDef *)(reg_map(CORE_UARTB_BAUD));
  131. }
  132. _ASSERT((&UartAdr->TxSadr != NULL));
  133. if(USARTx == UARTA) {
  134. while((HREADW(CORE_UART_TX_ITEMS)) > 0);
  135. }else {
  136. while((HREADW(CORE_UARTB_TX_ITEMS)) > 0);
  137. }
  138. WPtr = HR_REG_16BIT((uint32_t)(&UartAdr->TxWptr));
  139. HW_REG_8BIT(WPtr|M0_MEMORY_BASE,Data);
  140. RB_UPDATE_PTR(WPtr, HR_REG_16BIT((uint32_t)(&UartAdr->TxSadr)), HR_REG_16BIT((uint32_t)(&UartAdr->TxEadr)));
  141. HW_REG_16BIT((uint32_t)(&UartAdr->TxWptr), WPtr);
  142. // if(USARTx == UARTA) {
  143. // while((HREADW(CORE_UART_TX_ITEMS)) > 0);
  144. // }else {
  145. // while((HREADW(CORE_UARTB_TX_ITEMS)) > 0);
  146. // }
  147. }
  148. uint16_t USART_ReceiveData(USART_TypeDef USARTx)
  149. {
  150. UartxRegDef *UartAdr = NULL;
  151. uint16_t RPtr = 0;
  152. uint16_t RdData = 0;
  153. _ASSERT(IS_USARTAB(USARTx));
  154. if(USARTx == UARTA) {
  155. UartAdr = (UartxRegDef *)(reg_map(CORE_UART_BAUD));
  156. }else {
  157. UartAdr = (UartxRegDef *)(reg_map(CORE_UARTB_BAUD));
  158. }
  159. RPtr = HR_REG_16BIT((uint32_t)(&UartAdr->RxRptr));
  160. RdData = HR_REG_16BIT(RPtr|M0_MEMORY_BASE);
  161. RB_UPDATE_PTR(RPtr, HR_REG_16BIT((uint32_t)(&UartAdr->RxSadr)), HR_REG_16BIT((uint32_t)(&UartAdr->RxEadr)));
  162. HW_REG_16BIT((uint32_t)(&UartAdr->RxRptr), RPtr);
  163. return RdData;
  164. }
  165. uint16_t USART_GetRxCount(USART_TypeDef USARTx)
  166. {
  167. _ASSERT(IS_USARTAB(USARTx));
  168. if(USARTx == UARTA) {
  169. return HR_REG_16BIT(reg_map(CORE_UART_RX_ITEMS));
  170. }else {
  171. return HR_REG_16BIT(reg_map(CORE_UARTB_RX_ITEMS));
  172. }
  173. }
  174. uint16_t USART_ReadDatatoBuff(USART_TypeDef USARTx, uint8_t* RxBuff, uint16_t RxSize)
  175. {
  176. uint16_t RxLen = 0;
  177. uint16_t RPtr = 0;
  178. uint16_t RdataLen = 0;
  179. uint32_t RxITEMS = 0;
  180. UartxRegDef *UartAdr = NULL;
  181. _ASSERT(IS_USARTAB(USARTx));
  182. _ASSERT(RxBuff != NULL);
  183. if(USARTx == UARTA) {
  184. UartAdr = (UartxRegDef *)(reg_map(CORE_UART_BAUD));
  185. RxITEMS = reg_map(CORE_UART_RX_ITEMS);
  186. }else {
  187. UartAdr = (UartxRegDef *)(reg_map(CORE_UARTB_BAUD));
  188. RxITEMS = reg_map(CORE_UARTB_RX_ITEMS);
  189. }
  190. RxLen = HR_REG_16BIT(RxITEMS);
  191. if (RxSize!=0) {
  192. if (RxLen < RxSize)
  193. return 0;
  194. else
  195. RxLen = RxSize;
  196. }
  197. if (0 == RxLen) {
  198. return 0;
  199. } else {
  200. RPtr = HR_REG_16BIT((uint32_t)(&UartAdr->RxRptr));
  201. for(RdataLen = 0; RdataLen<RxLen; RdataLen++ )
  202. {
  203. RxBuff[RdataLen] = HR_REG_8BIT(RPtr|M0_MEMORY_BASE);
  204. RB_UPDATE_PTR(RPtr, HR_REG_16BIT((uint32_t)(&UartAdr->RxSadr)), HR_REG_16BIT((uint32_t)(&UartAdr->RxEadr)));
  205. }
  206. }
  207. HW_REG_16BIT((uint32_t)(&UartAdr->RxRptr), (RPtr));
  208. return RdataLen;
  209. }
  210. uint16_t USART_SendDataFromBuff(USART_TypeDef USARTx, uint8_t* TxBuff, uint16_t TxLen)
  211. {
  212. uint16_t WPtr = 0;
  213. uint16_t SDataLen = 0;
  214. uint16_t i;
  215. UartxRegDef *UartAdr = NULL;
  216. _ASSERT(IS_USARTAB(USARTx));
  217. _ASSERT(TxBuff != 0);
  218. _ASSERT(TxLen > 0);
  219. if(USARTx == UARTA) {
  220. UartAdr = (UartxRegDef *)(reg_map(CORE_UART_BAUD));
  221. }else {
  222. UartAdr = (UartxRegDef *)(reg_map(CORE_UARTB_BAUD));
  223. }
  224. _ASSERT((&UartAdr->TxSadr != NULL));
  225. if(USARTx == UARTA) {
  226. while((HREADW(CORE_UART_TX_ITEMS)) > 0);
  227. }else {
  228. while((HREADW(CORE_UARTB_TX_ITEMS)) > 0);
  229. }
  230. WPtr = HR_REG_16BIT((uint32_t)(&UartAdr->TxWptr));
  231. for ( i=0; i<TxLen; i++) {
  232. HW_REG_8BIT(WPtr|M0_MEMORY_BASE,TxBuff[i]);
  233. RB_UPDATE_PTR(WPtr, HR_REG_16BIT((uint32_t)(&UartAdr->TxSadr)), HR_REG_16BIT((uint32_t)(&UartAdr->TxEadr)));
  234. SDataLen++;
  235. }
  236. HW_REG_16BIT((uint32_t)(&UartAdr->TxWptr), WPtr);
  237. // if(USARTx == UARTA) {
  238. // while(HREADW(CORE_UART_TX_ITEMS) > 0);
  239. // }else {
  240. // while(HREADW(CORE_UARTB_TX_ITEMS) > 0);
  241. // }
  242. return SDataLen;
  243. }
  244. //int fputc(int ch, FILE *f)
  245. //{
  246. // USART_SendData(UARTB, (unsigned char) ch);
  247. // while (!(HR_REG_16BIT(reg_map(CORE_UARTB_TX_ITEMS))));
  248. // return (ch);
  249. //}