B-Matt

Microblaze Application - Running Light With PS2

Dec 3rd, 2019
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.25 KB | None | 0 0
  1. #include "xps2.h"
  2. #include "xparameters.h"
  3. #include "xstatus.h"
  4. #include "stdio.h"
  5. #include "xgpio.h"
  6.  
  7. //***********************************************TO DO 9*************************************************//
  8. //***********************************Definirati konstantu KEYBOARD_ACK***********************************//
  9. #define KEYBOARD_ACK    0xFA
  10.  
  11. //******************************************************************************************************//
  12.  
  13.  
  14. /************************** Prototipi funkcija ******************************/
  15. int Ps2Initialize(u16 Ps2DeviceId);
  16. int Ps2SendData(u8 data);
  17. int Ps2ReceiveData();
  18.  
  19.  
  20. /******************** Definicija globalnih varijabli ***********************/
  21. static XPs2 Ps2Inst;
  22. XGpio leds;
  23. u8 SendCODE = 0xED;
  24. u8 RxBuffer;
  25.  
  26.  
  27. int main(void)
  28. {
  29.     int Status, j, ledCounter = 0b00000001, LightDirection = 0, counter = 0;
  30.  
  31.     XGpio_Initialize(&leds, XPAR_LEDS_8BITS_DEVICE_ID);
  32.     XGpio_SetDataDirection(&leds, 1, 0x00000000);
  33.  
  34.     Status = Ps2Initialize(XPAR_PS2_0_DEVICE_ID);
  35.     if (Status != XST_SUCCESS) {
  36.         return XST_FAILURE;
  37.     }
  38.  
  39.     XGpio_DiscreteWrite(&leds, 1, ledCounter);
  40.     print("Receiving data from keyboard:\r\n");
  41.     while(1){
  42.  
  43.         //***********************************************TO DO 7*************************************************//
  44.         //*********************************Primiti 1 byte podataka od tipkovnice********************************//
  45.         Status = Ps2ReceiveData();
  46.  
  47.         //******************************************************************************************************//
  48.  
  49.         if (Status != XST_SUCCESS){
  50.             return XST_FAILURE;
  51.             print("Data receiving FAILED!\r\n");
  52.         }
  53.         else {
  54.             xil_printf("%x\r\n", RxBuffer);
  55.         }
  56.  
  57.  
  58.         //**************************************Omogućuje trčeće svjetlo****************************************//
  59.         if(RxBuffer == 0x6B) {
  60.             counter++;
  61.             if(counter == 2) {
  62.                 ledCounter = ledCounter << 1;
  63.                 counter = 0;
  64.             }
  65.         }
  66.         else if(RxBuffer == 0xE0) {
  67.             counter++;
  68.             if(counter == 2) {
  69.                 ledCounter = ledCounter >> 1;
  70.                 counter = 0;
  71.             }
  72.         }
  73.         if(ledCounter > 0b10000000) ledCounter = 0b00000001;
  74.         if(ledCounter < 0b00000001) ledCounter = 0b10000000;
  75.         XGpio_DiscreteWrite(&leds, 1, ledCounter);
  76.         //********************************************************************************************************//
  77.     }
  78. }
  79.  
  80. /****************************************************************************/
  81. /* Funkcija za inicijalizaciju tipkovnice koja prima device ID tipkovnice
  82. ****************************************************************************/
  83. int Ps2Initialize(u16 Ps2DeviceId)
  84. {
  85.     XPs2_Config *Ps2ConfigPtr;
  86.  
  87.     //***********************************************TO DO 1*************************************************//
  88.     //******Dohvatiti konfiguraciju PS2 sučelja, povratnu vrijednost spremiti u varijablu Ps2ConfigPtr*******//
  89.     Ps2ConfigPtr = XPs2_LookupConfig(Ps2DeviceId);
  90.  
  91.     //******************************************************************************************************//
  92.     if (Ps2ConfigPtr == NULL) {
  93.         print("Config Lookup FAILED!\r\n");
  94.         return XST_FAILURE;
  95.     }
  96.     else
  97.         print("Config Lookup SUCCESS!\r\n");
  98.  
  99.  
  100.     //***********************************************TO DO 2*************************************************//
  101.     //*************************************Inicijalizirati PS2 kontroler*************************************//
  102.     XPs2_CfgInitialize(&Ps2Inst, Ps2ConfigPtr, Ps2ConfigPtr->BaseAddress);
  103.  
  104.     //*******************************************************************************************************//
  105.  
  106.     print("PS2 Initialize SUCCESS!\r\n");
  107.     return XST_SUCCESS;
  108. }
  109.  
  110. /****************************************************************************/
  111. /* Funkcija za slanje podataka putem PS2 sučelja.
  112.  * Funkcija prima podatak koji treba poslati.
  113. ****************************************************************************/
  114. int Ps2SendData(u8 data){
  115.  
  116.     u32 StatusReg;
  117.     u32 BytesSent;
  118.     u32 BytesReceived;
  119.     int ACK_WAIT = 10000;
  120.  
  121.     //***********************************************TO DO 3*************************************************//
  122.     //****Poslati 1 byte podataka putem PS2 sucelja, povratnu vrijdnost spremiti u varijablu BytesSent*******//
  123.     BytesSent = XPs2_Send(&Ps2Inst, &data, 1);
  124.  
  125.     //*******************************************************************************************************//
  126.     if( BytesSent != 1) {
  127.         print("Data Send FAILED!\r\n");
  128.         return XST_FAILURE;
  129.     }
  130.  
  131.     //Cekati dok tipkovnica ne posalje odgovor (ACK byte)
  132.     do {
  133.         StatusReg = XPs2_GetStatus(&Ps2Inst);
  134.         ACK_WAIT--;
  135.     }while((StatusReg & XPS2_STATUS_RX_FULL) == 0 && ACK_WAIT > 0);
  136.  
  137.     //***********************************************TO DO 4*************************************************//
  138.     //****Primiti 1 byte podataka putem PS2 sucelja, povratnu vrijdnost spremiti u varijablu BytesReceived***//
  139.     BytesReceived = XPs2_Recv(&Ps2Inst, &RxBuffer, 1);
  140.  
  141.     //*******************************************************************************************************//
  142.  
  143.     //Provjeriti jel primljen ACK byte
  144.     if (RxBuffer != KEYBOARD_ACK) {
  145.         print("Nije primljen ACK byte!\r\n");
  146.         return XST_FAILURE;
  147.     }
  148.     else
  149.         xil_printf("Data %x Send SUCESS!\r\n", data);
  150.  
  151.     return XST_SUCCESS;
  152. }
  153.  
  154. /****************************************************************************/
  155. /* Funkcija za primanje podataka putem PS2 sučelja.
  156. ****************************************************************************/
  157. int Ps2ReceiveData(){
  158.  
  159.     u32 StatusReg;
  160.     u32 BytesReceived;
  161.     do {
  162.         StatusReg = XPs2_GetStatus(&Ps2Inst);
  163.     }while((StatusReg & XPS2_STATUS_RX_FULL) == 0);
  164.  
  165.     //***********************************************TO DO 5*************************************************//
  166.     //***Primiti 1 byte podataka putem PS2 sucelja, povratnu vrijdnost spremiti u varijablu BytesReceived****//
  167.     BytesReceived = XPs2_Recv(&Ps2Inst, &RxBuffer, 1);
  168.  
  169.     //*******************************************************************************************************//
  170.  
  171.     return XST_SUCCESS;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment