You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

129 lines
2.1 KiB

  1. #include "config.h"
  2. #include "uart.h"
  3. #include "util.h"
  4. void uart_init(int uart, int32_t rate)
  5. {
  6. int32_t brg;
  7. brg = ((FCY + (8 * rate - 1)) / (16 * rate)) - 1;
  8. if (brg < 1) brg = 1;
  9. if (brg > 65535) brg = 65535;
  10. if (uart == 1) {
  11. U1MODE = 0;
  12. U1MODEbits.BRGH = 0; // errata: BRGH=1 is broken
  13. U1BRG = brg;
  14. U1STA = 0;
  15. U1MODEbits.UARTEN = 1;
  16. U1STAbits.UTXEN = 1;
  17. } else if (uart == 2) {
  18. U2MODE = 0;
  19. U2MODEbits.BRGH = 0;
  20. U2BRG = brg;
  21. U2STA = 0;
  22. U2MODEbits.UARTEN = 1;
  23. U2STAbits.UTXEN = 1;
  24. }
  25. }
  26. void uart_put(int uart, uint8_t x)
  27. {
  28. if (uart == 1) {
  29. while (U1STAbits.UTXBF) continue;
  30. U1TXREG = x;
  31. } else if (uart == 2) {
  32. while (U2STAbits.UTXBF) continue;
  33. U2TXREG = x;
  34. }
  35. }
  36. int uart_can_get(int uart)
  37. {
  38. if (uart == 1)
  39. return U1STAbits.URXDA;
  40. else if (uart == 2)
  41. return U2STAbits.URXDA;
  42. else
  43. return 0;
  44. }
  45. uint8_t uart_get(int uart)
  46. {
  47. uint8_t data = 0;
  48. if (uart == 1) {
  49. while (!U1STAbits.URXDA) continue;
  50. data = U1RXREG;
  51. if (U1STAbits.OERR)
  52. U1STAbits.OERR = 0;
  53. } else if (uart == 2) {
  54. while (!U2STAbits.URXDA) continue;
  55. data = U2RXREG;
  56. if (U2STAbits.OERR)
  57. U2STAbits.OERR = 0;
  58. }
  59. return data;
  60. }
  61. void uart_put_string(int uart, const char *s)
  62. {
  63. while(s && *s)
  64. uart_put(uart, *s++);
  65. }
  66. void uart_put_bin(int uart, uint8_t x)
  67. {
  68. int i;
  69. for(i=0;i<8;i++) {
  70. uart_put(uart, (x & 0x80) ? '1' : '0');
  71. x <<= 1;
  72. }
  73. }
  74. void uart_put_hex(int uart, uint8_t x)
  75. {
  76. uart_put(uart, hex[x >> 4]);
  77. uart_put(uart, hex[x & 15]);
  78. }
  79. void uart_put_hex16(int uart, uint16_t x)
  80. {
  81. uart_put_hex(uart, (x >> 8) & 0xFF);
  82. uart_put_hex(uart, (x) & 0xFF);
  83. }
  84. void uart_put_hex32(int uart, uint32_t x)
  85. {
  86. uart_put_hex(uart, (x >> 24) & 0xFF);
  87. uart_put_hex(uart, (x >> 16) & 0xFF);
  88. uart_put_hex(uart, (x >> 8) & 0xFF);
  89. uart_put_hex(uart, (x) & 0xFF);
  90. }
  91. void uart_put_dec(int uart, int32_t x)
  92. {
  93. uint32_t val;
  94. uint32_t place = 1;
  95. if (x >= 0) {
  96. val = x;
  97. } else {
  98. uart_put(uart, '-');
  99. val = -x;
  100. }
  101. while (val / place > 9)
  102. place *= 10;
  103. while (place > 0) {
  104. uart_put(uart, val / place + '0');
  105. val %= place;
  106. place /= 10;
  107. }
  108. }
  109. void uart_crlf(int uart)
  110. {
  111. uart_put(uart, '\r');
  112. uart_put(uart, '\n');
  113. }