#ifndef INC_DRIVER_H_ #define INC_DRIVER_H_ //-------------------------------------------------------------------------------------------------------------------------- #define ADDRES1_SET LL_GPIO_SetOutputPin(AD1_GPIO_Port,AD1_Pin) // ADDRESS1 SET #define ADDRES1_RESET LL_GPIO_ResetOutputPin(AD1_GPIO_Port,AD1_Pin) // ADDRESS1 RESET #define ADDRES2_SET LL_GPIO_SetOutputPin(AD2_GPIO_Port,AD2_Pin) // ADDRESS2 SET #define ADDRES2_RESET LL_GPIO_ResetOutputPin(AD2_GPIO_Port,AD2_Pin) // ADDRESS2 RESET #define ADDRES3_SET LL_GPIO_SetOutputPin(AD3_GPIO_Port,AD3_Pin) // ADDRESS3 SET #define ADDRES3_RESET LL_GPIO_ResetOutputPin(AD3_GPIO_Port,AD3_Pin) // ADDRESS3 RESET #define ADDRES4_SET LL_GPIO_SetOutputPin(AD4_GPIO_Port,AD4_Pin) // ADDRESS4 SET #define ADDRES4_RESET LL_GPIO_ResetOutputPin(AD4_GPIO_Port,AD4_Pin) // ADDRESS4 RESET #define ADDRES5_SET LL_GPIO_SetOutputPin(AD5_GPIO_Port,AD5_Pin) // ADDRESS5 SET #define ADDRES5_RESET LL_GPIO_ResetOutputPin(AD5_GPIO_Port,AD5_Pin) // ADDRESS5 RESET #define ADDRES6_SET LL_GPIO_SetOutputPin(AD6_GPIO_Port,AD6_Pin) // ADDRESS6 SET #define ADDRES6_RESET LL_GPIO_ResetOutputPin(AD6_GPIO_Port,AD6_Pin) // ADDRESS6 RESET #define ADDRES7_SET LL_GPIO_SetOutputPin(AD7_GPIO_Port,AD7_Pin) // ADDRESS7 SET #define ADDRES7_RESET LL_GPIO_ResetOutputPin(AD7_GPIO_Port,AD7_Pin) // ADDRESS7 RESET #define ADDRES8_SET LL_GPIO_SetOutputPin(AD8_GPIO_Port,AD8_Pin) // ADDRESS8 SET #define ADDRES8_RESET LL_GPIO_ResetOutputPin(AD8_GPIO_Port,AD8_Pin) // ADDRESS8 RESET #define ADDRES9_SET LL_GPIO_SetOutputPin(AD9_GPIO_Port,AD9_Pin) // ADDRESS9 SET #define ADDRES9_RESET LL_GPIO_ResetOutputPin(AD9_GPIO_Port,AD9_Pin) // ADDRESS9 RESET #define ADDRES10_SET LL_GPIO_SetOutputPin(AD10_GPIO_Port,AD10_Pin) // ADDRESS10 SET #define ADDRES10_RESET LL_GPIO_ResetOutputPin(AD10_GPIO_Port,AD10_Pin) // ADDRESS10 RESET #define ADDRES11_SET LL_GPIO_SetOutputPin(AD11_GPIO_Port,AD11_Pin) // ADDRESS11 SET #define ADDRES11_RESET LL_GPIO_ResetOutputPin(AD11_GPIO_Port,AD11_Pin) // ADDRESS11 RESET #define ADDRES12_SET LL_GPIO_SetOutputPin(AD12_GPIO_Port,AD12_Pin) // ADDRESS12 SET #define ADDRES12_RESET LL_GPIO_ResetOutputPin(AD12_GPIO_Port,AD12_Pin) // ADDRESS12 RESET #define ADDRES13_SET LL_GPIO_SetOutputPin(AD13_GPIO_Port,AD13_Pin) // ADDRESS13 SET #define ADDRES13_RESET LL_GPIO_ResetOutputPin(AD13_GPIO_Port,AD13_Pin) // ADDRESS13 RESET #define ADDRES14_SET LL_GPIO_SetOutputPin(AD14_GPIO_Port,AD14_Pin) // ADDRESS14 SET #define ADDRES14_RESET LL_GPIO_ResetOutputPin(AD14_GPIO_Port,AD14_Pin) // ADDRESS14 RESET #define ADDRES15_SET LL_GPIO_SetOutputPin(AD15_GPIO_Port,AD15_Pin) // ADDRESS15 SET #define ADDRES15_RESET LL_GPIO_ResetOutputPin(AD15_GPIO_Port,AD15_Pin) // ADDRESS15 RESET //-------------------------------------------------------------------------------------------------------------------------- #define DATA0_SET LL_GPIO_SetOutputPin(DATA0_GPIO_Port,DATA0_Pin) // DATA0 SET #define DATA0_RESET LL_GPIO_ResetOutputPin(DATA0_GPIO_Port,DATA0_Pin) // DATA0 RESET #define DATA1_SET LL_GPIO_SetOutputPin(DATA1_GPIO_Port,DATA1_Pin) // DATA1 SET #define DATA1_RESET LL_GPIO_ResetOutputPin(DATA1_GPIO_Port,DATA1_Pin) // DATA1 RESET #define DATA2_SET LL_GPIO_SetOutputPin(DATA2_GPIO_Port,DATA2_Pin) // DATA2 SET #define DATA2_RESET LL_GPIO_ResetOutputPin(DATA2_GPIO_Port,DATA2_Pin) // DATA2 RESET #define DATA3_SET LL_GPIO_SetOutputPin(DATA3_GPIO_Port,DATA3_Pin) // DATA3 SET #define DATA3_RESET LL_GPIO_ResetOutputPin(DATA3_GPIO_Port,DATA3_Pin) // DATA3 RESET #define DATA4_SET LL_GPIO_SetOutputPin(DATA4_GPIO_Port,DATA4_Pin) // DATA4 SET #define DATA4_RESET LL_GPIO_ResetOutputPin(DATA4_GPIO_Port,DATA4_Pin) // DATA4 RESET #define DATA5_SET LL_GPIO_SetOutputPin(DATA5_GPIO_Port,DATA5_Pin) // DATA5 SET #define DATA5_RESET LL_GPIO_ResetOutputPin(DATA5_GPIO_Port,DATA5_Pin) // DATA5 RESET #define DATA6_SET LL_GPIO_SetOutputPin(DATA6_GPIO_Port,DATA6_Pin) // DATA6 SET #define DATA6_RESET LL_GPIO_ResetOutputPin(DATA6_GPIO_Port,DATA6_Pin) // DATA6 RESET #define DATA7_SET LL_GPIO_SetOutputPin(DATA7_GPIO_Port,DATA7_Pin) // DATA7 SET #define DATA7_RESET LL_GPIO_ResetOutputPin(DATA7_GPIO_Port,DATA7_Pin) // DATA7 RESET #define DATA8_SET LL_GPIO_SetOutputPin(DATA8_GPIO_Port,DATA8_Pin) // DATA8 SET #define DATA8_RESET LL_GPIO_ResetOutputPin(DATA8_GPIO_Port,DATA8_Pin) // DATA8 RESET #define DATA9_SET LL_GPIO_SetOutputPin(DATA9_GPIO_Port,DATA9_Pin) // DATA9 SET #define DATA9_RESET LL_GPIO_ResetOutputPin(DATA9_GPIO_Port,DATA9_Pin) // DATA9 RESET #define DATA10_SET LL_GPIO_SetOutputPin(DATA10_GPIO_Port,DATA10_Pin) // DATA10 SET #define DATA10_RESET LL_GPIO_ResetOutputPin(DATA10_GPIO_Port,DATA10_Pin) // DATA10 RESET #define DATA11_SET LL_GPIO_SetOutputPin(DATA11_GPIO_Port,DATA11_Pin) // DATA11 SET #define DATA11_RESET LL_GPIO_ResetOutputPin(DATA11_GPIO_Port,DATA11_Pin) // DATA11 RESET #define DATA12_SET LL_GPIO_SetOutputPin(DATA12_GPIO_Port,DATA12_Pin) // DATA12 SET #define DATA12_RESET LL_GPIO_ResetOutputPin(DATA12_GPIO_Port,DATA12_Pin) // DATA12 RESET #define DATA13_SET LL_GPIO_SetOutputPin(DATA13_GPIO_Port,DATA13_Pin) // DATA13 SET #define DATA13_RESET LL_GPIO_ResetOutputPin(DATA13_GPIO_Port,DATA13_Pin) // DATA13 RESET #define DATA14_SET LL_GPIO_SetOutputPin(DATA14_GPIO_Port,DATA14_Pin) // DATA14 SET #define DATA14_RESET LL_GPIO_ResetOutputPin(DATA14_GPIO_Port,DATA14_Pin) // DATA14 RESET #define DATA15_SET LL_GPIO_SetOutputPin(DATA15_GPIO_Port,DATA15_Pin) // DATA15 SET #define DATA15_RESET LL_GPIO_ResetOutputPin(DATA15_GPIO_Port,DATA15_Pin) // DATA15 RESET //-------------------------------------------------------------------------------------------------------------------------- #define AEN_SET LL_GPIO_ResetOutputPin(AEN_GPIO_Port,AEN_Pin) // AEN SET #define AEN_RESET LL_GPIO_SetOutputPin(AEN_GPIO_Port,AEN_Pin) // AEN RESET #define WRN_SET LL_GPIO_ResetOutputPin(WRN_GPIO_Port,WRN_Pin) // WRN SET #define WRN_RESET LL_GPIO_SetOutputPin(WRN_GPIO_Port,WRN_Pin) // WRN RESET #define RDN_SET LL_GPIO_ResetOutputPin(RDN_GPIO_Port,RDN_Pin) // RDN SET #define RDN_RESET LL_GPIO_SetOutputPin(RDN_GPIO_Port,RDN_Pin) // RDN RESET #define PWRDN_ON LL_GPIO_ResetOutputPin(PWRDN_GPIO_Port,PWRDN_Pin) // POWER DOWN ON #define PWRDN_OFF LL_GPIO_SetOutputPin(PWRDN_GPIO_Port,PWRDN_Pin) // POWER DOWN OFF #define RSTN_ON LL_GPIO_ResetOutputPin(RSTN_GPIO_Port,RSTN_Pin) // RESET ON #define RSTN_OFF LL_GPIO_SetOutputPin(RSTN_GPIO_Port,RSTN_Pin) // RESET OFF #define BE0N_SET_0 LL_GPIO_ResetOutputPin(AD0_GPIO_Port,AD0_Pin) // BE0N SET #define BE0N_SET_1 LL_GPIO_SetOutputPin(AD0_GPIO_Port,AD0_Pin) // BE0N RESET #define BE1N_SET_0 LL_GPIO_ResetOutputPin(BHEN_GPIO_Port,BHEN_Pin) // BE1N SET #define BE1N_SET_1 LL_GPIO_SetOutputPin(BHEN_GPIO_Port,BHEN_Pin) // BE1N RESET //-------------------------------------------------------------------------------------------------------------------------- #define BANK0 0x00 #define BANK1 0x01 #define BANK2 0x02 #define BANK3 0x03 #define BANK32 0x20 void KSZ8841_Init(void); void KSZ8841_Mode_DataOUT(void); void KSZ8841_Mode_DataIN(void); void KSZ8841_SetAddr(uint16_t addr); uint16_t KSZ8841_Read_DataPins(void); void KSZ8841_Write_DataPins(uint16_t data); void KSZ8841_WriteBank(uint16_t bank); uint16_t KSZ8841_Read(uint16_t addr, uint16_t bank); void KSZ8841_Write(uint16_t addr, uint16_t bank, uint16_t data); #endif /* INC_DRIVER_H_ */ void KSZ8841_Init(void) { uint16_t receive_data=0; uint16_t rec_data[3]={0}; KSZ8841_SetAddr(0x00); KSZ8841_Mode_DataIN(); UART1SendStr ("Init KSZ8841"); PWRDN_OFF; RSTN_ON; LL_mDelay(200); RSTN_OFF; LL_mDelay(500); //Запись MAC KSZ8841_Write(0x00, BANK2, 0x0123); KSZ8841_Write(0x02, BANK2, 0x4567); KSZ8841_Write(0x04, BANK2, 0x89AB); //Чтение MAC rec_data[0]=KSZ8841_Read(0x0300, BANK2); rec_data[1]=KSZ8841_Read(0x0302, BANK2); rec_data[2]=KSZ8841_Read(0x0304, BANK2); } void KSZ8841_Write(uint16_t addr, uint16_t bank, uint16_t data) { KSZ8841_WriteBank(bank); RDN_RESET; WRN_RESET; KSZ8841_Mode_DataIN(); KSZ8841_SetAddr(addr); AEN_SET; LL_mDelay(1); KSZ8841_Write_DataPins(data); WRN_SET; LL_mDelay(1); WRN_RESET; KSZ8841_Write_DataPins(0x00); KSZ8841_Mode_DataIN(); KSZ8841_SetAddr(0x00); AEN_RESET; LL_mDelay(1); } uint16_t KSZ8841_Read(uint16_t addr, uint16_t bank) { uint16_t read_data=0; KSZ8841_WriteBank(bank); RDN_RESET; WRN_RESET; KSZ8841_Mode_DataIN(); KSZ8841_SetAddr(addr); AEN_SET; LL_mDelay(1); RDN_SET; LL_mDelay(1); read_data=KSZ8841_Read_DataPins(); RDN_RESET; LL_mDelay(1); AEN_RESET; return(read_data); } void KSZ8841_WriteBank(uint16_t bank) { RDN_RESET; WRN_RESET; KSZ8841_Mode_DataIN(); KSZ8841_SetAddr(0x0E); AEN_SET; LL_mDelay(1); KSZ8841_Write_DataPins(bank); WRN_SET; LL_mDelay(1); WRN_RESET; KSZ8841_Mode_DataIN(); KSZ8841_SetAddr(0x00); AEN_RESET; } void KSZ8841_SetAddr(uint16_t addr) { BE1N_SET_0; if((addr&0x01)==0x01) {BE0N_SET_1;} else {BE0N_SET_0;} if((addr&0x02)==0x02) ADDRES1_SET; else ADDRES1_RESET; if((addr&0x04)==0x04) ADDRES2_SET; else ADDRES2_RESET; if((addr&0x08)==0x08) ADDRES3_SET; else ADDRES3_RESET; if((addr&0x10)==0x10) ADDRES4_SET; else ADDRES4_RESET; ADDRES5_RESET; ADDRES6_RESET; ADDRES7_RESET; ADDRES8_SET; ADDRES9_SET; ADDRES10_RESET; ADDRES11_RESET; ADDRES12_RESET; ADDRES13_RESET; ADDRES14_RESET; ADDRES15_RESET; } void KSZ8841_Mode_DataIN(void) { LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DATA8_Pin|DATA9_Pin|DATA10_Pin|DATA11_Pin |DATA12_Pin|DATA13_Pin|DATA14_Pin|DATA15_Pin |DATA0_Pin|DATA1_Pin|DATA2_Pin|DATA3_Pin |DATA6_Pin|DATA7_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN; LL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = DATA4_Pin|DATA5_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN; LL_GPIO_Init(GPIOC, &GPIO_InitStruct); } uint16_t KSZ8841_Read_DataPins(void) { uint16_t read_data=0; KSZ8841_Mode_DataIN(); if(LL_GPIO_IsInputPinSet(DATA0_GPIO_Port,DATA0_Pin)==0x01) read_data|=0x01; if(LL_GPIO_IsInputPinSet(DATA1_GPIO_Port,DATA1_Pin)==0x01) read_data|=0x02; if(LL_GPIO_IsInputPinSet(DATA2_GPIO_Port,DATA2_Pin)==0x01) read_data|=0x04; if(LL_GPIO_IsInputPinSet(DATA3_GPIO_Port,DATA3_Pin)==0x01) read_data|=0x08; if(LL_GPIO_IsInputPinSet(DATA4_GPIO_Port,DATA4_Pin)==0x01) read_data|=0x10; if(LL_GPIO_IsInputPinSet(DATA5_GPIO_Port,DATA5_Pin)==0x01) read_data|=0x20; if(LL_GPIO_IsInputPinSet(DATA6_GPIO_Port,DATA6_Pin)==0x01) read_data|=0x40; if(LL_GPIO_IsInputPinSet(DATA7_GPIO_Port,DATA7_Pin)==0x01) read_data|=0x80; if(LL_GPIO_IsInputPinSet(DATA8_GPIO_Port,DATA8_Pin)==0x01) read_data|=0x100; if(LL_GPIO_IsInputPinSet(DATA9_GPIO_Port,DATA9_Pin)==0x01) read_data|=0x200; if(LL_GPIO_IsInputPinSet(DATA10_GPIO_Port,DATA10_Pin)==0x01) read_data|=0x400; if(LL_GPIO_IsInputPinSet(DATA11_GPIO_Port,DATA11_Pin)==0x01) read_data|=0x800; if(LL_GPIO_IsInputPinSet(DATA12_GPIO_Port,DATA12_Pin)==0x01) read_data|=0x1000; if(LL_GPIO_IsInputPinSet(DATA13_GPIO_Port,DATA13_Pin)==0x01) read_data|=0x2000; if(LL_GPIO_IsInputPinSet(DATA14_GPIO_Port,DATA14_Pin)==0x01) read_data|=0x4000; if(LL_GPIO_IsInputPinSet(DATA15_GPIO_Port,DATA15_Pin)==0x01) read_data|=0x8000; return(read_data); } void KSZ8841_Mode_DataOUT(void) { LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; LL_GPIO_ResetOutputPin(GPIOD, DATA8_Pin|DATA9_Pin|DATA10_Pin|DATA11_Pin |DATA12_Pin|DATA13_Pin|DATA14_Pin|DATA15_Pin |DATA0_Pin|DATA1_Pin|DATA2_Pin|DATA3_Pin |DATA6_Pin|DATA7_Pin); LL_GPIO_ResetOutputPin(GPIOC,DATA4_Pin|DATA5_Pin); GPIO_InitStruct.Pin = DATA8_Pin|DATA9_Pin|DATA10_Pin|DATA11_Pin |DATA12_Pin|DATA13_Pin|DATA14_Pin|DATA15_Pin |DATA0_Pin|DATA1_Pin|DATA2_Pin|DATA3_Pin |DATA6_Pin|DATA7_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = DATA4_Pin|DATA5_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOC, &GPIO_InitStruct); } void KSZ8841_Write_DataPins(uint16_t data) { KSZ8841_Mode_DataOUT(); if((data&0x01)==0x01) DATA0_SET; else DATA0_RESET; if((data&0x02)==0x02) DATA1_SET; else DATA1_RESET; if((data&0x04)==0x04) DATA2_SET; else DATA2_RESET; if((data&0x08)==0x08) DATA3_SET; else DATA3_RESET; if((data&0x10)==0x10) DATA4_SET; else DATA4_RESET; if((data&0x20)==0x20) DATA5_SET; else DATA5_RESET; if((data&0x40)==0x40) DATA6_SET; else DATA6_RESET; if((data&0x80)==0x80) DATA7_SET; else DATA7_RESET; if((data&0x100)==0x100) DATA8_SET; else DATA8_RESET; if((data&0x200)==0x200) DATA9_SET; else DATA9_RESET; if((data&0x400)==0x400) DATA10_SET; else DATA10_RESET; if((data&0x800)==0x800) DATA11_SET; else DATA11_RESET; if((data&0x1000)==0x1000) DATA12_SET; else DATA12_RESET; if((data&0x2000)==0x2000) DATA13_SET; else DATA13_RESET; if((data&0x4000)==0x4000) DATA14_SET; else DATA14_RESET; if((data&0x8000)==0x8000) DATA15_SET; else DATA15_RESET; }