/* * FPGA_SSI_Comm.c * * Created on: Apr 22, 2018 * Author: avi */ #include #include #include #include #include "drivers/FPGA/FPGA_SSI_Comm.h" #include "drivers/SSI_Comm/SSI_Comm.h" #include "PMR/Hardware/HardwareDancerType.pb-c.h" #ifdef FOUR_WINDERS static short DummyBusy = 0; #endif static FpgaDancerMap_t FpgaRotEncMap[NUM_OF_ROTENC] = { {&F1_LDANCER2_ROTENC_DATA_p_TX, &F1_LDANCER2_ROTENC_DATA_p_RX_msb, &F1_LDANCER2_ROTENC_DATA_p_RX_lsb,&F1_SPI_Busy1_D}, {&F1_LDANCER1_ROTENC_DATA_p_TX, &F1_LDANCER1_ROTENC_DATA_p_RX_msb, &F1_LDANCER1_ROTENC_DATA_p_RX_lsb,&F1_SPI_Busy1_D}, {&F1_RDANCER_ROTENC_DATA_p_TX , &F1_RDANCER_ROTENC_DATA_p_RX_msb , &F1_RDANCER_ROTENC_DATA_p_RX_lsb ,&F1_SPI_Busy1_D}, // {&F1_LSPARE_ROTENC_DATA_p_TX , &F1_LSPARE_ROTENC_DATA_p_RX_msb , &F1_LSPARE_ROTENC_DATA_p_RX_lsb ,&F1_SPI_Busy1_D},//Dryer_ENC // {&F1_RSPARE_ROTENC_DATA_p_TX , &F1_RSPARE_ROTENC_DATA_p_RX_msb , &F1_RSPARE_ROTENC_DATA_p_RX_lsb ,&F1_SPI_Busy1_D}, #ifdef FOUR_WINDERS {&F2_DISPENSER_ROTENC_DATA_p_6_TX , &F2_DISPENSER_ROTENC_DATA_p_6_RX_msb , &F2_DISPENSER_ROTENC_DATA_p_6_RX_lsb ,&DummyBusy},//We don't have Busy bit in FPGA & It is not in use {&F3_SPARE2_ROTENC_DATA_p_2_TX , &F3_SPARE2_ROTENC_DATA_p_2_RX_msb , &F3_SPARE2_ROTENC_DATA_p_2_RX_lsb ,&DummyBusy},//We don't have Busy bit in FPGA & It is not in use #endif }; #ifdef FOUR_WINDERS uint8_t FPGA_SSI_Transmit(Dancers_4_Winders _RotEncId) #else uint8_t FPGA_SSI_Transmit(HardwareDancerType _RotEncId) #endif { //if(*FpgaRotEncMap[_RotEncId].SSI_Busy == NOTBUSY) { uint32_t SSI_Dummy_TX= 0x123456; // Dummy *FpgaRotEncMap[_RotEncId].TX_Reg = SSI_Dummy_TX ; } return OK; } #ifdef FOUR_WINDERS uint8_t FPGA_SSI_Receive(Dancers_4_Winders _RotEncId) #else uint8_t FPGA_SSI_Receive(HardwareDancerType _RotEncId) #endif { INT2SHORT Int2Short; unsigned int temp; //TODO - check if busy ? Int2Short.ushort.LSB = *FpgaRotEncMap[_RotEncId].RX_L; Int2Short.ushort.MSB = *FpgaRotEncMap[_RotEncId].RX_M; temp = Int2Short.uint; if(_RotEncId < NUM_OF_ROTENC)//DANSER_ROTENC: { DANCER_ENC[_RotEncId].Det_status = temp & 0xFF; temp = temp >> 8; DANCER_ENC[_RotEncId].Gen_status = temp & 0x3; temp = temp >> 2; DANCER_ENC[_RotEncId].Position = (temp & 0x3FFF); } else { // DISPENSER_ROTENC } return OK; } //------------------------------------------- SPEED SENSOR ----------------------------------------- static FpgaDancerMap_t FpgaSpeedSensorMap = {&F1_RSPARE_ROTENC_DATA_p_TX , &F1_RSPARE_ROTENC_DATA_p_RX_msb , &F1_RSPARE_ROTENC_DATA_p_RX_lsb ,&F1_SPI_Busy1_D}; uint8_t FPGA_SSI_Speed_Sensor_Transnit() { #ifndef EVALUATION_BOARD //if(*FpgaSpeedSensorMap.SSI_Busy == NOTBUSY) { uint32_t SSI_Dummy_TX= 0x123456; // Dummy *FpgaSpeedSensorMap.TX_Reg = SSI_Dummy_TX ; } #endif return OK; } uint32_t FPGA_SSI_Speed_Sensor_Receive() { #ifndef EVALUATION_BOARD INT2SHORT Int2Short; //unsigned int temp; //TODO - check if busy ? Int2Short.ushort.LSB = *FpgaSpeedSensorMap.RX_L; Int2Short.ushort.MSB = *FpgaSpeedSensorMap.RX_M; //temp = Int2Short.uint; SpeedSensorResponseS.Speed = Int2Short.uint; #endif //return OK; return SpeedSensorResponseS.Speed; } //------------------------------------------- Dryer ENC ----------------------------------------- static FpgaDancerMap_t FpgaDryerENCMap = {&F1_LSPARE_ROTENC_DATA_p_TX , &F1_LSPARE_ROTENC_DATA_p_RX_msb , &F1_LSPARE_ROTENC_DATA_p_RX_lsb ,&F1_SPI_Busy1_D};//Dryer_ENC uint8_t FPGA_SSI_Dryer_ENC_Transnit() { #ifndef EVALUATION_BOARD //if(*FpgaSpeedSensorMap.SSI_Busy == NOTBUSY) { uint32_t SSI_Dummy_TX= 0x123456; // Dummy *FpgaDryerENCMap.TX_Reg = SSI_Dummy_TX ; } #endif return OK; } uint32_t FPGA_SSI_Dryer_ENC_Receive() { #ifndef EVALUATION_BOARD INT2SHORT Int2Short; unsigned int temp; //TODO - check if busy ? Int2Short.ushort.LSB = *FpgaDryerENCMap.RX_L; Int2Short.ushort.MSB = *FpgaDryerENCMap.RX_M; temp = Int2Short.uint; Dryer_ENC.Det_status = temp & 0xFF; temp = temp >> 8; Dryer_ENC.Gen_status = temp & 0x3; temp = temp >> 2; Dryer_ENC.Position = (temp & 0x3FFF); #endif return OK; }