Advertisement
Mary_99

fifo

Dec 14th, 2020 (edited)
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.28 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include "include/AT91SAM9263.h"
  7.  
  8. //-------------------------DBGU_IDR-----------------------------------//
  9. #define DISABLE_RXRDY_INTERRUPT AT91C_US_RXRDY
  10. #define DISABLE_TXRDY_INTERRUPT AT91C_US_TXRDY
  11. #define DISABLE_END_OF_RECIVE_TRANSFER_INPUT AT91C_US_ENDRX
  12. #define DISBLE_END_OF_TRNASMIT_INTERRUPT AT91C_US_ENDTX
  13. #define DISABLE_OVERRUN_INTERRUPT AT91C_US_OVRE
  14. #define DISABLE_FRAMING_ERROR_INTERUPT AT91C_US_FRAME
  15. #define DISABLE_PARITY_ERROR_INTERRUPT AT91C_US_PARE
  16. #define DISABLE_TXEMPTY_INTERRUPT AT91C_US_TXEMPTY
  17. #define DISABLE_TXBUFE_INTERRUPT AT91C_US_TXBUFE
  18. #define DISABLE_RXBUFF_INTERUPT AT91C_US_RXBUFF
  19. #define DISABLE_COMM_TX_INTERRUPT AT91C_US_COMM_TX //30
  20. #define DISABLE_COMM_RX_INTERRUPT AT91C_US_COMM_RX //31
  21. #define DISABLE_RECIVER AT91C_US_RXDIS
  22. #define DISABLE_TRANSIMTER AT91C_US_TXDIS
  23.  
  24. #define CAPITAL_A_ASCII 65
  25. #define LOWER_A_ASCII 97
  26. #define CAPITAL_Z_ASCII 90
  27. #define LOWER_Z_ASCII 122
  28. #define MCK 100000000
  29. #define CD 115200
  30. #define BUFFERSIZE 0xF
  31. #define ASCII_ENTER 10
  32.  
  33. typedef struct FIFO
  34. {
  35.   char buffer[BUFFERSIZE+1];
  36.   unsigned int head;
  37.   unsigned int tail;
  38. }Fifo;
  39.  
  40. void fifoInit (struct FIFO *fifo)
  41. {
  42.   fifo->head = 0;
  43.   fifo->tail = 0;
  44. }
  45.  
  46. void fifoEmpty (struct FIFO *fifo)
  47. {
  48.   fifo->head = fifo->tail;
  49. }
  50.  
  51. int fifoPut (struct FIFO *fifo, char data)
  52. {
  53.   if((fifo->tail - fifo->head) == 1 || (fifo->tail - fifo->head) == BUFFERSIZE)
  54.   {
  55.     return -1;
  56.   }
  57.   fifo->buffer[fifo->head] = data;
  58.   fifo->head = (fifo->head + 1) & BUFFERSIZE; //return to the start of fifo
  59.   return 1;
  60. }
  61.  
  62. int fifoGet (struct FIFO *fifo, char *data)
  63. {
  64.   if(fifo->head != fifo->tail)
  65.   {
  66.     *data = fifo->buffer[fifo->tail];
  67.     fifo->tail = (fifo->tail +1) & BUFFERSIZE;
  68.     return 1;
  69.   }
  70.   else
  71.   {
  72.     return -1;
  73.   }
  74. }
  75.  
  76. void disableInterrupts(void)
  77. {
  78.   AT91C_BASE_DBGU->DBGU_IDR = (DISABLE_RXRDY_INTERRUPT|DISABLE_TXRDY_INTERRUPT|DISABLE_END_OF_RECIVE_TRANSFER_INPUT|DISBLE_END_OF_TRNASMIT_INTERRUPT|
  79.                               DISABLE_OVERRUN_INTERRUPT|DISABLE_FRAMING_ERROR_INTERUPT|DISABLE_PARITY_ERROR_INTERRUPT|DISABLE_TXEMPTY_INTERRUPT|
  80.                               DISABLE_TXBUFE_INTERRUPT|DISABLE_RXBUFF_INTERUPT|DISABLE_COMM_TX_INTERRUPT|DISABLE_COMM_RX_INTERRUPT); //desactivate debug interrupt
  81. }
  82.  
  83. void configurePeripheralPorts(void)
  84. {
  85.   AT91C_BASE_PIOC->PIO_ASR |= AT91C_PIO_PC30; // debug receiver data RxD//Pio Periherial A select Register//reciver
  86.   AT91C_BASE_PIOC->PIO_PDR |= AT91C_PIO_PC30; //PIO Disable Register
  87.  
  88.   AT91C_BASE_PIOC->PIO_ASR |= AT91C_PIO_PC31; //debug receiver data TXD //transmitter
  89.   AT91C_BASE_PIOC->PIO_PDR |= AT91C_PIO_PC31;
  90. }
  91.  
  92. void turnOffReciver(void)
  93. {
  94.   AT91C_BASE_DBGU->DBGU_CR |= AT91C_US_RSTRX; //reset and turn off/disable receiver
  95. }
  96.  
  97. void turnOffTransmitter(void)
  98. {
  99.     AT91C_BASE_DBGU->DBGU_CR |= AT91C_US_RSTTX; // reset and turn off/disable treansmitter
  100. }
  101.  
  102. void disabeReciver(void)
  103. {
  104.   AT91C_BASE_DBGU->DBGU_CR |= DISABLE_RECIVER; //reset and turn off/disable receiver
  105. }
  106.  
  107. void disableTransmitter(void)
  108. {
  109.     AT91C_BASE_DBGU->DBGU_CR |= DISABLE_TRANSIMTER; // reset and disable treansmitter
  110. }
  111.  
  112. void configureThroughput(void)
  113. {
  114.   AT91C_BASE_DBGU->DBGU_BRGR = MCK/(16*CD); // MCK mster CLock/ (CD //clock Divisor *16) //baud Rate Generator Register //speed of transmiition
  115. }
  116.  
  117. void configureOperationMode(void)
  118. {
  119.     AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL| AT91C_US_PAR_NONE ; // set nomral mode 14 15 bit 0 0 // set no parity
  120. }
  121.  
  122. void turnOnReciver(void)
  123. {
  124.     AT91C_BASE_DBGU->DBGU_CR |= AT91C_US_RXEN;
  125. }
  126.  
  127. void turnOnTransmitter(void)
  128. {
  129.   AT91C_BASE_DBGU->DBGU_CR |= AT91C_US_TXEN;
  130. }
  131.  
  132. void dbguInit(void)
  133. {
  134.   disableInterrupts();
  135.   turnOffReciver();
  136.   turnOffTransmitter();
  137.   disabeReciver();
  138.   disableTransmitter();
  139.   configurePeripheralPorts();
  140.   configureThroughput();
  141.   configureOperationMode();
  142.   turnOnReciver();
  143.   turnOnTransmitter();
  144. }
  145.  
  146. bool isCapital(char letter)
  147. {
  148.   return (letter >= CAPITAL_A_ASCII && letter <= CAPITAL_Z_ASCII);
  149. }
  150.  
  151. bool isLower(char letter)
  152. {
  153.   return (letter >= LOWER_A_ASCII  && letter <= LOWER_Z_ASCII );
  154. }
  155.  
  156. char letterConversion(char letter)
  157. {
  158.   if(isCapital(letter))
  159.   {
  160.     return tolower(letter);
  161.   }
  162.   else if(isLower(letter))
  163.   {
  164.     return toupper(letter);
  165.   }
  166.   else
  167.   {
  168.     return letter;
  169.   }
  170. }
  171.  
  172. void dbguPrintAsciiFifo(struct FIFO * fifo, char *data)
  173. {
  174.   do
  175.   {
  176.     while(!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}; //wait until Tx buffer busy - checj TXRDY flag
  177.  
  178.     //CSR channel status regster //TXRDY Interrupt
  179.     AT91C_BASE_DBGU->DBGU_THR = letterConversion(*data);//* data ;//letterConversion(buffer); //write a singel char to Transmitter Holding Register
  180.   }   while(fifoGet(fifo,data)!=-1);
  181.   fifoEmpty(fifo);
  182. }
  183.  
  184. void printMessage(const char*StringToPrint)
  185. {
  186.   int iterrator = 0;
  187.   while(StringToPrint[iterrator] != '\0')
  188.   {
  189.     while(!(AT91C_BASE_DBGU->DBGU_CSR & DISABLE_TXRDY_INTERRUPT)){}; //wait until Tx buffer busy - checj TXRDY flag
  190.     //CSR channel status regster //TXRDY Interrupt
  191.     AT91C_BASE_DBGU->DBGU_THR =StringToPrint[iterrator]; //write a singel char to Transmitter Holding Register
  192.     iterrator++;
  193.   }
  194. }
  195.  
  196. char dbguReadAsciiFifo(struct FIFO * fifo, char *data)
  197. {
  198.     while(!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)){};//data avaible
  199.     char buffer = AT91C_BASE_DBGU->DBGU_RHR;
  200.       if(buffer == ASCII_ENTER)
  201.       {
  202.          dbguPrintAsciiFifo(fifo,data);
  203.       }
  204.       else
  205.       {
  206.         if(fifoPut(fifo, AT91C_BASE_DBGU->DBGU_RHR)==-1)
  207.         {
  208.           printMessage("not");
  209.           dbguPrintAsciiFifo(fifo,data);
  210.         }
  211.       }
  212. }
  213.  
  214. void dbguPrintAscii(const char buffer)
  215. {
  216.     while(!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}; //wait until Tx buffer busy - check TXRDY flag
  217.     //CSR channel status regster //TXRDY Interrupt
  218.     AT91C_BASE_DBGU->DBGU_THR = letterConversion(buffer); //write a singel char to Transmitter Holding Register
  219. }
  220.  
  221. void dbguPrintAsciiForAlphabet(const char buffer)
  222. {
  223.     while(!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}; //wait until Tx buffer busy - checj TXRDY flag
  224.     //CSR channel status regster //TXRDY Interrupt
  225.     AT91C_BASE_DBGU->DBGU_THR = buffer; //write a singel char to Transmitter Holding Register
  226. }
  227.  
  228. char dbguReadAscii(char buffer)
  229. {
  230.     while(!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)){};//data avaible
  231.     buffer = AT91C_BASE_DBGU->DBGU_RHR;
  232.     //return buffer;
  233. }
  234.  
  235. void printChars()
  236. {
  237.   char upper;
  238.   char lower;
  239.   for(upper ='A'; upper<= 'Z';++upper)
  240.   {
  241.     dbguPrintAsciiForAlphabet(upper);
  242.   }
  243.   for (lower ='a'; lower<= 'z';++lower)
  244.   {
  245.     dbguPrintAsciiForAlphabet(lower);
  246.   }
  247. }
  248.  
  249.  
  250. int main()
  251. {
  252.   struct FIFO * fifo;
  253.   fifoInit(fifo);
  254.   dbguInit();
  255.   char newLine = '\n';
  256.   printChars();
  257.   dbguPrintAscii(newLine);
  258.   char input2;
  259.  
  260.   char* text = "My String to print";
  261.   dbguPrintAscii(newLine);
  262.   dbguPrintAscii(newLine);
  263.   printMessage(text);
  264.   dbguPrintAscii(newLine);
  265.   dbguPrintAscii(newLine);
  266.   char input = 't';
  267.   //input = letterConversion(input);
  268.   dbguPrintAscii(input);
  269.   dbguPrintAscii(newLine);
  270.   char character [100];
  271.   while(true)
  272.   {
  273.     dbguReadAsciiFifo(fifo, character);
  274.     dbguPrintAscii(newLine);
  275.   }
  276.   return 0;
  277. }
  278.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement