diff options
| author | Avi Levkovich <avi@twine-s.com> | 2020-08-26 11:04:13 +0300 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2020-08-26 11:04:13 +0300 |
| commit | ce95311e3ca782c405591d12da7cf4366c8dcfb2 (patch) | |
| tree | fecccbd960dacbca0384c830956aad3c8c17f320 /Software/Embedded_SW/Embedded/Drivers | |
| parent | 089997906dccbde0028b7fc81088739ca8c6d25e (diff) | |
| download | Tango-ce95311e3ca782c405591d12da7cf4366c8dcfb2.tar.gz Tango-ce95311e3ca782c405591d12da7cf4366c8dcfb2.zip | |
Add support of WHS fan controller with slave address 0x5E .
Add option to read 2 more dancers for 4 winders demo
Diffstat (limited to 'Software/Embedded_SW/Embedded/Drivers')
7 files changed, 135 insertions, 29 deletions
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.c index 96598ef31..782949fd0 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.c @@ -14,6 +14,8 @@ #include "PMR/Hardware/HardwareDancerType.pb-c.h" +static short DummyBusy = 0; + static FpgaDancerMap_t FpgaRotEncMap[NUM_OF_ROTENC] = { @@ -22,10 +24,19 @@ static FpgaDancerMap_t FpgaRotEncMap[NUM_OF_ROTENC] = {&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) { @@ -36,7 +47,11 @@ uint8_t FPGA_SSI_Transmit(HardwareDancerType _RotEncId) 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; diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.h index cec4c4de3..d51576778 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.h @@ -51,9 +51,16 @@ typedef struct } FpgaDancerMap_t; + + +#ifdef FOUR_WINDERS +uint8_t FPGA_SSI_Transmit(Dancers_4_Winders _RotEncId); +uint8_t FPGA_SSI_Receive(Dancers_4_Winders _RotEncId); +#else uint8_t FPGA_SSI_Transmit(HardwareDancerType _RotEncId); uint8_t FPGA_SSI_Receive(HardwareDancerType _RotEncId); +#endif uint8_t FPGA_SSI_Speed_Sensor_Transnit(); diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c index 7c854fe8b..6cb64262c 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c @@ -12,7 +12,7 @@ #include <Drivers/I2C_Communication/WHS_Card/IO_Extender_Ports_TCA9555/WHS_IO.h> #include <Drivers/I2C_Communication/I2C_Task.h> -FAN_DRIVER_INFO Fan_Driver_Info[maxFAN-1]; +FAN_DRIVER_INFO Fan_Driver_Info[maxFAN]; #define NUM_OF_FAN_DRIVER 3 @@ -24,6 +24,8 @@ uint8_t Fan_Mux_Channel = UNKNOWN; bool Select_WHS_Fan_Mux_Channel(WHS_fan_num fan_number); uint8_t Select_Fan_Driver(WHS_fan_num fan_number); +uint8_t I2CFanViaSwitch_ADD_Buf[maxFAN] = {UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN}; + uint8_t SmallFansCfg = 200; uint8_t LargeFansCfg = 200; /* @@ -60,8 +62,8 @@ uint8_t Select_Fan_Driver(WHS_fan_num fan_number) case FAN6: fan_driver = 2; break; - //default: - + default: + break; } return fan_driver; } @@ -113,8 +115,8 @@ bool WHS_set_fan_speed(WHS_fan_num fan_number, uint8_t fan_speed) fan_driver = Select_Fan_Driver(fan_number); status = Select_Main_WHS_Mux_Channel(); Select_WHS_Fan_Mux_Channel(fan_number); - status |= D_Fan_Setting(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADDRESS, !(fan_number & 0x01), fan_speed); - D_EMC2302_Write[fan_driver].Reg.Fan_Setting[!(fan_number & 0x01)] = fan_speed; + status |= D_Fan_Setting(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADD_Buf[fan_number], (fan_number & 0x01), fan_speed); + D_EMC2302_Write[fan_driver].Reg.Fan_Setting[(fan_number & 0x01)] = fan_speed; return status; } @@ -128,8 +130,8 @@ bool WHS_Read_fan_tach(WHS_fan_num fan_number) status = Select_Main_WHS_Mux_Channel(); Select_WHS_Fan_Mux_Channel(fan_number); - status |= D_Fan_Read_Tacho_HIGH(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADDRESS, !(fan_number & 0x01), &(D_EMC2302_Read[fan_driver].Reg.TACHReading_High[!(fan_number & 0x01)])); - status |= D_Fan_Read_Tacho_LOW (I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADDRESS, !(fan_number & 0x01), &(D_EMC2302_Read[fan_driver].Reg.TACHReading_Low [!(fan_number & 0x01)])); + status |= D_Fan_Read_Tacho_HIGH(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADD_Buf[fan_number], (fan_number & 0x01), &(D_EMC2302_Read[fan_driver].Reg.TACHReading_High[(fan_number & 0x01)])); + status |= D_Fan_Read_Tacho_LOW (I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADD_Buf[fan_number], (fan_number & 0x01), &(D_EMC2302_Read[fan_driver].Reg.TACHReading_Low [(fan_number & 0x01)])); return status; } @@ -140,8 +142,8 @@ uint16_t WHS_Get_fan_tach(WHS_fan_num fan_number) uint8_t fan_driver = 0; fan_driver = Select_Fan_Driver(fan_number); - tach = D_EMC2302_Read[fan_driver].Reg.TACHReading_High[!(fan_number & 0x01)]; - tach = ((tach << 8) | D_EMC2302_Read[fan_driver].Reg.TACHReading_Low[!(fan_number & 0x01)]); + tach = D_EMC2302_Read[fan_driver].Reg.TACHReading_High[(fan_number & 0x01)]; + tach = ((tach << 8) | D_EMC2302_Read[fan_driver].Reg.TACHReading_Low[(fan_number & 0x01)]); return tach; } @@ -170,22 +172,23 @@ bool WHS_Get_fan_ALERT(WHS_fan_num fan_number, bool *fan_alert) switch (fan_number) { - case 0: - fan_number_bit = FAN_BREAK; - break; - case 1: - case 2: +// case noFAN: +// fan_number_bit = FAN_BREAK; +// break; + case FAN1: + case FAN2: fan_number_bit = FAN_ALERT_12; break; - case 3: - case 4: + case FAN3: + case FAN4: fan_number_bit = FAN_ALERT_34; break; - case 5: - case 6: + case FAN5: + case FAN6: fan_number_bit = FAN_ALERT_56; break; default : + fan_number_bit = FAN_BREAK; status = ERROR; return status; } @@ -193,6 +196,38 @@ bool WHS_Get_fan_ALERT(WHS_fan_num fan_number, bool *fan_alert) return status; } +bool Fan_Status[] = {OK,OK,OK,OK,OK,OK}; + +uint8_t WHS_Check_Fan_Controller_Type(WHS_fan_num fan_number) +{ + uint8_t status = ERROR; + + if ( (I2CFanViaSwitch_ADD_Buf[fan_number] == UNKNOWN) && (( fan_number == FAN1) || ( fan_number == FAN3) || ( fan_number == FAN5))) + { + + I2CFanViaSwitch_ADD_Buf[fan_number] = 0x5C; + status = D_fan_productID (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADD_Buf[fan_number], &(Fan_Driver_Info[fan_number].Product_ID) ); + + if((Fan_Driver_Info[fan_number].Product_ID != 0x36) || (status != OK)) + { + I2CFanViaSwitch_ADD_Buf[fan_number] = 0x5E; + status = D_fan_productID (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADD_Buf[fan_number], &(Fan_Driver_Info[fan_number].Product_ID) ); + } + + if((Fan_Driver_Info[fan_number].Product_ID != 0x36) || (status != OK)) + { + I2CFanViaSwitch_ADD_Buf[fan_number] = 0x00; + ReportWithPackageFilter(WasteFilter,"unable to recognize the an controller", __FILE__,__LINE__, status, RpMessage, fan_number, 0); + status = ERROR; + } + + I2CFanViaSwitch_ADD_Buf[fan_number + 1] = I2CFanViaSwitch_ADD_Buf[fan_number]; + Fan_Driver_Info[fan_number + 1].Product_ID = Fan_Driver_Info[fan_number].Product_ID; + + } + return status; +} + bool init_WHS_fan() { @@ -246,11 +281,17 @@ bool init_WHS_fan() update = 0; } + + for (fan_number = FAN1 ; fan_number < maxFAN; fan_number++) { Select_WHS_Fan_Mux_Channel(fan_number); - status |= D_Fan_PWM_Output_Config(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADDRESS, !(fan_number & 0x01), PUSH_PULL ); - status |= D_Fan_Setting(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADDRESS, !(fan_number & 0x01), DEFAULT_FAN_SPEED);//FAN_SPEED_OFF + + Fan_Status[fan_number] = WHS_Check_Fan_Controller_Type(fan_number); + status |= Fan_Status[fan_number]; + + status |= D_Fan_PWM_Output_Config(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADD_Buf[fan_number], (fan_number & 0x01), PUSH_PULL ); + status |= D_Fan_Setting(I2C_ID_WHS_CARD ,I2CFanViaSwitch_ADD_Buf[fan_number], (fan_number & 0x01), DEFAULT_FAN_SPEED);//FAN_SPEED_OFF } @@ -266,9 +307,9 @@ bool Read_WHS_fan_info(WHS_fan_num fan_number) Select_Main_WHS_Mux_Channel(); Select_WHS_Fan_Mux_Channel(fan_number); - status |= D_fan_productID (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADDRESS, &(Fan_Driver_Info[fan_number-1].Product_ID) ); - status |= D_fan_manufactuerID(I2C_ID_WHS_CARD, I2CFanViaSwitch_ADDRESS, &(Fan_Driver_Info[fan_number-1].Manufactuere_ID)); - status |= D_fan_revision (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADDRESS, &(Fan_Driver_Info[fan_number-1].Revision) ); + status |= D_fan_productID (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADD_Buf[fan_number], &(Fan_Driver_Info[fan_number].Product_ID) ); + status |= D_fan_manufactuerID(I2C_ID_WHS_CARD, I2CFanViaSwitch_ADD_Buf[fan_number], &(Fan_Driver_Info[fan_number].Manufactuere_ID)); + status |= D_fan_revision (I2C_ID_WHS_CARD, I2CFanViaSwitch_ADD_Buf[fan_number], &(Fan_Driver_Info[fan_number].Revision) ); return status; } @@ -325,15 +366,15 @@ bool Test_WHS_Fan() { status = Read_WHS_fan_info(fan_number); - if (Fan_Driver_Info[fan_number-1].Manufactuere_ID != 0x5D) + if (Fan_Driver_Info[fan_number].Manufactuere_ID != 0x5D) { status|= ERROR; } - if (Fan_Driver_Info[fan_number-1].Product_ID != 0x36) + if (Fan_Driver_Info[fan_number].Product_ID != 0x36) { status|= ERROR; } - if (Fan_Driver_Info[fan_number-1].Revision != 0x80) + if (Fan_Driver_Info[fan_number].Revision != 0x80) { status|= ERROR; } @@ -363,3 +404,4 @@ bool Test_WHS_Fan() return status; } + diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h index c8a81a612..a15248866 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h @@ -48,7 +48,7 @@ typedef struct #define number_of_EMC2302 3 typedef enum { - noFAN = 0, + //noFAN = 0, FAN1 , FAN2 , FAN3 , @@ -58,6 +58,8 @@ typedef enum maxFAN }WHS_fan_num; +extern uint8_t I2CFanViaSwitch_ADD_Buf[maxFAN]; + typedef enum { FAN1chanel = 0, diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/WHS_data.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/WHS_data.h index 3d6bbc462..e0745ea35 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/WHS_data.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/WHS_data.h @@ -15,12 +15,14 @@ #define I2C_ID_WHS_CARD 0x03 #define I2C2_MAIN_MUX_TCA9548A_0xE0 0xE0 //WHS - SD1, SC1 + + typedef enum { I2CExp1_ADDRESS = 0x40, I2CExp2_ADDRESS = 0x42, I2CSwitch_ADDRESS = 0xE8, - I2CFanViaSwitch_ADDRESS = 0x5C, + //I2CFanViaSwitch_ADDRESS = 0x5C, I2CTemp1_ADDRESS = 0x80, I2CTemp2_ADDRESS = 0x82, I2CDAC_ADDRESS = 0x30, diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c index ae814a8cb..00ef10032 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c +++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c @@ -43,13 +43,22 @@ typedef struct // 24bit SSI_ENC SSI_enc; #ifndef HUNDRED_MICROSECONDS_DANCER_READ +#ifdef FOUR_WINDERS +uint32_t Control_Read_Dancer_Position(Dancers_4_Winders DancerId, uint32_t Parameter1) +#else uint32_t Control_Read_Dancer_Position(HardwareDancerType DancerId, uint32_t Parameter1) +#endif { return DANCER_ENC[DancerId].Position; //return SSI_enc.Position; } #endif + +#ifdef FOUR_WINDERS +uint32_t Read_Dancer_Position (Dancers_4_Winders DancerId) +#else uint32_t Read_Dancer_Position (HardwareDancerType DancerId) +#endif { #ifdef EVALUATION_BOARD uint32_t ENC_SSI_Data = 0; @@ -71,7 +80,11 @@ uint32_t Read_Dancer_Position (HardwareDancerType DancerId) return SSI_enc.Position; #else // must call FPGA_SSI_Transmit first! + #ifdef FOUR_WINDERS + Dancers_4_Winders Dancer_Id = (Dancers_4_Winders)DancerId;//to remove warning + #else HardwareDancerType Dancer_Id = (HardwareDancerType)DancerId;//to remove warning + #endif FPGA_SSI_Receive(Dancer_Id); FPGA_SSI_Transmit(Dancer_Id); return DANCER_ENC[Dancer_Id].Position; @@ -86,11 +99,20 @@ uint32_t Read_Dryer_ENC_Position () //REPORT_MSG(Dryer_ENC.Position,"Read_Dryer_ENC_Position"); return Dryer_ENC.Position; } +#ifdef FOUR_WINDERS +uint32_t Read_Dryer_Status(Dancers_4_Winders DancerId) +#else uint32_t Read_Dryer_Status(HardwareDancerType DancerId) +#endif { return Dryer_ENC.Gen_status; } +#ifdef FOUR_WINDERS +uint32_t Control_Read_Dryer_Position(Dancers_4_Winders DancerId, uint32_t Parameter1) +#else uint32_t Control_Read_Dryer_Position(HardwareDancerType DancerId, uint32_t Parameter1) +#endif + { return Dryer_ENC.Position; //return SSI_enc.Position; diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h index 3a1c3ad5b..f726baeb4 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h +++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h @@ -23,7 +23,23 @@ NUM_OF_ROTENC }RotEnc_t;*/ -#define NUM_OF_ROTENC (HARDWARE_DANCER_TYPE__RightDancer+1) +#ifdef FOUR_WINDERS + + typedef enum Dancers4Winders + { + HARDWARE_DANCER_0 = 0, + HARDWARE_DANCER_1 = 1, + HARDWARE_DANCER_2 = 2, + HARDWARE_DANCER_3 = 3, + HARDWARE_DANCER_4 = 4, + MAX_HARDWARE_DANCER + } Dancers_4_Winders; + + #define NUM_OF_ROTENC (MAX_HARDWARE_DANCER) +#else + #define NUM_OF_ROTENC (HARDWARE_DANCER_TYPE__RightDancer+1) +#endif + void SSI1_Init(); |
