aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Drivers
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2020-08-26 11:04:13 +0300
committerAvi Levkovich <avi@twine-s.com>2020-08-26 11:04:13 +0300
commitce95311e3ca782c405591d12da7cf4366c8dcfb2 (patch)
treefecccbd960dacbca0384c830956aad3c8c17f320 /Software/Embedded_SW/Embedded/Drivers
parent089997906dccbde0028b7fc81088739ca8c6d25e (diff)
downloadTango-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')
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.c15
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SSI_Comm.h7
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c94
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/WHS_data.h4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c22
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h18
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();