uart.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515
  1. /******************************************************************************
  2. * Filename: uart.c
  3. * Revised: $Date: 2013-04-16 12:01:40 +0200 (Tue, 16 Apr 2013) $
  4. * Revision: $Revision: 9777 $
  5. *
  6. * Description: Driver for the UART.
  7. *
  8. * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
  9. *
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. *
  18. * Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the distribution.
  21. *
  22. * Neither the name of Texas Instruments Incorporated nor the names of
  23. * its contributors may be used to endorse or promote products derived
  24. * from this software without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  27. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  28. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  29. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  30. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  31. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  32. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  33. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  34. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  35. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  36. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  37. *
  38. ******************************************************************************/
  39. //*****************************************************************************
  40. //
  41. //! \addtogroup uart_api
  42. //! @{
  43. //
  44. //*****************************************************************************
  45. #include "hw_ints.h"
  46. #include "hw_memmap.h"
  47. #include "hw_sys_ctrl.h"
  48. #include "hw_uart.h"
  49. #include "debug.h"
  50. #include "interrupt.h"
  51. #include "uart.h"
  52. //*****************************************************************************
  53. //
  54. //! \internal
  55. //! Checks a UART base address
  56. //!
  57. //! \param ui32Base is the base address of the UART port.
  58. //!
  59. //! This function determines if a UART port base address is valid.
  60. //!
  61. //! \return Returns \b true if the base address is valid and \b false
  62. //! otherwise.
  63. //
  64. //*****************************************************************************
  65. #ifdef ENABLE_ASSERT
  66. static bool
  67. UARTBaseValid(uint32_t ui32Base)
  68. {
  69. return((ui32Base == UART0_BASE) || (ui32Base == UART1_BASE));
  70. }
  71. #endif
  72. //*****************************************************************************
  73. //
  74. //! Sets the type of parity
  75. //!
  76. //! \param ui32Base is the base address of the UART port.
  77. //! \param ui32Parity specifies the type of parity to use.
  78. //!
  79. //! This function sets the type of parity to use for transmitting and expect
  80. //! when receiving. The \e ui32Parity parameter must be one of
  81. //! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD,
  82. //! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO. The last two allow
  83. //! direct control of the parity bit; it is always either one or zero based on
  84. //! the mode.
  85. //!
  86. //! \return None
  87. //
  88. //*****************************************************************************
  89. void
  90. UARTParityModeSet(uint32_t ui32Base, uint32_t ui32Parity)
  91. {
  92. //
  93. // Check the arguments.
  94. //
  95. ASSERT(UARTBaseValid(ui32Base));
  96. ASSERT((ui32Parity == UART_CONFIG_PAR_NONE) ||
  97. (ui32Parity == UART_CONFIG_PAR_EVEN) ||
  98. (ui32Parity == UART_CONFIG_PAR_ODD) ||
  99. (ui32Parity == UART_CONFIG_PAR_ONE) ||
  100. (ui32Parity == UART_CONFIG_PAR_ZERO));
  101. //
  102. // Set the parity mode.
  103. //
  104. HWREG(ui32Base + UART_O_LCRH) = ((HWREG(ui32Base + UART_O_LCRH) &
  105. ~(UART_LCRH_SPS | UART_LCRH_EPS |
  106. UART_LCRH_PEN)) | ui32Parity);
  107. }
  108. //*****************************************************************************
  109. //
  110. //! Gets the type of parity currently being used
  111. //!
  112. //! \param ui32Base is the base address of the UART port.
  113. //!
  114. //! This function gets the type of parity used for transmitting data and
  115. //! expected when receiving data.
  116. //!
  117. //! \return Returns the current parity settings, specified as one of
  118. //! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD,
  119. //! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO.
  120. //
  121. //*****************************************************************************
  122. uint32_t
  123. UARTParityModeGet(uint32_t ui32Base)
  124. {
  125. //
  126. // Check the arguments.
  127. //
  128. ASSERT(UARTBaseValid(ui32Base));
  129. //
  130. // Return the current parity setting.
  131. //
  132. return(HWREG(ui32Base + UART_O_LCRH) &
  133. (UART_LCRH_SPS | UART_LCRH_EPS | UART_LCRH_PEN));
  134. }
  135. //*****************************************************************************
  136. //
  137. //! Sets the FIFO level at which interrupts are generated
  138. //!
  139. //! \param ui32Base is the base address of the UART port.
  140. //! \param ui32TxLevel is the transmit FIFO interrupt level, specified as one of
  141. //! \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8, \b UART_FIFO_TX4_8,
  142. //! \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
  143. //! \param ui32RxLevel is the receive FIFO interrupt level, specified as one of
  144. //! \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8, \b UART_FIFO_RX4_8,
  145. //! \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
  146. //!
  147. //! This function sets the FIFO level at which transmit and receive interrupts
  148. //! are generated.
  149. //!
  150. //! \return None
  151. //
  152. //*****************************************************************************
  153. void
  154. UARTFIFOLevelSet(uint32_t ui32Base, uint32_t ui32TxLevel,
  155. uint32_t ui32RxLevel)
  156. {
  157. //
  158. // Check the arguments.
  159. //
  160. ASSERT(UARTBaseValid(ui32Base));
  161. ASSERT((ui32TxLevel == UART_FIFO_TX1_8) ||
  162. (ui32TxLevel == UART_FIFO_TX2_8) ||
  163. (ui32TxLevel == UART_FIFO_TX4_8) ||
  164. (ui32TxLevel == UART_FIFO_TX6_8) ||
  165. (ui32TxLevel == UART_FIFO_TX7_8));
  166. ASSERT((ui32RxLevel == UART_FIFO_RX1_8) ||
  167. (ui32RxLevel == UART_FIFO_RX2_8) ||
  168. (ui32RxLevel == UART_FIFO_RX4_8) ||
  169. (ui32RxLevel == UART_FIFO_RX6_8) ||
  170. (ui32RxLevel == UART_FIFO_RX7_8));
  171. //
  172. // Set the FIFO interrupt levels.
  173. //
  174. HWREG(ui32Base + UART_O_IFLS) = ui32TxLevel | ui32RxLevel;
  175. }
  176. //*****************************************************************************
  177. //
  178. //! Gets the FIFO level at which interrupts are generated
  179. //!
  180. //! \param ui32Base is the base address of the UART port.
  181. //! \param pui32TxLevel is a pointer to storage for the transmit FIFO level,
  182. //! returned as one of \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8,
  183. //! \b UART_FIFO_TX4_8, \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
  184. //! \param pui32RxLevel is a pointer to storage for the receive FIFO level,
  185. //! returned as one of \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8,
  186. //! \b UART_FIFO_RX4_8, \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
  187. //!
  188. //! This function gets the FIFO level at which transmit and receive interrupts
  189. //! are generated.
  190. //!
  191. //! \return None
  192. //
  193. //*****************************************************************************
  194. void
  195. UARTFIFOLevelGet(uint32_t ui32Base, uint32_t *pui32TxLevel,
  196. uint32_t *pui32RxLevel)
  197. {
  198. uint32_t ui32Temp;
  199. //
  200. // Check the arguments.
  201. //
  202. ASSERT(UARTBaseValid(ui32Base));
  203. //
  204. // Read the FIFO level register.
  205. //
  206. ui32Temp = HWREG(ui32Base + UART_O_IFLS);
  207. //
  208. // Extract the transmit and receive FIFO levels.
  209. //
  210. *pui32TxLevel = ui32Temp & UART_IFLS_TXIFLSEL_M;
  211. *pui32RxLevel = ui32Temp & UART_IFLS_RXIFLSEL_M;
  212. }
  213. //*****************************************************************************
  214. //
  215. //! Sets the configuration of a UART
  216. //!
  217. //! \param ui32Base is the base address of the UART port.
  218. //! \param ui32UARTClk is the rate of the clock supplied to the UART module.
  219. //! \param ui32Baud is the desired baud rate.
  220. //! \param ui32Config is the data format for the port (number of data bits,
  221. //! number of stop bits, and parity).
  222. //!
  223. //! This function configures the UART for operation in the specified data
  224. //! format. The baud rate is provided in the \e ui32Baud parameter and the data
  225. //! format in the \e ui32Config parameter.
  226. //!
  227. //! The \e ui32Config parameter is the logical OR of three values: the number of
  228. //! data bits, the number of stop bits, and the parity. \b UART_CONFIG_WLEN_8,
  229. //! \b UART_CONFIG_WLEN_7, \b UART_CONFIG_WLEN_6, and \b UART_CONFIG_WLEN_5
  230. //! select from eight to five data bits per byte (respectively).
  231. //! \b UART_CONFIG_STOP_ONE and \b UART_CONFIG_STOP_TWO select one or two stop
  232. //! bits (respectively). \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN,
  233. //! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, and \b UART_CONFIG_PAR_ZERO
  234. //! select the parity mode (no parity bit, even parity bit, odd parity bit,
  235. //! parity bit always one, and parity bit always zero, respectively).
  236. //!
  237. //! The peripheral clock is set in the System Control module. The frequency of
  238. //! the system clock is the value returned by SysCtrlClockGet() or
  239. //! SysCtrlIOClockGet() depending on the chosen clock source as set by
  240. //! UARTClockSourceSet(), or it can be explicitly hard coded if it is constant
  241. //! and known (to save the code/execution overhead of a call to
  242. //! SysCtrlClockGet() or SysCtrlIOClockGet()).
  243. //!
  244. //! The CC2538 part has the ability to specify the UART baud clock
  245. //! source (via UARTClockSourceSet()), the peripheral clock can be changed to
  246. //! PIOSC. In this case, the peripheral clock should be specified as
  247. //! 16,000,000 (the nominal rate of PIOSC).
  248. //!
  249. //! \sa See UARTClockSourceSet()
  250. //!
  251. //! \return None
  252. //
  253. //*****************************************************************************
  254. void
  255. UARTConfigSetExpClk(uint32_t ui32Base, uint32_t ui32UARTClk,
  256. uint32_t ui32Baud, uint32_t ui32Config)
  257. {
  258. uint32_t ui32Div;
  259. //
  260. // Check the arguments.
  261. //
  262. ASSERT(UARTBaseValid(ui32Base));
  263. ASSERT(ui32Baud != 0);
  264. //
  265. // Stop the UART.
  266. //
  267. UARTDisable(ui32Base);
  268. //
  269. // Is the required baud rate greater than the maximum rate supported
  270. // without the use of high speed mode?
  271. //
  272. if((ui32Baud * 16) > ui32UARTClk)
  273. {
  274. //
  275. // Enable high speed mode.
  276. //
  277. HWREG(ui32Base + UART_O_CTL) |= UART_CTL_HSE;
  278. //
  279. // Half the supplied baud rate to compensate for enabling high speed
  280. // mode. This allows the following code to be common to both cases.
  281. //
  282. ui32Baud /= 2;
  283. }
  284. else
  285. {
  286. //
  287. // Disable high speed mode.
  288. //
  289. HWREG(ui32Base + UART_O_CTL) &= ~(UART_CTL_HSE);
  290. }
  291. //
  292. // Compute the fractional baud rate divider.
  293. //
  294. ui32Div = (((ui32UARTClk * 8) / ui32Baud) + 1) / 2;
  295. //
  296. // Set the baud rate.
  297. //
  298. HWREG(ui32Base + UART_O_IBRD) = ui32Div / 64;
  299. HWREG(ui32Base + UART_O_FBRD) = ui32Div % 64;
  300. //
  301. // Set parity, data length, and number of stop bits.
  302. //
  303. HWREG(ui32Base + UART_O_LCRH) = ui32Config;
  304. //
  305. // Clear the flags register.
  306. //
  307. HWREG(ui32Base + UART_O_FR) = 0;
  308. }
  309. //*****************************************************************************
  310. //
  311. //! Gets the current configuration of a UART
  312. //!
  313. //! \param ui32Base is the base address of the UART port.
  314. //! \param ui32UARTClk is the rate of the clock supplied to the UART module.
  315. //! \param pui32Baud is a pointer to storage for the baud rate.
  316. //! \param pui32Config is a pointer to storage for the data format.
  317. //!
  318. //! The baud rate and data format for the UART is determined, given an
  319. //! explicitly provided peripheral clock (hence the ExpClk suffix). The
  320. //! returned baud rate is the actual baud rate; it may not be the exact baud
  321. //! rate requested or an ``official'' baud rate. The data format returned in
  322. //! \e pui32Config is enumerated the same as the \e ui32Config parameter of
  323. //! UARTConfigSetExpClk().
  324. //!
  325. //! The peripheral clock is set in the System Control module. The frequency of
  326. //! the system clock is the value returned by SysCtrlClockGet() or
  327. //! SysCtrlIOClockGet() depending on the chosen clock source as set by
  328. //! UARTClockSourceSet(), or it can be explicitly hard coded if it is constant
  329. //! and known (to save the code/execution overhead of a call to
  330. //! SysCtrlClockGet() or SysCtrlIOClockGet()).
  331. //!
  332. //! The CC2538 part has the ability to specify the UART baud clock
  333. //! source (via UARTClockSourceSet()), the peripheral clock can be changed to
  334. //! PIOSC. In this case, the peripheral clock should be specified as
  335. //! 16,000,000 (the nominal rate of PIOSC).
  336. //!
  337. //! \return None
  338. //
  339. //*****************************************************************************
  340. void
  341. UARTConfigGetExpClk(uint32_t ui32Base, uint32_t ui32UARTClk,
  342. uint32_t *pui32Baud, uint32_t *pui32Config)
  343. {
  344. uint32_t ui32Int, ui32Frac;
  345. //
  346. // Check the arguments.
  347. //
  348. ASSERT(UARTBaseValid(ui32Base));
  349. //
  350. // Compute the baud rate.
  351. //
  352. ui32Int = HWREG(ui32Base + UART_O_IBRD);
  353. ui32Frac = HWREG(ui32Base + UART_O_FBRD);
  354. *pui32Baud = (ui32UARTClk * 4) / ((64 * ui32Int) + ui32Frac);
  355. //
  356. // See if high speed mode enabled.
  357. //
  358. if(HWREG(ui32Base + UART_O_CTL) & UART_CTL_HSE)
  359. {
  360. //
  361. // High speed mode is enabled so the actual baud rate is actually
  362. // double what was just calculated.
  363. //
  364. *pui32Baud *= 2;
  365. }
  366. //
  367. // Get the parity, data length, and number of stop bits.
  368. //
  369. *pui32Config = (HWREG(ui32Base + UART_O_LCRH) &
  370. (UART_LCRH_SPS | UART_LCRH_WLEN_M | UART_LCRH_STP2 |
  371. UART_LCRH_EPS | UART_LCRH_PEN));
  372. }
  373. //*****************************************************************************
  374. //
  375. //! Enables transmitting and receiving
  376. //!
  377. //! \param ui32Base is the base address of the UART port.
  378. //!
  379. //! This function sets the UARTEN, TXE, and RXE bits, and enables the transmit
  380. //! and receive FIFOs.
  381. //!
  382. //! \return None
  383. //
  384. //*****************************************************************************
  385. void
  386. UARTEnable(uint32_t ui32Base)
  387. {
  388. //
  389. // Check the arguments.
  390. //
  391. ASSERT(UARTBaseValid(ui32Base));
  392. //
  393. // Enable the FIFO.
  394. //
  395. HWREG(ui32Base + UART_O_LCRH) |= UART_LCRH_FEN;
  396. //
  397. // Enable RX, TX, and the UART.
  398. //
  399. HWREG(ui32Base + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE |
  400. UART_CTL_RXE);
  401. }
  402. //*****************************************************************************
  403. //
  404. //! Disables transmitting and receiving
  405. //!
  406. //! \param ui32Base is the base address of the UART port.
  407. //!
  408. //! This function clears the UARTEN, TXE, and RXE bits, waits for the end of
  409. //! transmission of the current character, and flushes the transmit FIFO.
  410. //!
  411. //! \return None
  412. //
  413. //*****************************************************************************
  414. void
  415. UARTDisable(uint32_t ui32Base)
  416. {
  417. //
  418. // Check the arguments.
  419. //
  420. ASSERT(UARTBaseValid(ui32Base));
  421. //
  422. // Wait for end of TX.
  423. //
  424. while(HWREG(ui32Base + UART_O_FR) & UART_FR_BUSY)
  425. {
  426. }
  427. //
  428. // Disable the FIFO.
  429. //
  430. HWREG(ui32Base + UART_O_LCRH) &= ~(UART_LCRH_FEN);
  431. //
  432. // Disable the UART.
  433. //
  434. HWREG(ui32Base + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE |
  435. UART_CTL_RXE);
  436. }
  437. //*****************************************************************************
  438. //
  439. //! Enables the transmit and receive FIFOs
  440. //!
  441. //! \param ui32Base is the base address of the UART port.
  442. //!
  443. //! This functions enables the transmit and receive FIFOs in the UART.
  444. //!
  445. //! \return None
  446. //
  447. //*****************************************************************************
  448. void
  449. UARTFIFOEnable(uint32_t ui32Base)
  450. {
  451. //
  452. // Check the arguments.
  453. //
  454. ASSERT(UARTBaseValid(ui32Base));
  455. //
  456. // Enable the FIFO.
  457. //
  458. HWREG(ui32Base + UART_O_LCRH) |= UART_LCRH_FEN;
  459. }
  460. //*****************************************************************************
  461. //
  462. //! Disables the transmit and receive FIFOs
  463. //!
  464. //! \param ui32Base is the base address of the UART port.
  465. //!
  466. //! This functions disables the transmit and receive FIFOs in the UART.
  467. //!
  468. //! \return None
  469. //
  470. //*****************************************************************************
  471. void
  472. UARTFIFODisable(uint32_t ui32Base)
  473. {
  474. //
  475. // Check the arguments.
  476. //
  477. ASSERT(UARTBaseValid(ui32Base));
  478. //
  479. // Disable the FIFO.
  480. //
  481. HWREG(ui32Base + UART_O_LCRH) &= ~(UART_LCRH_FEN);
  482. }
  483. //*****************************************************************************
  484. //
  485. //! Enables SIR (IrDA) mode on the specified UART
  486. //!
  487. //! \param ui32Base is the base address of the UART port.
  488. //! \param bLowPower indicates if SIR Low Power Mode is to be used.
  489. //!
  490. //! This function enables the SIREN control bit for IrDA mode on the UART. If
  491. //! the \e bLowPower flag is set, then SIRLP bit will also be set.
  492. //!
  493. //! \return None
  494. //
  495. //*****************************************************************************
  496. void
  497. UARTEnableSIR(uint32_t ui32Base, bool bLowPower)
  498. {
  499. //
  500. // Check the arguments.
  501. //
  502. ASSERT(UARTBaseValid(ui32Base));
  503. //
  504. // Enable SIR and SIRLP (if appropriate).
  505. //
  506. if(bLowPower)
  507. {
  508. HWREG(ui32Base + UART_O_CTL) |= (UART_CTL_SIREN | UART_CTL_SIRLP);
  509. }
  510. else
  511. {
  512. HWREG(ui32Base + UART_O_CTL) |= (UART_CTL_SIREN);
  513. }
  514. }
  515. //*****************************************************************************
  516. //
  517. //! Disables SIR (IrDA) mode on the specified UART
  518. //!
  519. //! \param ui32Base is the base address of the UART port.
  520. //!
  521. //! This function clears the SIREN (IrDA) and SIRLP (Low Power) bits.
  522. //!
  523. //! \return None
  524. //
  525. //*****************************************************************************
  526. void
  527. UARTDisableSIR(uint32_t ui32Base)
  528. {
  529. //
  530. // Check the arguments.
  531. //
  532. ASSERT(UARTBaseValid(ui32Base));
  533. //
  534. // Disable SIR and SIRLP (if appropriate).
  535. //
  536. HWREG(ui32Base + UART_O_CTL) &= ~(UART_CTL_SIREN | UART_CTL_SIRLP);
  537. }
  538. //*****************************************************************************
  539. //
  540. //! Sets the operating mode for the UART transmit interrupt
  541. //!
  542. //! \param ui32Base is the base address of the UART port.
  543. //! \param ui32Mode is the operating mode for the transmit interrupt. It may be
  544. //! \b UART_TXINT_MODE_EOT to trigger interrupts when the transmitter is idle
  545. //! or \b UART_TXINT_MODE_FIFO to trigger based on the current transmit FIFO
  546. //! level.
  547. //!
  548. //! This function allows the mode of the UART transmit interrupt to be set. By
  549. //! default, the transmit interrupt is asserted when the FIFO level falls past
  550. //! a threshold set via a call to UARTFIFOLevelSet(). Alternatively, if this
  551. //! function is called with \e ui32Mode set to \b UART_TXINT_MODE_EOT, the
  552. //! transmit interrupt is asserted once the transmitter is completely idle -
  553. //! the transmit FIFO is empty and all bits, including any stop bits, have
  554. //! cleared the transmitter.
  555. //!
  556. //! \return None
  557. //
  558. //*****************************************************************************
  559. void
  560. UARTTxIntModeSet(uint32_t ui32Base, uint32_t ui32Mode)
  561. {
  562. //
  563. // Check the arguments.
  564. //
  565. ASSERT(UARTBaseValid(ui32Base));
  566. ASSERT((ui32Mode == UART_TXINT_MODE_EOT) ||
  567. (ui32Mode == UART_TXINT_MODE_FIFO));
  568. //
  569. // Set or clear the EOT bit of the UART control register as appropriate.
  570. //
  571. HWREG(ui32Base + UART_O_CTL) = ((HWREG(ui32Base + UART_O_CTL) &
  572. ~(UART_TXINT_MODE_EOT |
  573. UART_TXINT_MODE_FIFO)) | ui32Mode);
  574. }
  575. //*****************************************************************************
  576. //
  577. //! Returns the current operating mode for the UART transmit interrupt
  578. //!
  579. //! \param ui32Base is the base address of the UART port.
  580. //!
  581. //! This function returns the current operating mode for the UART transmit
  582. //! interrupt. The return value is \b UART_TXINT_MODE_EOT if the transmit
  583. //! interrupt is currently set to be asserted once the transmitter is
  584. //! completely idle - the transmit FIFO is empty and all bits, including any
  585. //! stop bits, have cleared the transmitter. The return value is
  586. //! \b UART_TXINT_MODE_FIFO if the interrupt is set to be asserted based upon
  587. //! the level of the transmit FIFO.
  588. //!
  589. //! \return Returns \b UART_TXINT_MODE_FIFO or \b UART_TXINT_MODE_EOT.
  590. //
  591. //*****************************************************************************
  592. uint32_t
  593. UARTTxIntModeGet(uint32_t ui32Base)
  594. {
  595. //
  596. // Check the arguments.
  597. //
  598. ASSERT(UARTBaseValid(ui32Base));
  599. //
  600. // Return the current transmit interrupt mode.
  601. //
  602. return(HWREG(ui32Base + UART_O_CTL) & (UART_TXINT_MODE_EOT |
  603. UART_TXINT_MODE_FIFO));
  604. }
  605. //*****************************************************************************
  606. //
  607. //! Determines if there are any characters in the receive FIFO
  608. //!
  609. //! \param ui32Base is the base address of the UART port.
  610. //!
  611. //! This function returns a flag indicating whether or not there is data
  612. //! available in the receive FIFO.
  613. //!
  614. //! \return Returns \b true if there is data in the receive FIFO or \b false
  615. //! if there is no data in the receive FIFO.
  616. //
  617. //*****************************************************************************
  618. bool
  619. UARTCharsAvail(uint32_t ui32Base)
  620. {
  621. //
  622. // Check the arguments.
  623. //
  624. ASSERT(UARTBaseValid(ui32Base));
  625. //
  626. // Return the availability of characters.
  627. //
  628. return((HWREG(ui32Base + UART_O_FR) & UART_FR_RXFE) ? false : true);
  629. }
  630. //*****************************************************************************
  631. //
  632. //! Determines if there is any space in the transmit FIFO
  633. //!
  634. //! \param ui32Base is the base address of the UART port.
  635. //!
  636. //! This function returns a flag indicating whether or not there is space
  637. //! available in the transmit FIFO.
  638. //!
  639. //! \return Returns \b true if there is space available in the transmit FIFO
  640. //! or \b false if there is no space available in the transmit FIFO.
  641. //
  642. //*****************************************************************************
  643. bool
  644. UARTSpaceAvail(uint32_t ui32Base)
  645. {
  646. //
  647. // Check the arguments.
  648. //
  649. ASSERT(UARTBaseValid(ui32Base));
  650. //
  651. // Return the availability of space.
  652. //
  653. return((HWREG(ui32Base + UART_O_FR) & UART_FR_TXFF) ? false : true);
  654. }
  655. //*****************************************************************************
  656. //
  657. //! Receives a character from the specified port
  658. //!
  659. //! \param ui32Base is the base address of the UART port.
  660. //!
  661. //! This function gets a character from the receive FIFO for the specified
  662. //! port.
  663. //!
  664. //! \return Returns the character read from the specified port, cast as a
  665. //! \e int32_t. A \b -1 is returned if there are no characters present in the
  666. //! receive FIFO. The UARTCharsAvail() function should be called before
  667. //! attempting to call this function.
  668. //
  669. //*****************************************************************************
  670. int32_t
  671. UARTCharGetNonBlocking(uint32_t ui32Base)
  672. {
  673. //
  674. // Check the arguments.
  675. //
  676. ASSERT(UARTBaseValid(ui32Base));
  677. //
  678. // See if there are any characters in the receive FIFO.
  679. //
  680. if(!(HWREG(ui32Base + UART_O_FR) & UART_FR_RXFE))
  681. {
  682. //
  683. // Read and return the next character.
  684. //
  685. return(HWREG(ui32Base + UART_O_DR));
  686. }
  687. else
  688. {
  689. //
  690. // There are no characters, so return a failure.
  691. //
  692. return(-1);
  693. }
  694. }
  695. //*****************************************************************************
  696. //
  697. //! Waits for a character from the specified port
  698. //!
  699. //! \param ui32Base is the base address of the UART port.
  700. //!
  701. //! This function gets a character from the receive FIFO for the specified
  702. //! port. If there are no characters available, this function waits until a
  703. //! character is received before returning.
  704. //!
  705. //! \return Returns the character read from the specified port, cast as a
  706. //! \e int32_t.
  707. //
  708. //*****************************************************************************
  709. int32_t
  710. UARTCharGet(uint32_t ui32Base)
  711. {
  712. //
  713. // Check the arguments.
  714. //
  715. ASSERT(UARTBaseValid(ui32Base));
  716. //
  717. // Wait until a char is available.
  718. //
  719. while(HWREG(ui32Base + UART_O_FR) & UART_FR_RXFE)
  720. {
  721. }
  722. //
  723. // Now get the char.
  724. //
  725. return(HWREG(ui32Base + UART_O_DR));
  726. }
  727. //*****************************************************************************
  728. //
  729. //! Sends a character to the specified port
  730. //!
  731. //! \param ui32Base is the base address of the UART port.
  732. //! \param ui8Data is the character to be transmitted.
  733. //!
  734. //! This function writes the character \e ui8Data to the transmit FIFO for the
  735. //! specified port. This function does not block, so if there is no space
  736. //! available, then a \b false is returned, and the application must retry the
  737. //! function later.
  738. //!
  739. //! \return Returns \b true if the character was successfully placed in the
  740. //! transmit FIFO or \b false if there was no space available in the transmit
  741. //! FIFO.
  742. //
  743. //*****************************************************************************
  744. bool
  745. UARTCharPutNonBlocking(uint32_t ui32Base, uint8_t ui8Data)
  746. {
  747. //
  748. // Check the arguments.
  749. //
  750. ASSERT(UARTBaseValid(ui32Base));
  751. //
  752. // See if there is space in the transmit FIFO.
  753. //
  754. if(!(HWREG(ui32Base + UART_O_FR) & UART_FR_TXFF))
  755. {
  756. //
  757. // Write this character to the transmit FIFO.
  758. //
  759. HWREG(ui32Base + UART_O_DR) = ui8Data;
  760. //
  761. // Success.
  762. //
  763. return(true);
  764. }
  765. else
  766. {
  767. //
  768. // There is no space in the transmit FIFO, so return a failure.
  769. //
  770. return(false);
  771. }
  772. }
  773. //*****************************************************************************
  774. //
  775. //! Waits to send a character from the specified port
  776. //!
  777. //! \param ui32Base is the base address of the UART port.
  778. //! \param ui8Data is the character to be transmitted.
  779. //!
  780. //! This function sends the character \e ui8Data to the transmit FIFO for the
  781. //! specified port. If there is no space available in the transmit FIFO, this
  782. //! function waits until there is space available before returning.
  783. //!
  784. //! \return None
  785. //
  786. //*****************************************************************************
  787. void
  788. UARTCharPut(uint32_t ui32Base, uint8_t ui8Data)
  789. {
  790. //
  791. // Check the arguments.
  792. //
  793. ASSERT(UARTBaseValid(ui32Base));
  794. //
  795. // Wait until space is available.
  796. //
  797. while(HWREG(ui32Base + UART_O_FR) & UART_FR_TXFF)
  798. {
  799. }
  800. //
  801. // Send the char.
  802. //
  803. HWREG(ui32Base + UART_O_DR) = ui8Data;
  804. }
  805. //*****************************************************************************
  806. //
  807. //! Causes a BREAK to be sent
  808. //!
  809. //! \param ui32Base is the base address of the UART port.
  810. //! \param bBreakState controls the output level.
  811. //!
  812. //! Calling this function with \e bBreakState set to \b true asserts a break
  813. //! condition on the UART. Calling this function with \e bBreakState set to
  814. //! \b false removes the break condition. For proper transmission of a break
  815. //! command, the break must be asserted for at least two complete frames.
  816. //!
  817. //! \return None
  818. //
  819. //*****************************************************************************
  820. void
  821. UARTBreakCtl(uint32_t ui32Base, bool bBreakState)
  822. {
  823. //
  824. // Check the arguments.
  825. //
  826. ASSERT(UARTBaseValid(ui32Base));
  827. //
  828. // Set the break condition as requested.
  829. //
  830. HWREG(ui32Base + UART_O_LCRH) =
  831. (bBreakState ?
  832. (HWREG(ui32Base + UART_O_LCRH) | UART_LCRH_BRK) :
  833. (HWREG(ui32Base + UART_O_LCRH) & ~(UART_LCRH_BRK)));
  834. }
  835. //*****************************************************************************
  836. //
  837. //! Determines whether the UART transmitter is busy or not
  838. //!
  839. //! \param ui32Base is the base address of the UART port.
  840. //!
  841. //! Allows the caller to determine whether all transmitted bytes have cleared
  842. //! the transmitter hardware. If \b false is returned, the transmit FIFO is
  843. //! empty and all bits of the last transmitted character, including all stop
  844. //! bits, have left the hardware shift register.
  845. //!
  846. //! \return Returns \b true if the UART is transmitting or \b false if all
  847. //! transmissions are complete.
  848. //
  849. //*****************************************************************************
  850. bool
  851. UARTBusy(uint32_t ui32Base)
  852. {
  853. //
  854. // Check the argument.
  855. //
  856. ASSERT(UARTBaseValid(ui32Base));
  857. //
  858. // Determine if the UART is busy.
  859. //
  860. return((HWREG(ui32Base + UART_O_FR) & UART_FR_BUSY) ? true : false);
  861. }
  862. //*****************************************************************************
  863. //
  864. //! Registers an interrupt handler for a UART interrupt
  865. //!
  866. //! \param ui32Base is the base address of the UART port.
  867. //! \param pfnHandler is a pointer to the function to be called when the
  868. //! UART interrupt occurs.
  869. //!
  870. //! This function does the actual registering of the interrupt handler. This
  871. //! function enables the global interrupt in the interrupt controller; specific
  872. //! UART interrupts must be enabled via UARTIntEnable(). It is the interrupt
  873. //! handler's responsibility to clear the interrupt source.
  874. //!
  875. //! \sa IntRegister() for important information about registering interrupt
  876. //! handlers.
  877. //!
  878. //! \return None
  879. //
  880. //*****************************************************************************
  881. void
  882. UARTIntRegister(uint32_t ui32Base, void (*pfnHandler)(void))
  883. {
  884. uint32_t ui32Int;
  885. //
  886. // Check the arguments.
  887. //
  888. ASSERT(UARTBaseValid(ui32Base));
  889. //
  890. // Determine the interrupt number based on the UART port.
  891. //
  892. ui32Int = ((ui32Base == UART0_BASE) ? INT_UART0 : INT_UART1);
  893. //
  894. // Register the interrupt handler.
  895. //
  896. IntRegister(ui32Int, pfnHandler);
  897. //
  898. // Enable the UART interrupt.
  899. //
  900. IntEnable(ui32Int);
  901. }
  902. //*****************************************************************************
  903. //
  904. //! Unregisters an interrupt handler for a UART interrupt
  905. //!
  906. //! \param ui32Base is the base address of the UART port.
  907. //!
  908. //! This function does the actual unregistering of the interrupt handler. It
  909. //! clears the handler to be called when a UART interrupt occurs. This
  910. //! function also masks off the interrupt in the interrupt controller so that
  911. //! the interrupt handler no longer is called.
  912. //!
  913. //! \sa IntRegister() for important information about registering interrupt
  914. //! handlers.
  915. //!
  916. //! \return None
  917. //
  918. //*****************************************************************************
  919. void
  920. UARTIntUnregister(uint32_t ui32Base)
  921. {
  922. uint32_t ui32Int;
  923. //
  924. // Check the arguments.
  925. //
  926. ASSERT(UARTBaseValid(ui32Base));
  927. //
  928. // Determine the interrupt number based on the UART port.
  929. //
  930. ui32Int = ((ui32Base == UART0_BASE) ? INT_UART0 : INT_UART1);
  931. //
  932. // Disable the interrupt.
  933. //
  934. IntDisable(ui32Int);
  935. //
  936. // Unregister the interrupt handler.
  937. //
  938. IntUnregister(ui32Int);
  939. }
  940. //*****************************************************************************
  941. //
  942. //! Enables individual UART interrupt sources
  943. //!
  944. //! \param ui32Base is the base address of the UART port.
  945. //! \param ui32IntFlags is the bit mask of the interrupt sources to be enabled.
  946. //!
  947. //! This function enables the indicated UART interrupt sources. Only the
  948. //! sources that are enabled can be reflected to the processor interrupt;
  949. //! disabled sources have no effect on the processor.
  950. //!
  951. //! The \e ui32IntFlags parameter is the logical OR of any of the following:
  952. //!
  953. //! - \b UART_INT_9BIT - 9-bit address match interrupt
  954. //! - \b UART_INT_OE - Overrun Error interrupt
  955. //! - \b UART_INT_BE - Break Error interrupt
  956. //! - \b UART_INT_PE - Parity Error interrupt
  957. //! - \b UART_INT_FE - Framing Error interrupt
  958. //! - \b UART_INT_RT - Receive Timeout interrupt
  959. //! - \b UART_INT_TX - Transmit interrupt
  960. //! - \b UART_INT_RX - Receive interrupt
  961. //! - \b UART_INT_CTS - CTS interrupt (UART1 only)
  962. //!
  963. //! \return None
  964. //
  965. //*****************************************************************************
  966. void
  967. UARTIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
  968. {
  969. //
  970. // Check the arguments.
  971. //
  972. ASSERT(UARTBaseValid(ui32Base));
  973. //
  974. // Enable the specified interrupts.
  975. //
  976. HWREG(ui32Base + UART_O_IM) |= ui32IntFlags;
  977. }
  978. //*****************************************************************************
  979. //
  980. //! Disables individual UART interrupt sources
  981. //!
  982. //! \param ui32Base is the base address of the UART port.
  983. //! \param ui32IntFlags is the bit mask of the interrupt sources to be disabled.
  984. //!
  985. //! This function disables the indicated UART interrupt sources. Only the
  986. //! sources that are enabled can be reflected to the processor interrupt;
  987. //! disabled sources have no effect on the processor.
  988. //!
  989. //! The \e ui32IntFlags parameter has the same definition as the \e ui32IntFlags
  990. //! parameter to UARTIntEnable().
  991. //!
  992. //! \return None
  993. //
  994. //*****************************************************************************
  995. void
  996. UARTIntDisable(uint32_t ui32Base, uint32_t ui32IntFlags)
  997. {
  998. //
  999. // Check the arguments.
  1000. //
  1001. ASSERT(UARTBaseValid(ui32Base));
  1002. //
  1003. // Disable the specified interrupts.
  1004. //
  1005. HWREG(ui32Base + UART_O_IM) &= ~(ui32IntFlags);
  1006. }
  1007. //*****************************************************************************
  1008. //
  1009. //! Gets the current interrupt status
  1010. //!
  1011. //! \param ui32Base is the base address of the UART port.
  1012. //! \param bMasked is \b false if the raw interrupt status is required and
  1013. //! \b true if the masked interrupt status is required.
  1014. //!
  1015. //! This function returns the interrupt status for the specified UART. Either
  1016. //! the raw interrupt status or the status of interrupts that are allowed to
  1017. //! reflect to the processor can be returned.
  1018. //!
  1019. //! \return Returns the current interrupt status, enumerated as a bit field of
  1020. //! values described in UARTIntEnable().
  1021. //
  1022. //*****************************************************************************
  1023. uint32_t
  1024. UARTIntStatus(uint32_t ui32Base, bool bMasked)
  1025. {
  1026. //
  1027. // Check the arguments.
  1028. //
  1029. ASSERT(UARTBaseValid(ui32Base));
  1030. //
  1031. // Return either the interrupt status or the raw interrupt status as
  1032. // requested.
  1033. //
  1034. if(bMasked)
  1035. {
  1036. return(HWREG(ui32Base + UART_O_MIS));
  1037. }
  1038. else
  1039. {
  1040. return(HWREG(ui32Base + UART_O_RIS));
  1041. }
  1042. }
  1043. //*****************************************************************************
  1044. //
  1045. //! Clears UART interrupt sources
  1046. //!
  1047. //! \param ui32Base is the base address of the UART port.
  1048. //! \param ui32IntFlags is a bit mask of the interrupt sources to be cleared.
  1049. //!
  1050. //! The specified UART interrupt sources are cleared, so that they no longer
  1051. //! assert. This function must be called in the interrupt handler to keep the
  1052. //! interrupt from being recognized again immediately upon exit.
  1053. //!
  1054. //! The \e ui32IntFlags parameter has the same definition as the \e ui32IntFlags
  1055. //! parameter to UARTIntEnable().
  1056. //!
  1057. //! \note Because there is a write buffer in the Cortex-M3 processor, it may
  1058. //! take several clock cycles before the interrupt source is actually cleared.
  1059. //! Therefore, it is recommended that the interrupt source be cleared early in
  1060. //! the interrupt handler (as opposed to the very last action) to avoid
  1061. //! returning from the interrupt handler before the interrupt source is
  1062. //! actually cleared. Failure to do so may result in the interrupt handler
  1063. //! being immediately reentered (because the interrupt controller still sees
  1064. //! the interrupt source asserted).
  1065. //!
  1066. //! \return None
  1067. //
  1068. //*****************************************************************************
  1069. void
  1070. UARTIntClear(uint32_t ui32Base, uint32_t ui32IntFlags)
  1071. {
  1072. //
  1073. // Check the arguments.
  1074. //
  1075. ASSERT(UARTBaseValid(ui32Base));
  1076. //
  1077. // Clear the requested interrupt sources.
  1078. //
  1079. HWREG(ui32Base + UART_O_ICR) = ui32IntFlags;
  1080. }
  1081. //*****************************************************************************
  1082. //
  1083. //! Enable UART DMA operation
  1084. //!
  1085. //! \param ui32Base is the base address of the UART port.
  1086. //! \param ui32DMAFlags is a bit mask of the DMA features to enable.
  1087. //!
  1088. //! The specified UART DMA features are enabled. The UART can be
  1089. //! configured to use DMA for transmit or receive, and to disable
  1090. //! receive if an error occurs. The \e ui32DMAFlags parameter is the
  1091. //! logical OR of any of the following values:
  1092. //!
  1093. //! - UART_DMA_RX - enable DMA for receive
  1094. //! - UART_DMA_TX - enable DMA for transmit
  1095. //! - UART_DMA_ERR_RXSTOP - disable DMA receive on UART error
  1096. //!
  1097. //! \note The uDMA controller must also be set up before DMA can be used
  1098. //! with the UART.
  1099. //!
  1100. //! \return None
  1101. //
  1102. //*****************************************************************************
  1103. void
  1104. UARTDMAEnable(uint32_t ui32Base, uint32_t ui32DMAFlags)
  1105. {
  1106. //
  1107. // Check the arguments.
  1108. //
  1109. ASSERT(UARTBaseValid(ui32Base));
  1110. //
  1111. // Set the requested bits in the UART DMA control register.
  1112. //
  1113. HWREG(ui32Base + UART_O_DMACTL) |= ui32DMAFlags;
  1114. }
  1115. //*****************************************************************************
  1116. //
  1117. //! Disable UART DMA operation
  1118. //!
  1119. //! \param ui32Base is the base address of the UART port.
  1120. //! \param ui32DMAFlags is a bit mask of the DMA features to disable.
  1121. //!
  1122. //! This function is used to disable UART DMA features that were enabled
  1123. //! by UARTDMAEnable(). The specified UART DMA features are disabled. The
  1124. //! \e ui32DMAFlags parameter is the logical OR of any of the following values:
  1125. //!
  1126. //! - UART_DMA_RX - disable DMA for receive
  1127. //! - UART_DMA_TX - disable DMA for transmit
  1128. //! - UART_DMA_ERR_RXSTOP - do not disable DMA receive on UART error
  1129. //!
  1130. //! \return None
  1131. //
  1132. //*****************************************************************************
  1133. void
  1134. UARTDMADisable(uint32_t ui32Base, uint32_t ui32DMAFlags)
  1135. {
  1136. //
  1137. // Check the arguments.
  1138. //
  1139. ASSERT(UARTBaseValid(ui32Base));
  1140. //
  1141. // Clear the requested bits in the UART DMA control register.
  1142. //
  1143. HWREG(ui32Base + UART_O_DMACTL) &= ~ui32DMAFlags;
  1144. }
  1145. //*****************************************************************************
  1146. //
  1147. //! Gets current receiver errors
  1148. //!
  1149. //! \param ui32Base is the base address of the UART port.
  1150. //!
  1151. //! This function returns the current state of each of the 4 receiver error
  1152. //! sources. The returned errors are equivalent to the four error bits
  1153. //! returned via the previous call to UARTCharGet() or UARTCharGetNonBlocking()
  1154. //! with the exception that the overrun error is set immediately the overrun
  1155. //! occurs rather than when a character is next read.
  1156. //!
  1157. //! \return Returns a logical OR combination of the receiver error flags,
  1158. //! \b UART_RXERROR_FRAMING, \b UART_RXERROR_PARITY, \b UART_RXERROR_BREAK
  1159. //! and \b UART_RXERROR_OVERRUN.
  1160. //
  1161. //*****************************************************************************
  1162. uint32_t
  1163. UARTRxErrorGet(uint32_t ui32Base)
  1164. {
  1165. //
  1166. // Check the arguments.
  1167. //
  1168. ASSERT(UARTBaseValid(ui32Base));
  1169. //
  1170. // Return the current value of the receive status register.
  1171. //
  1172. return(HWREG(ui32Base + UART_O_RSR) & 0x0000000F);
  1173. }
  1174. //*****************************************************************************
  1175. //
  1176. //! Clears all reported receiver errors
  1177. //!
  1178. //! \param ui32Base is the base address of the UART port.
  1179. //!
  1180. //! This function is used to clear all receiver error conditions reported via
  1181. //! UARTRxErrorGet(). If using the overrun, framing error, parity error or
  1182. //! break interrupts, this function must be called after clearing the interrupt
  1183. //! to ensure that later errors of the same type trigger another interrupt.
  1184. //!
  1185. //! \return None
  1186. //
  1187. //*****************************************************************************
  1188. void
  1189. UARTRxErrorClear(uint32_t ui32Base)
  1190. {
  1191. //
  1192. // Check the arguments.
  1193. //
  1194. ASSERT(UARTBaseValid(ui32Base));
  1195. //
  1196. // Any write to the Error Clear Register will clear all bits which are
  1197. // currently set.
  1198. //
  1199. HWREG(ui32Base + UART_O_ECR) = 0;
  1200. }
  1201. //*****************************************************************************
  1202. //
  1203. //! Sets the baud clock source for the specified UART
  1204. //!
  1205. //! \param ui32Base is the base address of the UART port.
  1206. //! \param ui32Source is the baud clock source for the UART.
  1207. //!
  1208. //! This function allows the baud clock source for the UART to be selected.
  1209. //! The possible clock source are the system clock (\b UART_CLOCK_SYSTEM) or
  1210. //! the precision internal oscillator (\b UART_CLOCK_PIOSC).
  1211. //!
  1212. //! If \b UART_CLOCK_SYSTEM is chosen, the IO clock frequency must thus be
  1213. //! queried by SysCtrlClcokSet().
  1214. //! If \b UART_CLOCK_PIOSC the SysCtrlIOClcokSet() function must be used.
  1215. //!
  1216. //! Changing the baud clock source will change the baud rate generated by the
  1217. //! UART. Therefore, the baud rate should be reconfigured after any change to
  1218. //! the baud clock source.
  1219. //!
  1220. //! \note If the precision internal oscillator (\b UART_CLOCK_PIOSC) is used
  1221. //! for the UART baud clock, the system clock frequency must be at least
  1222. //! 9 MHz in Run mode.
  1223. //!
  1224. //! \sa UARTConfigSetExpClk()
  1225. //!
  1226. //! \return None
  1227. //
  1228. //*****************************************************************************
  1229. void
  1230. UARTClockSourceSet(uint32_t ui32Base, uint32_t ui32Source)
  1231. {
  1232. //
  1233. // Check the arguments.
  1234. //
  1235. ASSERT(UARTBaseValid(ui32Base));
  1236. ASSERT((ui32Source == UART_CLOCK_SYSTEM) || (ui32Source == UART_CLOCK_PIOSC));
  1237. //
  1238. // Set the UART clock source.
  1239. //
  1240. HWREG(ui32Base + UART_O_CC) = ui32Source;
  1241. }
  1242. //*****************************************************************************
  1243. //
  1244. //! Gets the baud clock source for the specified UART
  1245. //!
  1246. //! \param ui32Base is the base address of the UART port.
  1247. //!
  1248. //! This function returns the baud clock source for the specified UART. The
  1249. //! possible baud clock source are the system clock (\b UART_CLOCK_SYSTEM) or
  1250. //! the precision internal oscillator (\b UART_CLOCK_PIOSC).
  1251. //!
  1252. //! \return None
  1253. //
  1254. //*****************************************************************************
  1255. uint32_t
  1256. UARTClockSourceGet(uint32_t ui32Base)
  1257. {
  1258. //
  1259. // Check the arguments.
  1260. //
  1261. ASSERT(UARTBaseValid(ui32Base));
  1262. //
  1263. // Return the UART clock source.
  1264. //
  1265. return(HWREG(ui32Base + UART_O_CC));
  1266. }
  1267. //*****************************************************************************
  1268. //
  1269. //! Enables 9-bit mode on the specified UART
  1270. //!
  1271. //! \param ui32Base is the base address of the UART port.
  1272. //!
  1273. //! This function enables the 9-bit operational mode of the UART.
  1274. //!
  1275. //! \return None
  1276. //
  1277. //*****************************************************************************
  1278. void
  1279. UART9BitEnable(uint32_t ui32Base)
  1280. {
  1281. //
  1282. // Check the arguments.
  1283. //
  1284. ASSERT(UARTBaseValid(ui32Base));
  1285. //
  1286. // Enable 9-bit mode.
  1287. //
  1288. HWREG(ui32Base + UART_O_NINEBITADDR) |= UART_NINEBITADDR_NINEBITEN;
  1289. }
  1290. //*****************************************************************************
  1291. //
  1292. //! Disables 9-bit mode on the specified UART
  1293. //!
  1294. //! \param ui32Base is the base address of the UART port.
  1295. //!
  1296. //! This function disables the 9-bit operational mode of the UART.
  1297. //!
  1298. //! \return None
  1299. //
  1300. //*****************************************************************************
  1301. void
  1302. UART9BitDisable(uint32_t ui32Base)
  1303. {
  1304. //
  1305. // Check the arguments.
  1306. //
  1307. ASSERT(UARTBaseValid(ui32Base));
  1308. //
  1309. // Disable 9-bit mode.
  1310. //
  1311. HWREG(ui32Base + UART_O_NINEBITADDR) &= ~UART_NINEBITADDR_NINEBITEN;
  1312. }
  1313. //*****************************************************************************
  1314. //
  1315. //! Sets the device address(es) for 9-bit mode
  1316. //!
  1317. //! \param ui32Base is the base address of the UART port.
  1318. //! \param ui8Addr is the device address.
  1319. //! \param ui8Mask is the device address mask.
  1320. //!
  1321. //! This function sets the device address, or range of device addresses, that
  1322. //! respond to requests on the 9-bit UART port. The received address is masked
  1323. //! with the mask and then compared against the given address, allowing either
  1324. //! a single address (if \b ui8Mask is 0xff) or a set of addresses to be
  1325. //! matched.
  1326. //!
  1327. //! \return None
  1328. //
  1329. //*****************************************************************************
  1330. void
  1331. UART9BitAddrSet(uint32_t ui32Base, uint8_t ui8Addr,
  1332. uint8_t ui8Mask)
  1333. {
  1334. //
  1335. // Check the arguments.
  1336. //
  1337. ASSERT(UARTBaseValid(ui32Base));
  1338. //
  1339. // Set the address and mask.
  1340. //
  1341. HWREG(ui32Base + UART_O_NINEBITADDR) = ui8Addr << UART_NINEBITADDR_ADDR_S;
  1342. HWREG(ui32Base + UART_O_NINEBITAMASK) = ui8Mask << UART_NINEBITAMASK_MASK_S;
  1343. }
  1344. //*****************************************************************************
  1345. //
  1346. //! Sends an address character from the specified port when operating in 9-bit
  1347. //! mode
  1348. //!
  1349. //! \param ui32Base is the base address of the UART port.
  1350. //! \param ui8Addr is the address to be transmitted.
  1351. //!
  1352. //! This function waits until all data has been sent from the specified port
  1353. //! and then sends the given address as an address byte. It then waits until
  1354. //! the address byte has been transmitted before returning.
  1355. //!
  1356. //! The normal data functions (UARTCharPut(), UARTCharPutNonBlocking(),
  1357. //! UARTCharGet(), and UARTCharGetNonBlocking()) are used to send and receive
  1358. //! data characters in 9-bit mode.
  1359. //!
  1360. //! \return None
  1361. //
  1362. //*****************************************************************************
  1363. void
  1364. UART9BitAddrSend(uint32_t ui32Base, uint8_t ui8Addr)
  1365. {
  1366. uint32_t ui32LCRH;
  1367. //
  1368. // Check the arguments.
  1369. //
  1370. ASSERT(UARTBaseValid(ui32Base));
  1371. //
  1372. // Wait until the FIFO is empty and the UART is not busy.
  1373. //
  1374. while((HWREG(ui32Base + UART_O_FR) & (UART_FR_TXFE | UART_FR_BUSY)) !=
  1375. UART_FR_TXFE)
  1376. {
  1377. }
  1378. //
  1379. // Force the address/data bit to 1 to indicate this is an address byte.
  1380. //
  1381. ui32LCRH = HWREG(ui32Base + UART_O_LCRH);
  1382. HWREG(ui32Base + UART_O_LCRH) = ((ui32LCRH & ~UART_LCRH_EPS) | UART_LCRH_SPS |
  1383. UART_LCRH_PEN);
  1384. //
  1385. // Send the address.
  1386. //
  1387. HWREG(ui32Base + UART_O_DR) = ui8Addr;
  1388. //
  1389. // Wait until the address has been sent.
  1390. //
  1391. while((HWREG(ui32Base + UART_O_FR) & (UART_FR_TXFE | UART_FR_BUSY)) !=
  1392. UART_FR_TXFE)
  1393. {
  1394. }
  1395. //
  1396. // Restore the address/data setting.
  1397. //
  1398. HWREG(ui32Base + UART_O_LCRH) = ui32LCRH;
  1399. }
  1400. //*****************************************************************************
  1401. //
  1402. // Close the Doxygen group.
  1403. //! @}
  1404. //
  1405. //*****************************************************************************